Vim智能补全插件YouCompleteMe安装

时间:2021-10-31 10:08:05

以下的内容来源与官方的手册,内容是英文版的,自己整理了一下。后面的关于YCM的介绍只翻译了部分,更多的内容包括最终要的选项部分,只能下次机会再翻译了。

在安装和配置的整个过程中,这两篇文章给了我很大的帮助:

(1)Ubuntu13.04配置:Vim+Syntastic+Vundle+YouCompleteMe

(2)Vim自动补全神器:YouCompleteMe

一、准备

1:确保Vim的版本至少是Vim73.584,且支持Python2脚本。
查看已安装的vim的版本:

 vim --version
查看是否支持python2:进入vim,命令:echo has('python'),查看左下角,输出为1,则表示支持。如果为0,则需要重新编译安装vim,在编译时添加python支持。

二、安装

2:安装YCM,通过Vundle或者Pathongen,官网上推荐用Vundle,大多安装指导的资料也都是基于Vundle。
通过Vundle安装YCM的方法:
在.vimrc中添加:
Bundle 'Valloric/YouCompleteMe'
然后进入vim,执行:BundleInstall
记住:如果用Vundle更新YCM,yum_support_lib库API改变了,YCM会提醒你重新编译它。


3:如果不需要对C家族的语言进行语义支持,则跳过这一步。
下载最新版的libclang。Clang是一个开源编译器,能够编译C/C++/Objective-C++。Clang提供的libclang库是用于驱动YCM对这些语言的语义支持。YCM需要版本至少为3.4的libclang,但是理论上3.2+版本也行。也可以使用系统libclang,如果确定是3.3版本或者更高。官网上推荐下载llvm.org官网的二进制文件。链接::,确保选对适合自己系统的包。


4编译YCM需要的ycm_support_libs库
需要cmake,如果未安装,安装之:
:sudo apt-get install build-essential cmake
确保python头文件已安装:sudo apt-get install python-dev
接下来假设你已经通过Vundle安装了YCM,那么YCM的目录为:~/.vim/bundle/YouCompleteMe
接下来创建一个文件夹用来放置编译文件:
 cd ~ mkdir ycm_build
cd ycm_build
下一步生成makefile,这一步很重要,有点复杂。
1)如果不需要C族语言的语义支持:在ycm_build目录下执行:
:~/ycm_build$ cmake -G "Unix Makefiles" . ~/.vim/bundle/YouCompleteMe/cpp
2)如果需要C族语言的语义支持,还得分几种情况:
(1)假如你从llvm的官网下载了LLVM+Clang,然后解压到:~/ycm_temp/llvm_root_dir (该目录下有 bin, lib, include 等文件夹),然后执行:
:~/ycm_build$ cmake -G "Unix Makefiles" -DPATH_TO_LLVM_ROOT=~/ycm_temp/llvm_root_dir ~/.vim/bundle/YouCompleteMe/cpp
(2)如果想用系统的libclang:
:~/ycm_build$ cmake -G "Unix Makefiles" -DUSE_SYSTEM_LIBCLANG=ON ~/.vim/bundle/YouCompleteMe/cpp
(3)如果想用自定义的libclang:
:~/ycm_build$ cmake -G "Unix Makefiles" -DEXTERNAL_LIBCLANG_PATH=/path/to/libclang.so ~/.vim/bundle/YouCompleteMe/cpp  
/path/to/libclang.so这部分填入你自己的路径。


由于我采用了通过源直接安装最新版的LLVM+Clang,所以用第二种方法:
:~/ycm_build$ cmake -G "Unix Makefiles" -DUSE_SYSTEM_LIBCLANG=ON ~/.vim/bundle/YouCompleteMe/cpp
一下是执行该命令后的部分输出内容,可以看到using external libclang那一行中找到了libclang.so
-- The C compiler identification is GNU 4.8.1-- The CXX compiler identification is GNU 4.8.1.............Your C++ compiler supports C++11, compiling in that mode.-- Found PythonLibs: /usr/lib/i386-linux-gnu/libpython2.7.so (found suitable version "2.7.5+", minimum required is "2.6") Using libclang to provide semantic completion for C/C++/ObjCUsing external libclang: /usr/lib/llvm-3.4/lib/libclang.so-- Found PythonInterp: /usr/bin/python (found version "2.7.5") .............-- Build files have been written to: /home/username/ycm_build

然后执行:
:~/ycm_build$ make ycm_support_libs


迄今为止的操作都是照着官方的手册上的指导做的,我自己这么做成功了。看到别人的帖子,有说make失败的,需要先make ycm_core,再make ycm_support_libs。如果失败了,先检查一下libclang.so这部分是不是路径错了,再试试这种方法。

三、其他安装

Ubuntu Linux X64超快安装
最好还是完整安装,这种快速安装未必适合所有人。安装之前,同样也要确定满足以上所述的vim版本、python支持等条件。
编译YCM,如果需要对C-family的语义支持:
cd ~/.vim/bundle/YouCompleteMe
./install.sh --clang-completer
如果不需要对C-family的语义支持:
cd ~/.vim/bundle/YouCompleteMe
./install.sh
如果需要支持C#,添加 --omnisharp-complete 


