这两天,vim的学习遇到瓶颈。vimtutor看完后,虽然会了很多基本操作,但是随着学习的深入,问题越来越多。按照vimtutor的指示,接下来应该看user-manual:
This concludes the Vim Tutor. It was intended to give a brief overview of the Vim editor, just enough to allow you to use the editor fairly easily. It is far from complete as Vim has many many more commands. Read the user manual next: ":help user-manual".
然而打开user-manual就一个目录列表,傻眼了。然后网上各种找资料,开始知道用 :syntax enable 开启语法高亮,用 ctrl + ] 在高亮的单词上进行jump around。突然想起以前有个哥们在我面前炫耀他的vim时,在代码间跳来跳去的画面,当时就觉得好厉害,其他啥也没看懂。
给我带来难题的是神秘而强大的tags文件。
刚开始,在网上查资料得到的答案是:安装ctags,使用ctags命令生成tags文件。我非常疑惑的是,我没装ctags为什么可以在user-manual中跳转呢?而且很多文章中都把ctags称为vim的插件,那么新的问题又来了:vim插件的位置又在哪里?默认又带了些什么插件呢?Exuberant Ctags和CTags一样么?CTags诞生那么早,而编程语言层出不穷,他是否需要对相应的语言的语法规则进行配置?CTags是用来生成C/C++代码的tags的还是所有语言都可以,有没有JTags之类的东西呢(现在看来有点可笑)?即使我都解决了前面的问题生成了tags文件,这文件又要怎么用?带着这么多问题,也没心思慢慢读完厚厚的user-manual。我甚至有点绝望,以为自己终究还是不能成为神秘的vimer的一员。
经过几天痛苦的挣扎,不停找资料,不停试验,随着对vim零星的认识的积累,今天突然开窍了,好开心。
我的理解是,CTags是一个用来生成tags文件的工具,并不是vim的插件。
Ctags generates an index (or tag) file of language objects found in source files that allows these items to be quickly and easily located by a text editor or other utility. A tag signifies a language object for which an index entry is available (or, alternatively, the index entry created for that object).【1】
有些文章说他是vim的插件,有些文章中把ctags复制到vim文件夹下,对我形成了一定程度的误导。而很多大牛写的文章都是基于linux的,不是用make就是apt-get,于是这部分知识在windows平台下缺失了。没办法,硬着头皮切到linux下,照着《将Vim改造为强大的IDE》【2】中的介绍在linux下学习vim,安装ctags时又发现软件的名称叫Exuberant Ctags,然后有看到作者配置的ctags快捷键:
map <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
!shell命令,恍然大悟。再回想,别人复制到vim文件中的都是ctags.exe,vim的安装路径又在安装时被设置到了path中。于是,回到windows下,上Exuberant Ctags官网【1】下载for windows的zip包,解压,配置环境变量,开启命令窗口cd到一个java工程目录下,执行 ctags -R . 命令,目录下多了个tags文件,用vim随意打开一份源代码进行试验,跳转成功。再去vim的doc下一查,果然自带tags文件。围绕CTags的疑问一下烟消云散,难怪我没装CTags也能用到处跳转,tags文件才是vim真正需要的。tags文件的用处也引刃而解:它是个索引文件。taglist就是一个使用tags文件的插件,将tags在vim中显示出来。
参考资料:
【1】Exuberant Ctags官网 http://ctags.sourceforge.net/
【2】将Vim改造为强大的IDE http://www.cnblogs.com/zhangsf/archive/2013/06/13/3134409.html