vim 的 tags 模块 与 ctags【转】

(转自:https://www.cnblogs.com/misspy/p/3832838.html)

 

1. 概述

一般来说,在代码中跳转,离不开 ctags。

实际上,vim 中代码跳转是由 vim tags 模块完成的,tags 模块依赖于 tags 文件。

ctags(Generate tag files for source code) 是产生 tags 文件的。

tags 文件只包含了函数、类、变量的定义的信息,而没有包含使用信息。

如果要知道一个函数都在什么地方使用过,需要使用 cscope。

2. tags 文件的生成与更新

ctags 默认是不会自动生成 ctags 文件的,常用的 3 个生成命令如下:

$ ctags *
$ ctags -R
$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
  • -R: 循环生成子目录的 tags
  • *: 当前目录下的所有文件,不递归
  • –c++-kinds=+px : 记录 c++ 文件中的函数声明和各种外部和前向声明
  • –fields=+iaS : ctags 要求描述的信息,其中i表示如果有继承,则标识出父类;a 表示如果元素是类成员的话,要标明其调用权限(即是 public 还是 private);S 表示如果是函数,则标识函数的 signature。
  • –extra=+q: 强制要求ctags做如下操作—如果某个语法元素是类的一个成员,ctags默认会给其记录一行,可以要求ctags对同一个语法元素再记一行,这样可以保证在VIM中多个同名函数可以通过路径不同来区分。
  • ->ctags默认生成的索引文件只包含了对C语言的语法分析, 如果你需要ctags支持对C++语法分析. 需要使用下面的命令:

      ctags -R --c++-kinds=+p --fields=+iaS --extra=+q

      ->如果你在C语言编写的代码中使用上面提到的C++命令生成tags, 那么你将惊讶的发现, 当你希望通过ctags跳转到光标下函数定义的地方的时候, vim总是跳转到这个函数定义的地方, 原因是ctags的C++命令增加了额外的语法分析以便支持C++更加复杂的语法结构, 这种额外的语法分析用在C语言中的时候就会出现跳转默认定位到函数声明的地方.

3. 常见功能与快捷键

详细的说明,见 vim 的 tags 帮助文档。

:help tags

命令、快捷键、功能描述如下:

  • CTRL+]        :tag tagname     跳转到定义处
  • CTRL-W ]     :stag tagname    新窗口中打开并跳转到定义处。split 后执行  tag tagname
  • CTRL+T                               CTRL+] 的反操作,向回跳转。类似 CTRL+o,区别在于,CTRL+o 的跳转不局限于 CTRL+] 构成的调用树。

对于存在多个匹配的 tag(如, 在 .h 和  .cpp 中都声明或者定义的方法名):

  • :ts[elect]                 列出所有匹配的 tag
  • :[count]tp[revious]  跳转至前 count 个 tag 处。
  • :[count]tn[ext]        跳转至后 count 个 tag 处。

4. Vim + ctags 配置

实现vim对tags的自动递归查找其实很简单, 因为vim已经实现了这个功能, 只是默认没有开启. 在vimrc添加下面两行配置, 就会是见证奇迹的时刻:

  set autochdir
  set tags=tags;

  set autochdir表示自动切换目录的意思, set tags=tags;表示自动查找, 这两句同时设置vim即可实现递归的tags查找, 注意: set tags=tags;这一句的最后有一个分号, 这个分号是不能省略的. vim的配置文件使用的是vim自己的脚步语言. 这里是少数几个在行尾需要使用分号的地方之一.

 

 

你可能感兴趣的:(杂项)