YouCompleteMe(以下简称YCM)是Linux Vim编程环境下一个功能非常强大的代码补全工具,由 google 软件工程师 Strahinja Val Markovic开发,可作为Vim的一个插件,使得Vim获得类似于Windows IDE的代码补全效果。
但是,由于对很多插件具有依赖,如Python3, Clang等,YCM素来有Vim史上最难安装插件之说,我在尝试了一周之后终于安装成功。在这个过程中,踩了无数坑,发现即使是官方教程和许多博客,由于未及时更新,很难再完全用得上,此处将我的完整安装过程分享在这篇博客中,希望能帮助到喜欢折腾Vim的朋友们。
YCM对于Vim的版本有严格的要求,必须在7.4.1578及以上(支持Python3),可通过
vim --version
进行查看。本人使用的系统为Ubuntu18.04,vim版本为8.0,查看结果如图所示:
若Vim的版本不符合要求,则需要自行升级安装,推荐8.0及以上版本。
若要补全某一种语言,需要进行相关库的安装。由于本人日常使用C语言,因此在此介绍C家族语义补全的相关库和依赖。
apt-get install cmake
apt-get install llvm-6.9 clang-6.9 libclang-6.9-dev libboost-all-dev
apt install build-essential cmake python3-dev
在这里还需要进行一次系统默认使用Python3(网上找到的方法),在shell中输入:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150
否则在后面运行./install.py --clang-completer
安装YCM时,需要改为python3 install.py --clang-completer
。
Vundle是一款好用的Vim插件管理器,可方便的进行Vim插件的安装和卸载,推荐使用它来安装YCM。Vundle的官方安装教程可在Github找到,在此简单介绍一下我的安装和配置:
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle//Vundle.vim
注意,git需要通过apt-get install git
提前安装。
在Vimrc文件中加入以下代码段以启用vundle,并加入YCM。
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'Valloric/YouCompleteMe’
call vundle#end()
filetype plugin indent on
首先,输入vim
进入Vim界面,在命令行中输入:PluginInstall
,等待一段时间后,即提示YCM安装完成,但底部会提示YouCompleteMe Unavailable
,原因在于YCM的安装分两步,还需要再执行Python脚本,或者运行Shell脚本。
cd ~/.vim/bundle/YouCompleteMe
进入YCM的文件夹,使用./install.py --clang-completer
命令执行安装脚本。clang-completer为C-family补全,其他语言可参见官方说明。
此处一个很坑的地方,就是官方教程并未明确指出,安装结束后不配置 .ycm_extra_conf.py
文件也是没法用YCM的。此python文件用于配置YCM。
1.复制 .ycm_extra_conf.py 文件到当前目录
首先,我们需要找到 .ycm_extra_conf.py
文件的位置。YCM成功安装后会生成许多.ycm_extra_conf.py
文件,可通过find / -name .ycm_extra_conf.py
进行查找。
默认YCM会检索当前文件夹内是否存在.ycm_extra_conf.py
文件,否则ycm会从项目的文件开始,一步一步往上查找配置文件,如果没找到,就按照默认路径(Vimrc文件中手动指定)去加载该文件,检索不到就会报错。默认加载优先级为当前目录>默认目录。
推荐在每个工程文件夹目录下新建一个.ycm_extra_conf.py
文件(从~/.vim/bundle/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py
中复制一个过去),这样每次打开当前目录的C文件就会提示是否加载.ycm_extra_conf.py
,以此达到根据不同工程的需要而自由定制YCM的效果。
2. vimrc文件的配置
若当前目录未加入.ycm_extra_conf.py
文件,则需要在vimrc文件中添加一行let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py
,此即为.ycm_extra_conf.py
文件的默认路径,也可自行指定。vimrc文件中对YCM的配置适用于所有文件夹,如下:
//设置.ycm_extra_conf.py的默认索引路径(必须)
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py'
//设置YCM语义补全自动触发条件(必须)
let g:ycm_semantic_triggers = {
\ 'c' : ['->', '.', ' ', '(', '[', '&'],
\ 'objc' : ['->', '.', 're!\[[_a-zA-Z]+\w*\s', 're!^\s*[^\W\d]\w*\s',
\ 're!\[.*\]\s'],
\ 'ocaml' : ['.', '#'],
\ 'cpp,objcpp' : ['->', '.', '::'],
\ 'perl' : ['->'],
\ 'php' : ['->', '::'],
\ 'cs,java,javascript,typescript,d,python,perl6,scala,vb,elixir,go' : ['.'],
\ 'ruby' : ['.', '::'],
\ 'lua' : ['.', ':'],
\ 'erlang' : [':'],
//一些ycm在vimrc中的常用配置,可参照官方教程的Functions部分自行配置(非必须)
//支持关键字补全
let g:ycm_seed_identifiers_with_syntax=1
//支持从Tag files收集关键字
let g:ycm_collect_identifiers_from_tags_files = 1
//支持注释补全
let g:ycm_complete_in_comments = 1
//支持文件名补全
let g:ycm_complete_in_strings = 1
//设置括号自动匹配,可根据需要自行添加(非必须)
inoremap ( ()
inoremap ( ()
inoremap ( ()
完成vimrc文件的修改后,还需要在.ycm_extra_conf.py
文件中进行最后的配置。打开.ycm_extra_conf.py
文件,该配置文件的核心就是修改flags变量。告诉系统库文件所在,以及在遇到何种后缀时会发生补全。运行以下命令:
echo | clang -v -E -x c++ -
将输出结果中
#include "..." search starts here:
#include <...> search starts here:
和
End of search list.z
之间的内容添加到flags变量中的-isystem后。这里参考了这篇博客的内容,感谢。同时在flag变量中添加'c'
,以及将flags.append('-std=c++11')
替换为flags.append('-std=c99')
。若本工程还依赖其他的库文件,也需要加进来,我加入了dpdk的库文件。最后的.ycm_extra_conf.py
文件配置结果如图:
至此,YCM算是正式安装完成了。附上我现在的代码补全效果图,以上所有环节缺一不可,不愧是史上最难安装插件。而且我的YCM目前也只是最基本的配置,更多个性化的配置,就留到以后再探索吧。