ctags这个是vim的一个插件,它可以用来生成一个检索文件,里面保存有一些索引信息。例如,一些类跟方法、变量等的定义位置
当我们对一个路径执行ctags -R的时候,就会自动生成一个ctags,然后我们就可以使用一些快捷键来是实现跳转、搜索等操作了
其中
<C-]>-这个命令可以使我们跳转到光标所在位置变量定义的地方
感觉这个ctags生成索引的时候,应该是对变量定义有一定的语法识别的。
比如,对于下面一段代码
private int a = 35; a =56;
当我们把光标放到第二行的a上,然后我们进行<C-]>的时候,光标就会跳到第一行
上面的情况是,我们的a定义跟调用的是同一个文件,即使不在同一个文件,上面也是可以跳转的。
例如
我们在test_2.java 中有如下内容
if (aaa == 40) { aaa = 40; }
在test_3.java中有如下内容
private aaa = 67;
然后我们执行ctags -R *.java以后。然后我们把光标放到aaa == 40的aaa上,然后我们进行<C-]>的时候,光标就会跳转到test_3.java的 private aaa = 67;上
上面说的是变量只在一个地方定义,那如果我们变量定义的地方不止一处,又会怎么样呢?
我们还是以上面的例子为例,不过,这次我们添加一个test_4.java。它里面的内容也是 private aaa = 67;这时候我们执行同样的操作,会发现跳转到了test_3.java处了。如果我们这时候再看tags文件就不难理解为什么会这样了。
aaa test_4.java /^private int aaa = 67;$/;" external variable declarations aaa test_3.java /^private int aaa = 67;$/;" external variable declarations
所以,它应该是从tags中搜索,当第一次搜索到这个变量的时候,就会跳转了。为了验证猜想的是否正确,我特意把上面两行在tags中的位置调换了一下,然后重>复上面的操作,光标就跳转到test_4.java上了。你还可以发现,如果当前缓冲文件中有这个变量定义的话,它的优先级是最高的。
那如果我们不想直接跳转到它默认定义的地方,而是想自己选择,这时候我们就可以使用
g<C-]>
命令了。
既然ctags支持的是索引,搜索结果是一个列表,这个就不仅让我们联想到vim操作结果的常用方式next prev等。具体如下
tselect-调出最后一次C-]搜索结果.如果我们已经有了搜索记录,那么堆栈中会保留记录 tnext-搜索结果下一条 tprev-搜索结果前一条 tfirst-搜索结果第一条 tlast-搜索结果最后一条
当然,这些命令,还是建议配置快捷键的
除了我们把光标放到目的字符串上来调用<C-]>,我们还可以直接使用命令行
:tag {keyword} -等效于<C-]>
:tjump{keyword}-等效于g<C-]>
命令行更有优势的一点是,它还可以支持正则表达式搜索。这时候命令为
:tag /{keyword}
:tjump/{keyword}