对于Vim而言,YouCompleteMe(以下简称YCM)的重要性再怎么强调都不为过,其强大的补全能力让人一经试用就爱不释手。可以说,没有YCM,在Vim里写代码毫无乐趣。有了YCM,写代码的效率秒杀无YCM的Vim。
与其它插件相比,YCM的安装过程稍显困难。好在可以一次安装,到处使用(只需要重新编译一下即可)。欲安装YCM,首先必须要下载YCM源码,可以选择Vundle安装(Vundle插件的使用不在这里赘述)在.vimrc
里输入
Plugin 'Valloric/YouCompleteMe'
然后打开vi
执行: PluginInstall
,然后就是较长时间的等待(因为要下载第三方依赖,见下文);也可以选择手动从github下载:
cd ~/.vim/bundle
git clone https://github.com/ycm-core/YouCompleteMe.git
git submodule update --init --recursive
上述第三步就是在下载YCM的第三方依赖,比较费时间。
值得指出的是,YCM源码既可以放在~/.vim/bundle
下,也可以放在~/.vim/plugin
下。个人觉得,这两种方法各有优劣。放在~/.vim/bundle
下面,可以借助于Vundle的统一管理,而这恰恰也是一个可能带来问题的地方:Vundle会默认把YCM的源码升级到最新版。YCM对C++和Python的版本有要求。对于没有管理员权限的用户而言,最新的YCM所要求的C++,服务器不一定能满足(没错,我说的就是极端保守的CentOS。gcc最新版本都已经是10.2了,CentOS 7.6仍然只提供4.8.5,相比之下Ubuntu 20.04的版本是9.3),尤其是当你需要Python 3.8等比较高一点版本的时候。
比较滑稽的是,在编译YCM的过程中你很有可能看到如下提示:
NOTE: You appear to be on CentOS. In order to use this application, you require a more modern compiler than the default compiler on this platform. Please install the devtoolset-8 or greater. For example, see this link: https://www.softwarecollections.org/en/scls/rhscl/devtoolset-8/
本文标题所说的两种安装方式,第一种方法简单好用,适用于gcc版本比较新的情况:
cd ~/.vim/bundle/YouCompleteMe
python3 install.py --clangd-completer --ts-completer
上述安装添加了对C/C++和JavaScript的补全支持(需要安装Node.js)。
第二种方法则针对诸如CentOS之类gcc版本低到发指的操作系统。当然,这种方法需要自行安装一个稍微高一点版本的GCC和llvm/clang(不建议更新系统的gcc版本,Linux大神请随意),然后再编译。 先产生Makefile文件:
cd ~/.vim/bundle/YouCompleteMe
mkdir ycm_build
cd ycm_build
cmake -G "Unix Makefiles" -DUSE_PYTHON2=OFF -DUSE_SYSTEM_BOOST=ON . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
如果cmake
只找到了Python2或者只找到了系统自带的Python 3.6,可以将最后一步改成
cmake -G "Unix Makefiles" -DUSE_PYTHON2=OFF
\ -DUSE_SYSTEM_LIBCLANG=ON
\ -DPYTHON_LIBRARY=~/.local/lib/libpython3.8.so.1.0
\ -DPYTHON_INCLUDE_DIR=~/.local/include/python3.8 .
\ ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
然后在ycm_build
中继续编译生成ycm_core
库文件:
cmake --build . --target ycm_core --config Release
上述参数--config Release
是针对Windows,在Linux下会被忽略掉。最后一步是安装watchdog
:
cd YouCompleteMe/third_party/ycmd/third_party/watchdog_deps/watchdog/
mkdir build
python setup.py build --build-base=build/3 --build-lib=build/lib3