From:http://www.jianshu.com/p/d908ce81017a
github 地址:https://github.com/Valloric/YouCompleteMe
YouCompleteMe is a fast, as-you-type, fuzzy-search code completion engine for Vim.
参考: https://github.com/Valloric/YouCompleteMe#full-installation-guide
本篇文章默认读者知道什么是 unix/linux,vim/vi, YouCompleteMe,如果有不清楚的,Search engine is your friend 。YouCompleteMe 简称 YCM 以下都称为 YCM。
YouCompleteMe 的强大想必大家都听说过,简单的用一句话来概括的话,媲美 VS 的自动补全 当然可能有一点点过,但可见其强大。但是作为一个十分强大的 vim 插件,他可是十分的难以安装,几乎所有的人,都会在安装阶段苦苦挣扎,然后要么成功安装享受工具带来的便利,要么放弃继续使用传统的自动补全工具(当然也没有那么差,但可能没有 YCM 那么强大)。
1. 通过 Vundle 来安装 YCM(官方推荐)
快速安装 vim 的插件管理插件 vundle
http://blog.csdn.net/freeking101/article/details/78539750
在 vim 的配置文件 ~/.vimrc 中添加一行(在call vundle#begin() 和 call vundle#end() 之间)
call vundle#begin()
. . .
Plugin 'Valloric/YouCompleteMe’
. . .
call vundle#end()
然后保存运行 vim 命令 :PluginInstall
安装 需要特别注意的是这个时候可能等的时间会相当的长
使用Vundle安装 youcompleteme后,需要先编译才能使用。(可以去 github 上看 官方的 编译安装流程)
cd ~/.vim/bundle/YouCompleteMe
./install.sh --clang-completer
上面是编译只有 C语言 的自动补全,如果想要所有的自动补全,可以使用 --all 参数
cd ~/.vim/bundle/YouCompleteMe
./install.sh --all //或者 ./install.py --all
如果编译失败,一般都是一些依赖或者库不满足。可以网上查找“YouCompleteMe编译安装”解决。
编译成功后,恭喜,大功搞成!!!
使用:
完成了YCM的编译就可以享受它给你带来的方便了,如果你需要C语言的语义补全,除了刚刚编译多出来的步骤之外,你还需要提供编译的flag给YCM才能进行真正的补全。YCM查找.ycm_extra_conf.py来进行补全支持,你也可以手动提供一个全局的.ycm_extra_conf.py路径来给YCM做缺省处理(YCM查找路径是依次从里到外的向上,如果找不到会采取默认的全局路径,我选择放在主目录下面,这样不需要设置全局路径,因为YCM始终可以找到它)。
此外说一下.ycm_extra_conf.py,对于一些简单的小项目,使用默认的文件即可,对于默认文件我选择关闭了-Werror因为这样会给Vim提示语义准确的Syntastic带来困扰,另外我多加了一句-isystem,/usr/include/c++/4.8,因为我发现默认的ycm_extra_conf似乎找不到C++头文件。对于复杂项目来说,这个时候又需要借用我们强大的CMake了。CMake中有一个命令可以导出编译flag,-DCMAKE_EXPORT_COMPILE_COMMANDS=ON,这个时候CMake会把当前的编译flag全部导出到一个json数据库-compilation_commands.json,之后 我们需要手动给ycm_extra_conf.py中的compilation_database_folder一行 添加你数据库的位置,比如你在src,ycm_ectra_conf在你目录下,而你的json在build中,所以你需要写floder=./build,这个时候打开Vim,你会发现你的项目已经可以进行补全,我在进行Qt开发的过程中就是将CMake脚本维护好之后通过json来让YCM找到Qt的头文件从而进行补全,十分方便。
语意补全要正确工作,需要配置好.ycm_extra_conf.py文件,模板在这里。可以把这个文件放在项目的根目录下,打开项目文件时,YCM会循环向上搜索并加载这个文件,或者在vimrc文件中加入
let g:ycm_global_ycm_extra_conf = 'your path to .ycm_extra_conf.py'
如果.ycm_extra_conf.py中include path等配置没有问题,YCM已经可以工作了。YCM更新很频繁,最近版本已经可以和UltiSnip整合了。
集成Syntastic
YCM很早就支持集成Syntastic了,上面demo里面,代码前的出现红色叉叉,就是YCM结合Syntastic爆出的语法错误。刚开始用YCM的时候,更看重其代码补全功能,Syntastic没放在心上,结果发现越用越离不开了。当编写C++代码的时候,每次光标悬停2秒钟以上的时候,YCM都会在后台扫描你当前的文件,你刚刚输入的代码有什么编译错误,马上就能显示出来,及时的改掉,不再积累到最后编译的时候。当然这是现代IDE的标配功能,vim中也有插件可以实现,但是有了YCM后,再用vundle安装Syntastic,甚至不用任何配置就实现了这些功能,实在是太方便了。
代码跳转
YCM支持代码跳转了,又一项对程序开发极有用的功能,现在支持c, cpp, object-c, object-cpp, python代码跳转到声明和实现。特别对c和c++, 这个跳转可不是像基于ctags的那些插件,经常让你在一大堆重名的tag里人肉搜索,十跳九不中。得利于clang的强大功能,YCM的代码跳转几乎没有失手,当然前提是你要设置好.ycm_extra_conf.py
,代码被YCM解析时没太多编译错误。
主要功能是3个YcmCompleter的subcommands:
- GoToDeclaration
- GoToDefinition
- GoToDefinitionElseDeclaration
在vim配置文件中加上一行就搞定了
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>
2. 通过 Git 安装 YCM
等待 Vundle 安装 YCM 等了好久终于貌似好像成功了,打开 vim 却发现 YouCompleteme unavailable : no module named future
(当然没有遇到算你运气好),那么你应该考虑一下换用 Git 来安装 YCM:
# 下载 (在 `~/.vim/bundle` 目录下)
$ git clone --recursive [https://github.com/Valloric/YouCompleteMe.git](https://github.com/Valloric/YouCompleteMe.git)
# 检查完整性(在 `~/.vim/bundle/YouCompleteMe` 目录下)
$ git submodule update --init --recursive
下载安装最新版的 libclang
如果不需要 C 家族的语义化补全,则可跳过这一步
# apt-get install llvm-3.9 clang-3.9 libclang-3.9-dev libboost-all-dev
PS: YCM 官方墙烈推荐使用上游编译的二进制文件代替系统自带的 libclang
You can use the system libclang only if you are sure it is version 3.9 or higher,
otherwise don't. Even if it is, we recommend using the official binaries from llvm.org if at all possible.
Make sure you download the correct archive file for your OS.We STRONGLY recommend AGAINST use of the system libclang instead of the upstream compiled binaries.
Random things may break. Save yourself the hassle and use the upstream pre-built libclang.
编译构建 ycm_core 库
需要:cmake python3-dev
YCM 的顶层目录或者说根目录应该是 ~/.vim/bundle/YouCompleteMe
创建一个目录放编译过程中产生的文件
$ mkdir ~/.ycm_build
$ cd ~/.ycm_build
生成 makefile
如果跳过第三步的话,则可以直接运行
$ cmake -G "Unix Makefiles" . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
如果没有跳过第三步,说明需要 c 家族的语义化补全则需运行
$ cmake -G "Unix Makefiles" -DUSE_SYSTEM_BOOST=ON DUSE_SYSTEM_LIBCLANG=ON . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
有问题的编译
编译通过的,没有报错,但是这个编译结果是有问题的,看第 3 行,反复强调的 c 家族的语义补全没有了。经过老夫反复的检查,原来是上面的编译命令少了一个 -
符号
$ cmake -G "Unix Makefiles" -DUSE_SYSTEM_BOOST=ON -DUSE_SYSTEM_LIBCLANG=ON . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
这个时候编译的过程如下图:
编译正常
其实这个还是有问题的,看倒数第 3、4 行,使用的是外部的 libclang-3.6 ,第 2 步中说的系统安装的 libclang 最低要是是 3.9。
这个时候就需要删除 ~/.ycm_build
目录下的所有文件,使用下面的命令指定 libclang 的版本重新编译。
$ cmake -G "Unix Makefiles" -DUSE_SYSTEM_BOOST=ON -DEXTERNAL_LIBCLANG_PATH=/usr/lib/x86_64-linux-gnu/libclang-3.9.so . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
编译的结果是之前新建的目录(也就是当前目录下生成了一些 Makefile 文件)
构建 ycm_core
# --config Release 这个构建选项进针对 Windows
$ cmake --build . --target ycm_core --config Release
配置
复制 .ycm_extra_conf.py 文件
$ cp ~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py ~/.vim/
添加 vim 配置
注意下面的 python 解释器的路径要和编译 ycm_core 的时候使用的 python 解释器是相同的版本(2 或 3)
“ ~/.vimrc
let g:ycm_server_python_interpreter='/usr/bin/python'
let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py'
4. 其他语言的支持
C#、Go、TypeScript、 JavaScript、 Rust support
由于老夫对这些语言没有太多的涉猎就不做介绍了。
5. 测试安装
首先新建一个 hello.c 文件,