优雅得使用 Vim + Ctags

这年头估计像我这种用 Vim 的老用户已经不多了,不过就我这个老头子来说,新时代依然没有一款我用的比 Vim 更顺手的编辑器。

而 Vim 最烦人,也是最好玩儿得地方,就是几乎什么功能都得自己折腾。Vim 的代码跳转功能我已经折腾了好几年了,羡慕那些默认就自带超好用的代码定义跳转自动补全功能的 IDE。可惜,一入 Vim 门深似海,我也不想换,不过就生成代码定义(专业术语叫 tags),我觉得应该是折腾到头了,是时候总结我的心路历程了。

刚开始用 Vim 那会儿,我都是编辑完了代码,发现某个自己写的类或者函数无法被自动补全,然后 ctrl+z 将 Vim 放到后台,手动执行 ctags --php-kinds=cif ... 重新生成 tags 文件。这种最原始的方式,真的超烦,不但执行次数多,库文件很大的时候执行时间也超长(其实也还好,可惜我是个急性子),我一般都攒了好多新的类一起生成 tags…… 不过就算是在原始时代,也有办法可以让日子稍微好过一些,通过执行 ctags 命令时添加 -a 参数,可以增量修改 tags 文件,执行时间可以稍微短点。不过缺点就是无法同步到被删除的类或者函数。

让日子好过的办法除了控制增量的参数,后来得知 ctags 原来可以配置默认执行的参数,方法是将 .ctags 配置文件放在 ~ 目录下,内容就是执行 ctags 时的参数,比如我常用的参数:

注:php-kinds 参数里的 t 选项,只有使用 Universal Ctags 的时候才管用,详情可见我之前的文章

以后重新生成 tags 的时候,就不用打那么长的参数了,直接 ctags 就行,是不是方便了许多。

再后来,我了解到有自动生成 tags 文件的 Vim 插件之后,感觉似乎找到了救命稻草,可惜都不是那么好用,总是有各种各样的问题。不过这些插件的工作原理,几乎都是利用 Vim 在写入 buffer 内容到文件里(说人话!好吧,就是保存文件)的时候运行 ctags 生成 tags 文件。我觉得完全没必要用什么插件,自己写也就行了。于是我多年精心维护的 .vimrc 文件末尾,又多了那么一行:

这样每次保存 PHP 文件的时候,就会重新生成一次 tags.

但随之而来带来了更严重的问题…… 每次保存文件的时候,都会卡在生成 tags 的执行上半天时间…… 让我不得不放弃这种方式。

也不知道是那个机灵鬼想到了分开生成 tags 文件的方式,让我又重新用回了上面的方法,只不过需要多写一句配置,以及稍微改一下之前的配置(以 Symfony 项目为例):

可能聪明的你已经知道是什么意思了,将 vendor 里的第三方库文件的 tags 文件单独存到 tags.vendor 文件里,而每次保存文件的时候只用执行 !ctags src 就行,因为 src 里的文件一般来说都大大少于 vendor 里的文件,即使完全重新生成也花不了多少时间,我自己的项目几乎就是秒生成;而 vendor 生成的 tags 文件本来就很少有变化,生成的文件又大(有时候能到 10MB),时间又长,在安装了新的库之后执行一次 ctags -f tags.vendor vendor 就行了。其实使用 composer,也可以在 composer 的钩子里添加监听安装库文件完成时的代码,来自动执行生成 tags.vendor。

这样改造之后,tags 用起来顺手多了,现在还有唯一一个小缺陷,就是每次保存文件完毕的时候,Vim 总是会有一个『ctags 执行完毕』的提示,按任意键确认。其实这个问题也好解决,在 autocmd 的 execute 前面加一个 silent 让 Vim 静默执行就完事儿了:

最后,偷偷透露给 PHPer 一个秘密:arnaud-lb/vim-php-namespace 和 shawncplus/phpcomplete.vim 是两个好 Vim 插件,一般人我不告诉他。

wx pay

CC BY-NC-ND 4.0 优雅得使用 Vim + Ctags by Chrisyue's Blog is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

发表评论

电子邮件地址不会被公开。