引言
自己之前Vim的代码补全插件都是使用 ctags + autotag + taglist + omnicppcompele 的组合,而且很多时候都没有提示或提示补全,而且每次打开一个新文件文件都需要创建一个 ctag 标签库,代码补全才能正能工作,十分的繁琐蛋疼。当时我就在想,既然源代码都有了,难道就没有一个 Vim 插件能的通过已有的源代码,实时构建语法书来提供代码补全提示吗?通过一番搜索,终于发现了她——YouCompleteMe,看了介绍,我开始迫不及待的试用了,顿时感觉从小米加步枪的时代走到了飞机大炮的时代,以前的代码补全插件真是弱爆了!
YouCompleteMe 到底是个什么玩意?有什么神奇的功能?下面我们就一起来看看,相信你也会为之心动的,下面图片截取自YouCompleteMe 项目主页。
代码补全实现方法
(1)基于文本匹配
文本编辑器的代码补全,大多是利用正则表达式进行变量、函数名等信息的匹配,然后通过 ctags 这样的文件进行存储。在进行编辑时,再通过查询这些标签库,提供代码补全提示。这种方式易于实现,但是缺点是:编辑器并不理解程序代码的语法和语义,它只是按照规则进行“猜”,而且很多情况下还“猜”不出,更不可能检查代码中的错误。
(2)基于语义分析
而基于语义分析的编辑器,则可以读懂程序代码。基于语义分析,编辑器可以实时的编译源代码,建立起语法树,并分析语义,并给出代码补全提示。编辑器不再是不懂上下文意思的情况下乱”猜“了,而是有章可循。
YouCompleteMe 功能介绍
YouCompleteMe 依靠 Clan/LLVM 编译器进行前端实时编译,根据编译器信息提供非常准确的代码补全提示信息,而且还能提供友好的代码检查信息(这些都得归功于CLang/LLVM)。下面是一段 YouCompleteMe 作者的介绍:
YouCompleteMe 是一个快速、实时、模糊搜索的 Vim 代码补全引擎。YouCompleteMe 拥有几个不同的代码补全引擎,这些引擎为各种不同语言提供代码补全。例如:
基于Clang 的语义引擎为 C家族语言(C/C++/Objective-C/Objective-C++)提供本地代码补全;
基于 Jedi 的补全引擎为 Python 提供代码补全;
基于 OmniSharp 的补全引擎,为 C# 提供代码补全;
基于 Omnifunc 的代码补全器为许多其他语言(如PHP/Ruby等)提供代码补全。
附上一张使用截图:
YouCompleteMe 安装配置
YouCompleteMe 的安装配置稍微有点麻烦,但是子要按照项目主页上介绍的步骤一步一步来时没什么问题的,这里就不多说了。
参考:
[1] YouCompleteMe 项目主页 https://github.com/Valloric/YouCompleteMe
[2] Vim 自动补全神器——YouCompleteMehttp://jishu.zol.com.cn/228882.html
[3] Vim 中的杀手级插件——YouCompleteMe http://zuyunfei.com/2013/05/16/killer-plugin-of-vim-youcompleteme/
史上最强大的 Vim 代码补全引擎:YouCompleteMe,布布扣,bubuko.com