ctags 寻找方法定义处

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}

posted @ 2015-12-20 01:27  小白屋  阅读(431)  评论(0编辑  收藏  举报