安装gutentag+ctags+gtags

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

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

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

一、vim-gutentags 安装

1.1 软件依赖

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

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

ctags安装

mac下
brew tap universal-ctags/universal-ctags
brew install --HEAD universal-ctags

ubuntu下
apt-get install ctags

源码安装
git clone https://github.com/universal-ctags/ctags

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

osx下gtags的回跳上一次是ctrl+t,进入定义是ctrl+]

其次,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安装HomeBrew以及解决Could not resolve host: raw.githubusercontent.com问题)安装vim-gutentags插件。vim-plug相比较Vundle,按需加载这点可以简化vim启动时间,而且Vundle已经三年没有更新。

在配置文件 ~/.vimrc 中增加配置项

Plugin 'ludovicchabant/vim-gutentags' 

后再在vim命令行模式下执行命令

 :PlugInstall 

即可完成vim-gutentags插件的安装。

1.3 另一个强大的搜索工具gtags

不用gtags前有如下几个问题:

1. 使用vimgrep有局限性,只能查找具体的文件,不能自动查找所有的子目录,而且不属于tags保存自动跳回上一次。

2. ctags查找函数的引用不方便。

安装完gtags(brew install global),ubuntu推荐源码安装

切记每次编译出现aclocal-1.15,需要重新下载

wget http://tamacom.com/global/global-6.6.2.tar.gz
tar xzvf global-6.6.2.tar.gz
cd global-6.6.2
./configure
make && make install

会自动安装gtags-cscope(一般不会用到,主要还是用Gtags)。

注意需要gtags-cscope.vim  gtags.vim放入~/.vim/plugin。

osx下gtags的回跳上一次是ctrl+shift+o,tab可以补全

主要命令如下:

01.Gtags func:查看定义处 02.Gtags -r func:查看引用处 03.Gtags -s text:查看未被数据库定义的tags

04.copen:打开quick fix显示窗口 05.cclose:关闭quick fix显示窗口 06.cn:下一项

07.cp:上一项 08.cl:列出查询到的相关项 09.ccN:到列表中第N个符号处

10.Gtags -g pattern:搜索pattern指定的字符串 11.Gtags -gie -pattern:-e选项可以用于搜索’-‘字符,但是基础搜索,没有元字符,-i选项忽略大小写,类似于grep的选项

12.GtagsCuorsor:取决于光标位置,要是在定义处,查询其引用,要是在引用处,跳转至其定义处,否则就是Gtags -s命令 13.Gtags -P text:查询包含text的路径名,Gtags -P后接/dir/为列出叫做dir目录下文件,后接\.h$列出所有的include文件

14.Gtags -f file:列出file里的符号,Gtags -f %则列出当前文件的符号

二、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 = ['.tags']

" 所生成的数据文件的名称 "
let g:gutentags_ctags_tagfile = '.tags'

" 同时开启 ctags 和 gtags 支持:
let g:gutentags_modules = []
if executable('ctags')
    let g:gutentags_modules += ['ctags']
endif
if executable('gtags-cscope') && executable('gtags')
    let g:gutentags_modules += ['gtags_cscope']
endif
" 将自动生成的 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 的参数,老的 Exuberant-ctags 不能有 --extra=+q,注意
let g:gutentags_ctags_extra_args = ['--fields=+niazS', '--extra=+q']
let g:gutentags_ctags_extra_args += ['--c++-kinds=+px']
let g:gutentags_ctags_extra_args += ['--c-kinds=+px']

" 如果使用 universal ctags 需要增加下面一行,老的 Exuberant-ctags 不能加下一行
let g:gutentags_ctags_extra_args += ['--output-format=e-ctags']

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

以及修改plugin/gutentags.vim 去除.git配置

所以,上面的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实现函数跳转

注意:修改YouCompleteMe不进行语法分析,为了跟ctags配套使用自动补全。YouCompleteMe的安装请看linux、osx学习和oh-my-zsh+vim配置、Vim solarized配置、在Mac、Linux 终端显示 Git 当前所在分支、安装 vim-plug_LETFLY'S LAB-CSDN博客

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值