在 Vim 中使用 Gtags 进行代码导航

Gtags 是什么?

Gtags 是 GNU Global 软件包中的一个程序,因为 GNU Global 中最常用的一个程序就是 Gtags,因此如果没有特别说明,我就用 Gtags 代指 GNU Global。GNU Global 是 GNU 项目组开发的类似于 Ctags 的代码导航工具,可以为 Vim, Emacs 等添加代码跳转功能。GNU Global 内置的解析器支持 C, C++, Java, PHP, ASM, YACC 六种语言,通过 exuberant-ctags 扩展可以支持 Ctags 支持的所有语言。

关于 Gtags 与 Ctags 等其它相关工具的比较可以戳这里 Comparison-with-Similar-Tools

GNU Global 里面最常用的两个程序是 gtags gtags-cscope。分别用来替代 ctags cscope

Gtags 和 Global 的使用

和 Ctags 一样,要使用 Gtags,也需要对源代码进行索引,生成 tags 文件。

生成 tags 文件

直接在源代码的目录里运行 gtags 便会自动进行索引,索引完成后将会生成 3 个文件:

  • GTAGS:所有关键字定义的相关信息

  • GRTAGS:所有关键字被引用的相关信息

  • GPATH:源代码中每个文件的信息。

生成的三个文件均是 Berkeley DB 文件,所以直接 cat 将会是乱码。使用 gtags --dump 可以查看文件的具体内容。比如查看 GPATH 文件的内容

如果一个文件被更新了,需要更新 TAGS 文件时,可以使用 --single-update 更新一个文件的 TAGS。

1 $ gtags --single-update file

使用 global 查询定义和引用信息

使用 Gtags 生成索引文件之后,可以使用 global 程序使用索引文件查询定义和引用信息。

较常使用的命令

1 $ # 查询 sdsnewlen 的定义的文件
2 $ global sdsnewlen
3 
4 $ # 列出所有以 sds 开头的变量或文件或类型
5 $ global -c sds
6 
7 $ # 列出文件 sds.c 中定义的所有变量,文件或类型
8 $ global -f sds.c

较常使用的选项

  • -t 输出时使用标准的 ctags 格式

  • -x 输出时使用 ctags cxref 格式

  • -i 查询时不区分大小写

使用 Exuberant-ctags 扩展 Gtags

前面说到过,Gtags 内置的解析器只支持上面列出的 6 中语言,但是我们可以使用 exuberant-ctags 进行扩展,使其支持 ctags 支持的所有语言。

编译 Gtags 的 exuberant-ctags 支持

要使 Gtags 能使用 exuberant-ctags 进行扩展,GNU Global 必须编译 exuberant-ctags 支持,如果默认是没有 exuberant-ctags 支持,可以手动编译。

手动编译 GNU Global 时可以在 ./configure 的后面手动加上 exuberant-ctags 支持

1 $ ./configure --with-exuberant-ctags=/usr/bin/exuberant-ctags

Gentoo 下可以使用 EXTRA_ECONF 变量自定义 ./configure 选项,使其支持 exuberant-ctags 扩展。

1 $ sudo EXTRA_ECONF='--with-exuberant-ctags=/usr/bin/exuberant-ctags' emerge -av global

使用 exuberant-ctags 作为 Gtags 的解析器

编译完 exuberant-ctags 支持之后,就可以使用 exuberant-ctags 作为 Gtags 的解析器了。有两种方法可以完成。

1 $ GTAGSLABEL='ctags' gtags
2 
3 $ gtags --gtagslabel ctags

都是利用 GTAGSLABEL 变量指定内部使用哪个解析器,预定义的 4 个 LABEL 可以在 /etc/gtags.conf 文件中找到,还可以手动添加解析器。

这样生成的 TAGS 文件便支持 26 种语言了。

在 Vim 中使用 Gtags

Vim 中使用 Gtags,可以安装 gtags.vim 插件,使用 Vundle 安装:

1 Plugin 'aceofall/gtags.vim'

然后设置 Vim 使用 gtagsgtags-cscope 替代自带的 ctagscscope

1 " cscope
2 set cscopetag                  " 使用 cscope 作为 tags 命令
3 set cscopeprg='gtags-cscope'   " 使用 gtags-cscope 代替 cscope
4 
5 " gtags
6 let GtagsCscope_Auto_Load = 1
7 let CtagsCscope_Auto_Map = 1
8 let GtagsCscope_Quiet = 1

之后就可以在 Vim 中体验代码乱跳的快感啦~~~

内置的 tags 跳转

使用 C-] 跳转到定义,使用 C-t 返回到上一个文件

Gtags

Vim 中使用 Gtags 可以提供命令行中 global 一样的查询接口,而且参数也是一样的,简单列举两个:

1 " 查询定义信息,这里光标可以手动输入要查询的关键词,直接按回车将会查询当前光标所在的单词,
2 :Gtags | " <- 这是光标
3 
4 " 查询引用信息
5 :Gtags -r | " <- 这也是

本文标题: 在 Vim 中使用 Gtags 进行代码导航

本文链接: https://blog.zhustec.me/posts/use-gtags-for-source-code-navigation-in-vim

发布时间: 2015-01-23T07:51:28+00:00

版权声明: 本文由 zhustec 原创 采用 CC BY-NC-ND 4.0 许可协议 转载请保留以上声明信息!