2004年12月24日星期五

关于vim,ctags的一个小技巧

vim可以使用ctags制作的tags文件来浏览程序源文件。问题是,当源文件存放在目录树(也就是所谓的source tree)的时候,该怎么办呢?
在缺省情况下,ctags只会处理当前目录里的源文件,而且vim也只会参考当前目录的tags文件。这时候,如果当前目录里的源文件引用了其他目录里的定义,那么vim就无法利用tags文件自动跳转了。解决这个问题主要依靠两个技巧:
一,在目录树的根目录里,使用命令:
ctags -R 或 ctags --recurse
这两个命令应该是等效的,但是在我目前使用的ctags(版本5.5.4),ctags -R似乎无效。--recurse参数会让ctags遍历整个目录树,分析所有子目录里的文件。最后形成的tags文件会放在根目录里。
二,编辑vim的设置文件(_vimrc或.vimrc),添加两行

set tags=tags;

set autochdir

注意第一个命令里的分号是必不可少的。这个命令让vim首先在当前目录里寻找tags文件,如果没有找到tags文件,或者没有找到对应的目标,就到父目录中查找,一直向上递归。因为tags文件中记录的路径总是相对于tags文件所在的路径,所以要使用第二个设置项来改变vim的当前目录。
使用这两个技巧后,就可以在目录树中自由的浏览源程序了。
另外,几个相关的话题:一个是,我发现用这种方法跳转到别的目录,只对ctrl-]和g ctrl-]有效果,而:ta或:ts命令,却还是只使用当前目录的tags文件,不知道这算不算是vim的bug。
另外,就算是在根目录使用了ctags命令,最好也还是在常用的目录里再使用一次ctags命令。因为vim总是首先在当前目录中寻找tags文件,所以如果第一次搜索就能找到的话,那么速度就会快多了。
另外一个话题是,尽管用g ctrl-]来跳转是非常方便的命令,但是因为这个命令要搜索整个tags文件来找出所有的匹配定义,所以速度上就比只找出第一个定义的ctrl-]要慢多了。如果对于定义比较确定的话,那么最好还是用ctrl-]来执行吧。

没有评论: