自动补全插件 YouCompleteMe 简介
YouCompleteMe是一种代码自动补全插件. 代码补全功能在Vim发展史上是一个比较弱的功能, 因此一直被使用Source Insight的人诟病. 早些年出现的自动补全插件如 AutoComplPop, Omnicppcomplete, Neocomplcache等在效率上低得惊人, 特别是把整个Linux内核代码添加到工程时, 要使用这些代码补全功能, 每次都需要等待1~2分钟的时间, 简直让人抓狂.
YouCompleteMe 插件是最近几年才出现的新插件, 它利用clang为C/C++代码提供代码提示和补全功能. 借助clang的强大功能, YouCompleteMe的补全效率和准确率极高, 可以和Source Insight一比高下. 因此, Linux开发人员在Vim配备了YouCompleteMe插件之后完全可以抛弃Source Insight.
在安装YouCompleteMe插件之前, 需要保证Vim的版本必须高于7.4.1578, 并且支持Python2或者Python3
检查vim的版本
[me@fedora ~]$ vim --version
VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug 13 2018 13:12:53)
Included patches: 1-279
Modified by <bugzilla@redhat.com>
...
#省略很多输出...
在~/.vimrc中添加YouCompleteMe
这里的例子中, 用的是vim-plug插件
(见 vim插件配置1–插件管理器)
Plug 'ycm-core/YouCompleteMe'
然后重启vim, 并输入命令 “:PlugInstall
” 来完成安装, 这个过程会从网络下载代码, 而且YouCompleteMe代码很大, 而境外的github有比较慢, 因此下载可能会持续很长时间.
编译YouCompleteMe
插件安装完成之后, 需要重新编译它, 在编译前需要保证已经安装了如下编译工具包:
$ sudo apt-get install build-essential cmake python-dev python3-dev
接下来进入YouCompleteMe插件代码的编译
[me@fedora ~]$ cd ~/.vim/plugged/YouCompleteMe/
[me@fedora YouCompleteMe]$ ./install.py --clang-completer
# --clang-completer表示对C/C++的支持
编译后的配置
编译完成之后, 还需要做一些配置工作.
首先, 把文件 ~/.vim/plugged/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py 拷贝到 ~/.vim 目录下
[me@fedora YouCompleteMe]$ cp ~/.vim/plugged/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py ~/.vim/
然后, 在~/.vimrc中做些YouCompleteMe的设置:
其中, 这两个比较关键:
let g:ycm_server_python_interpreter = '/usr/bin/python3'
let g:ycm_global_ycm_extra_conf = '~/.vim/.ycm_extra_conf.py'
我自己这的配置如下:
"YouCompleteMe {
let g:ycm_server_python_interpreter = '/usr/bin/python3'
let g:ycm_global_ycm_extra_conf = '~/.vim/.ycm_extra_conf.py'
let g:ycm_auto_trigger = 0 "default is 1
"let g:ycm_min_num_of_chars_for_completion = 2 "default is 2
"let g:ycm_key_invoke_completion = '<C-Space>' "default is '<C-Space>'
"let g:ycm_key_list_stop_completion = ['<C-y>'] "default is '<C-y>'
"let g:ycm_key_list_select_completion = ['<TAB>', '<Down>'] "default is '<TAB>', '<Down>'
"let g:ycm_key_list_previous_completion = ['<S-TAB>', '<Up>'] "default is '<S-TAB>', '<Up>'
let g:ycm_show_diagnostics_ui = 0 "default is 1
"}
"
参考
本文很大部分是摘抄了 <<奔跑吧 Linux内核 入门篇>> 的相关章节.