在常规的使用ctags生成tag标签文件实现跳转的方式下,每次需要更新tags文件时都需要手工运行 ctags -R 生成当前项目所有源文件对应的tag标签文件。

当工程文件多、文件更新频繁时,上述生成tags文件的方法显得笨拙、低效。

得益于 Vim 8 提供的异步机制,vim插件vim-gutentags能够自动异步生成 tags 文件,当检测到同一个工程下面的文件有修改时,gutentags能自动增量更新对应工程的 tags 文件,而不用全部重新生成tags文件,是一个非常高效的tags生成工具。

1.1 软件依赖

vim-gutentags的本质仍然是使用ctags生成tag标签来实现函数跳转等功能,只是在ctags的基础上进行了封装和简化(具体封装方式在后文有简单分析),方便用户在vim中使用。

由于vim-gutentags依赖ctags工具,因此在使用vim-gutentags插件的系统中必须安装ctags软件,否则会报错"Excutable 'ctags' can't be found."。

关于ctags的介绍和安装方法,可以参考vim教程网上的文章Vim使用ctags实现函数跳转。

其次,vim-gutentags需要在vim8.0以上版本才能正常工作,因为vim-gutentags实现的是增量更新tags的方式,依赖于vim8提供的异步机制。

在低于vim8.0的版本是运行vim-gutentags插件,会报错"this plugin requires the job API from Vim8 or Neovim"。

关于vim8的编译和安装,可以参考vim教程网上的文章vim安装教程。

1.2 gutentags安装方法

本文介绍使用插件管理器vim-plug安装vim-gutentags插件。

在配置文件 ~/.vimrc 中增加配置项 Plug 'ludovicchabant/vim-gutentags' 后再在vim命令行模式下执行命令 :PlugInstall 即可完成vim-gutentags插件的安装。

二、vim-gutentags配置介绍和原理分析

vim-gutentags插件的基本工作原理可以这么理解:首先确定vim当前打开的文件是否需要自动生成tags标签,若需要则通过某种方式确定tag文件的路径,再基于tag标签文件完成函数跳转、结构体定义跳转等功能。

因此,vim-gutentags需要确定是否需要生成tags标签文件,又需要告诉ctags软件自身生成的tags文件的具体路径信息 (因为从Vim使用ctags实现函数跳转一文已知,默认情况下,生成的tags文件必须在vim运行的当前目录才能在vim里面正确跳转)。

2.1 gutentags配置

为了提供上述信息给vim-gutentags,安装完gutentags后,需要在vim配置文件中增加以下必要的配置项。

" gutentags搜索工程目录的标志,碰到这些文件/目录名就停止向上一级目录递归 "
let g:gutentags_project_root = ['.root', '.svn', '.git', '.project']" 所生成的数据文件的名称 "
let g:gutentags_ctags_tagfile = '.tags'" 将自动生成的 tags 文件全部放入 ~/.cache/tags 目录中,避免污染工程目录 "
let s:vim_tags = expand('~/.cache/tags')
let g:gutentags_cache_dir = s:vim_tags
" 检测 ~/.cache/tags 不存在就新建 "
if !isdirectory(s:vim_tags)silent! call mkdir(s:vim_tags, 'p')
endif" 配置 ctags 的参数 "
let g:gutentags_ctags_extra_args = ['--fields=+niazS', '--extra=+q']
let g:gutentags_ctags_extra_args += ['--c++-kinds=+pxI']
let g:gutentags_ctags_extra_args += ['--c-kinds=+px']

  • 变量 gutentags_project_root 是vim-gutentags提供的用于搜索工程目录的标志,gutentags插件启动后,会从文件当前路径递归往上查找 gutentags_project_root 中指定的文件或目录名,直到第一次找到对应目标文件或目录名停止。若没有找到 gutentags_project_root 变量指定的文件或目录名,则gutentags不会生成tag文件。
  • 变量 gutentags_ctags_tagfilegutentags_cache_dir 分别用于告诉ctags要使用的tag文件目录tag文件名后缀,tag文件名的生成规则默认是根据生成tag文件的工程绝对路径按 - 分割而成。
  • 变量 gutentags_ctags_extra_args 用于配置ctags生成tag标签的参数,具体参数含义可参考文章ctags参数介绍

所以,上面的gutentags配置指定了从当前路径向上递归查找是否有 .root.svn.git.project 等标志性文件来确定当前文档所属的工程目录;而ctags要使用的tag标签文件的路径为 ~/.cache/tags,文件后缀为 .tags

ctags 软件需要使用命令 :set tags+=tags文件路径 显式地指定tag文件路径,从文件 ~/plugged/vim-gutentags/autoload/gutentags/ctags.vim 可以看出,gutentags执行了命令 setlocal tags+= 来添加变量 gutentags_ctags_tagfile 指定的tag文件到局部 tags 搜索列表中。

2.2 gutentags示例

安装了gutentags并且进行了上面的设置后,平时打开vim编辑文件基本感觉不到 tags 文件的生成过程了,只要文件修改过,gutentags 都在后台默默分析是否需要更新数据文件,还会帮你:setlocal tags+=... 添加到局部 tags 搜索列表中。得益于 Vim 8 的异步机制,你可以任意随时使用 ctags 相关功能,并且数据库都是最新的。

就像下面的vim视频教程一样,假设已经在vim配置文件中添加了上面的配置项,在当前目录新建文件 .project 后再打开当前目录下的任意文件,再退出vim后可以看到,gutentags已经为当前目录生成了tags文件 ~/.cache/tags/home-vim-vim.ink-libevent-.tags

需要注意的是,gutentags 需要靠上面定义的 gutentags_project_root 判断文件所在的工程,如果一个文件没有保存在包含 .git.svn.root等 定义在 gutentags_project_root 中的文件,gutentags就不会为该文件生成 tags。

