Vim 不使用 tags 文件补全 PHP 代码

Vim 不使用 tags 文件补全 PHP 代码

Chris Yue No Comment
Posts

小朋友们大家好,还记得我是谁吗?对了!我就是爱折腾 VIM 的 vimer。今天要给大家讲一个 Vim 下代码补全的新故事。

记得前不久,我还给大家介绍过使用 ctags + Vim 来实现代码补全和跳转功能的文章。这篇文章介绍的 ctags 算是程序员的好伙伴——生成代码 tags 的经典软件了,但这个世界就止于此了吗?当然不是!今天尝试用了一下 Vim 的另外一个马甲——neovim,发现居然有很多插件是只给 neovim 准备的,而且有很多都很不错!其中一款叫做 nvim-completion-manager 的插件,用于即时(as you type)代码补全。他神奇的地方在于他居然完全不使用 tags 文件,但自动补全的效果却相当不错!

看了此插件的介绍,了解到除了利用 neovim 的多线程处理让代码即时补全不会卡界面之外(其实新的 Vim8.0 也支持异步处理了),另外他的补全都是通过其他插件后台提供补全的数据来实现的。比如结合补全 PHP 的插件 phpactor。当然 nvim-completion-manager 也是支持从 ctags 里获取代码信息来补全的。

这里也不得不重点提一下 phpactor 这个插件,本身这个插件是个 PHP 写的命令行工具,提供了 IDE 的某些功能,比如获取某个类里的所有方法信息、重构某个类等。功能还是挺强大的,只不过因为所有操作在命令行下执行,相比较 IDE 来说还是不太方便。不过 phpactor 本身也提供 Vim 插件。通过与 Vim 的合体,他可以在 Vim 里面执行他所提供的那些 IDE 级的功能,只不过这个插件并不提供即时代码补全,需要设置 omnifunc 来唤起选择框(然而这么做又把本来 PHP 环境下 omnifunc 的功能覆盖了……然后就没有办法补全 PHP 本身的函数……真是纠结)。而此插件与 nvim-completion-manager 配合使用则正好弥补了这个缺点。因为 phpactor 本身通过 composer + PHP 本身的类反射功能来实现获取某个类下的所有方法,理论上来说比使用 tags 更准确,因为毕竟是 PHP 原生的实现(我现在就遇到使用 tags 不能返回父类的方法,但我觉得应该没这么弱吧可能还需要什么设置)。

另外 phpactor 也支持通过类名返回类全名(包含命名空间)的功能,可以轻松展开/引入某个类的命名空间,所以之前一直用的 arnaud-lb/vim-php-namespace 扩展也可以删除了。

听到这里是不是已经想尝鲜了呢?将以下配置加入到你的 neovim 配置文件里然后运行 PlugInstall 命令即可(前提是安装了 vim-plug 作为 Vim 插件管理工具,并且在 PATH 里安装了 composer)。

就我目前尝试的效果还是不错的,但因为 Vim 本身跟 ctags 就是好基友,很多功能都通过 tags 文件来实现所以完全不用 tags 的话可能有很多功能还需要重复实现,有点 2……(比如以前 ctrl + ] 是跳转到定义,没有 tags 文件就跳转不了了,phpactor 重新实现了这个功能,并且还重新设定了快捷键……真是有够折腾的……)下次我再试试 neocomplete 在 neovim 上的马甲 deocomplete 看看好不好用。

Vim 不使用 tags 文件补全 PHP 代码 by Chris Yue is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

微信赞赏码

文章不错,我要帮站长分担建站费!
天使投赏人

发表评论

eighteen − thirteen =