四、YCM的配置和使用

一般的使用:
1)如果需要补全的词太长,继续输入就好,YCM会根据你输入的刷新补全。
2)关于大小写的过滤问题,如果你色呼入“foo”,则会匹配“Foo”和“foo”,如果输入“Foo”则会匹配“FOO”和“Foo”。
3)使用TAB键接受补全,一直按TAB则会循环所有的匹配补全项。shift+TAB则会反向循环。注意:如果使用控制台Vim(非GVim或MacVim等),控制台不会将shift+Tab传递给Vim,因此会无反应,需要重新映射按键。

了解一些关于YCM如何实现补全,避免困惑。YCM有好几个补全引擎:
(1)基于标识符的补全器,它会收集当前文件和你访问的其他文件还有tags文件的标识符,然后在你输入时进行搜索,标识符被放入相应文件类型组里。
(2)语义引擎。基于libclang的补全为C族语言提供语义补全。基于Jedi的补全为Python提供补全。还有基于omnifunc的补全器,使用Vim的omnicomplete系统提供的数据,在本地的YCM不存在适合当前语言的补全器时使用。
(3)其他,如:UltiSnips和文件路径补全器。

YCM是Client-sever架构的,Vim这部分的YCM只是很小的一个客户端,与具有大量逻辑和功能的ycmd HTTP+JSON交互。server在你开启或关闭Vim是自动开启或关闭。

通用的语义补全用法:
可以使用Ctrl+Space来触发补全。
C族语义补全引擎的使用:
YCM会寻找当前打开的文件的同级目录下或上级目录中的ycm_extra_conf.py这个文件,找到后会加载为Python模块,且只加载一次。YCM调用该模块中的FalgsForFile方法。该模块必须提供带有编译当前文件的必要信息的这个方法。

×××××××××××××××××××××××××××××××××××分割线××××××××××××××××××××××××××××××××××××××××××××

如上所述,YCM在补全时需要ycm_extra_conf.py这个文件,所以我们需要对这个文件进行改动,以满足基本C族语言的补全需要。在~/.vim/bundle/YouCompleteMe/cpp/ycm下找到该文件的模板,在flag里面添加如下内容(系统文件用-isyetem,第三方文件用 -I):

'-isystem',
'/usr/include',
'-isystem',
'/usr/include/c++/',
'-isystem',
'/usr/include/i386-linux-gnu/c++'

    如果要让其对C++标准库补全生效,还要把配置文件中的这几行(从try到pass这4行)注释掉:

# NOTE: This is just for YouCompleteMe; it's highly likely that your project
# does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR
# ycm_extra_conf IF YOU'RE NOT 100% SURE YOU NEED IT.
try:
final_flags.remove( '-stdlib=libc++' )
except ValueError:
pass

        最好先把YCM作者提供的模板备份一下再做改动,然后将改动好的文件就放在原来的位置,作为全局的ycm_extra_conf.py,这样平时写个小Cpp的程序就不需要再单独创建一个。要使之生效,需要在.vimrc里面设置YCM相应的选项,此选项会在下面配置部分详细说明。对于特定的工程,将其拷贝到工程文件夹下,然后在这基础上再修改。不用担心工程文件夹下的ycm_extra_conf.py会和全局的冲突,因为开启vim之后,ycm会现在工程文件夹下搜索该文件,此处的配置文件优先级最高。


五、我的YCM配置

在.vimrc文件中添加针对YCM的设置:

"设置error和warning的提示符,如果没有设置,ycm会以syntastic的
" g:syntastic_warning_symbol 和 g:syntastic_error_symbol 这两个为准
let g:ycm_error_symbol='>>'
let g:ycm_warning_symbol='>*'
"设置跳转的快捷键,可以跳转到definition和declarationnnoremap <leader>gc :YcmCompleter GoToDeclaration<CR>nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>"nmap <F4> :YcmDiags<CR>
"设置全局配置文件的路径let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py'"开启基于tag的补全,可以在这之后添加需要的标签路径let g:ycm_collect_identifiers_from_tags_files = 1"开启语义补全let g:ycm_seed_identifiers_with_syntax = 1"在接受补全后不分裂出一个窗口显示接受的项set completeopt-=preview"不显示开启vim时检查ycm_extra_conf文件的信息let g:ycm_confirm_extra_conf=0"每次重新生成匹配项,禁止缓存匹配项let g:ycm_cache_omnifunc=0"在注释中也可以补全let g:ycm_complete_in_comments=1"输入第一个字符就开始补全let g:ycm_min_num_of_chars_for_completion=1"不查询ultisnips提供的代码模板补全,如果需要,设置成1即可let g:ycm_use_ultisnips_completer=0

<Ctrl>+<Space>这个快捷键保留给omniCppCompleter,虽然开启了ycm补全,这个功能依然可用。
更多关于YCM的配置选项和其他信息,查看YCM的帮助文档就好。

针对.ycm_extra_conf.py的配置:
(1)百度贴吧上看到的一个网友写的 自动生成conf文件的脚本
都是别人写的,可以弄下来,针对自己的情况做些修改,保存在Templates文件夹里面,下次需要的话创建一个就很方便。