想要避免的话,你可以在你的野文件目录中放一个名字为 .root 的空白文件,主动告诉 gutentags 这里就是工程目录。

2.3 基于gutentags实现跳转

在为当前目录生成tags文件后,可以通过按键 Ctrl + ] 跳转到对应的定义位置,再使用命令 Ctrl + o 回退到原来的位置。关于跳转的具体应用,可以参考Vim使用ctags实现函数跳转

另外,建议多使用 Ctrl - W + ] 用新窗口打开并查看光标下符号的定义,或者 Ctrl -W } 使用 preview 窗口预览光标下符号的定义。

PS:本文首发于我的个人博客:Vim自动生成tags插件vim-gutentags安装和自动跳转方法-Vim插件(10),部分内容参考了 @韦易笑 的回答,感谢。

vim 插件_Vim自动生成tags插件vim-gutentag使用方法相关推荐

  1. java代码自动生成的插件_如何使用插件生成自定义Java 8代码

    java代码自动生成的插件 大多数程序员讨厌的一件事就是编写样板代码. 无休止的时间花费在设置实体类和配置数据库连接上. 为了避免这种情况,您可以让Speedment Open Source之类的程序 ...

  2. Mybatis自动生成代码插件generator

    Mybatis自动生成代码插件generator 1.pom maven依赖 <dependencies><dependency><groupId>org.myba ...

  3. 自定义maven插件:自动生成API的word文档

    继上次开发完Maven插件开发:根据库表生成实体类&根据实体类生成库表之后,博主对开发maven插件喜爱得一塌糊涂.这不,今天给大家带来了<自定义maven插件:自动生成API的word ...

  4. php 自动生成查询密码,php自动生成新密码的两种方法

    php自动生成新密码的两种方法,方法一采用的是随机种子,方法是乱序数组,异曲同工吧. 有需要的朋友可以参考下. 方法1: 代码示例: /* * php自动生成新密码自定义函数 适用环境: PHP5.2 ...

  5. 【Groovy】Groovy 方法调用 ( Java 类成员及 setter 和 getter 方法设置 | Groovy 类自动生成成员的 getter 和 setter 方法 )

    文章目录 一.Java 类成员及 setter 和 getter 方法设置 二.Groovy 类自动生成成员的 getter 和 setter 方法 一.Java 类成员及 setter 和 gett ...

  6. java sap总账凭证接口_SAP系统接口自动生成会计凭证且无需记账码的方法与流程...

    本发明涉及sap系统接口自动生成会计凭证且无需记账码的方法,属于企业信息化管理技术领域. 背景技术: 在企业信息化管理领域,sap系统接口有着非常重要的意义,它担当着sap系统与其他信息系统的桥梁功能 ...

  7. vim插件自动补齐_VIM自动补全插件:deoplete

    Nvim用的是Shougo开发的NCM,但是在VIM 8+就要用同一个作者开发的Deoplete. 注意:这里只讲怎么给vim8安装. 安装 第一步:安装所有依赖 # 安装VIM 8 # .... # ...

  8. Vim中安装自动补全插件YouCompleteMe

    前言 自动补全:YouCompleteMe可以说是Vim中最好用的插件了,但是它的安装也可以说的上是Vim中最难的一个了.往往会出现各种错误,在还没有享受到这个插件给我们带来的快感时就会被安装的各种错 ...

  9. Microsoft Visual Studio Learning Pack 自动生成流程图插件(转)

    最近写文档,要贴流程图,自己画太烦,就到网上去找自动生成流程图的软件,结果知道了这个叫 Microsoft Visual Studio Learning Pack 的插件,用它来生成函数的流程图,感觉 ...

最新文章

  1. 【经验分享】如何优雅的在 Microsoft word中插入代码
  2. 废掉一个程序员最好的方法,让他忙碌着,忙碌到没时间思考
  3. 简约代码表白_JS实现520 表白简单代码
  4. 基于Echarts的HTML5 Canvas折线图柱状图DEMO演示
  5. TCP/IP协议网络模型
  6. 【openjudge】【字符串+模拟】1777:文件结构“图”
  7. java 编写浏览器_用Java自己写一个浏览器 —— JavaFX 入门
  8. 微信小程序怎么设置服务器上,如何为微信小程序设置服务器地址?-微信小程序服务器诗...
  9. mantis linux 安装,linux安装mantis详细步骤
  10. 如何在win7下安装XP系统?
  11. 根号3表白html,根号三的那句情话
  12. 隐秘的度假地_如何避免花太多钱去度假
  13. 三菱触摸屏怎么改时间_三菱触摸屏时钟设置步骤
  14. 关于VM虚拟机一启动就会使电脑重启的问题
  15. 微信小程序:javascript调用另一个js文件的函数
  16. c++ struct 中定义函数
  17. 满分的一份软件测试工程师简历,凭什么?
  18. c语言中shift的作用,Shift是什么意思?Shift键的功能及作用有哪些?
  19. Spring Boot Redis 实现分布式锁,真香
  20. 基于STM32单片机的天然气甲烷硫化氢气体检测仪原理图PCB

热门文章

  1. 三线压力传感器原理_弹性式压力表、弹簧管压力表、压阻式压力传感器的原理、选型、安装...
  2. 爬虫的另一工具splash挑战selenium
  3. scrapy中response的方法
  4. 寒冬中的半个月前端面试
  5. WordPress开发之WP Custom Register Login插件试用
  6. Unity镜子效果的实现(无需镜子Shader)
  7. 用DHCP实现网关配置和DNS解析
  8. 修改Eclipse/MyEclipse项目的默认编码
  9. 不藏私分享五個線上自學平台
  10. 实现点击下载文件的几种方法