YCM是vim的一款基于语义的智能补全插件。该插件的功能与以下插件相冲突:
虽然可以补全很多种编程语言,但YCM主要还是针对c++的,此外它对python的支持也不错。
作为一个c++程序员,要想尽可能地发挥YCM的功能,推荐安装以下软件:
如果你的软件源中的vim版本不够高,那么很有可能你需要从源码安装vim,参考这里:
ftp://ftp.vim.org/pub/vim/unix/
Vundle的安装:
Vundle是vim的一款进行插件管理的插件。它需要git的支持,git可以在各发行版软件源内找到并安装。除了安装时的一个命令,日常vundle的使用并不需要了解git命令。
以下安装流程参考自vundle的github简介。
$ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
这样插件将被下载到 ~/.vim/bundle/vundle
""""""""""""""""""""" Vundle
set nocompatible
filetype off
set rtp+=~/.vim/bundle/vundle
call vundle#rc()
Bundle 'gmarik/vundle'
Bundle 'Valloric/YouCompleteMe'
Bundle 'Valloric/ListToggle'
Bundle 'scrooloose/syntastic'
filetype plugin indent on
""""""""""""""""""""" Vundle
关键的是其中以Bundle开头的行,每一个Bundle代表一个vim插件,这些省略完整URL插件都是托管在https://github.com上的。如果想要安装新的插件,在“call vundle#rc()” 和 ”filetype plugin indent on”之间添加新的Bundle ‘插件名称’即可。
编辑完成后,在vim下运行下面的命令进行插件安装,请确保你的网络连接正常。
在末行模式输入
:source ~/.vimrc
:BundleInstall
命令进行安装。
此时,安装过程是看不到你安装进度。所以用以下命令
$ watch -n 2 du -lh ~.vim/bundle
每两秒对目录及文件大小进行观察,会发现慢慢增大,可粗略查看安装进度。
安装流程比较缓慢,请耐心等待。
如果安装成功,你将看到Done!的提示字样。在本例中,插件:YouCompleteMe, syntastic和ListToggle被安装进你的vim中。
YCM语法补全模块的编译。
为了让YCM实现语法补全,还需要编译语法补全模块和编辑一个配置文件。
在终端下执行以下命令:
$HOME/.vim/bundle/YouCompleteMe
并执行 install.sh –clang-completer
即可安装语法补全模块。
如果出现问题如下:
In file included from /home/king/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/BoostParts/boost/python/detail/prefix.hpp:13:0,
from /home/king/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/BoostParts/boost/python/handle.hpp:8,
from /home/king/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/BoostParts/boost/python/converter/arg_to_python_base.hpp:7,
from /home/king/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/BoostParts/libs/python/src/converter/arg_to_python_base.cpp:6:
/home/king/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/BoostParts/boost/python/detail/wrap_python.hpp:50:23: 致命错误:pyconfig.h:No such file or directory
# include
^
编译中断。
BoostParts/CMakeFiles/BoostParts.dir/build.make:494: recipe for target 'BoostParts/CMakeFiles/BoostParts.dir/libs/python/src/converter/arg_to_python_base.cpp.o' failed
gmake[3]: *** [BoostParts/CMakeFiles/BoostParts.dir/libs/python/src/converter/arg_to_python_base.cpp.o] Error 1
gmake[3]: *** 正在等待未完成的任务....
CMakeFiles/Makefile2:85: recipe for target 'BoostParts/CMakeFiles/BoostParts.dir/all' failed
gmake[2]: *** [BoostParts/CMakeFiles/BoostParts.dir/all] Error 2
CMakeFiles/Makefile2:154: recipe for target 'ycm/CMakeFiles/ycm_core.dir/rule' failed
gmake[1]: *** [ycm/CMakeFiles/ycm_core.dir/rule] Error 2
Makefile:131: recipe for target 'ycm_core' failed
gmake: *** [ycm_core] Error 2
ERROR: the build failed.
NOTE: it is *highly* unlikely that this is a bug but rather
that this is a problem with the configuration of your system
or a missing dependency. Please carefully read CONTRIBUTING.md
and if you're sure that it is a bug, please raise an issue on the
issue tracker, including the entire output of this script
and the invocation line used to run it.
出现缺少pyconfig.h文件,我百度过后找到解决方案如下:
下载python-devel
$ sudo yum install python-devel
继续执行命令:
$HOME/.vim/bundle/YouCompleteMe
即可。
这个文件(.ycm_extra_conf.py)决定了YCM在进行c系语言(c,c++,etc.) 语法补全时的行为。默认的样板配置文件在
$HOME/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py
对于YCM来说,当打开一个代码文件时,插件将顺着文件所在的路径一直向上查找,如果搜索到第一个配置文件将立刻读入。如果一直搜索到根目录依旧无法找到配置文件,语法补全将不被启用。由此可知,文件所在目录的配置文件优先级最高,根目录的优先级最低。
一种比较好的使用方法是在每个项目中创建一个配置文件,或者将项目根据语言进行分类,在每个语言文件夹下建立一个配置文件。
默认配置文件是支持c++的,但是需要修改一处地方。可以将该文件拷贝出来并编辑:
$ cp $HOME/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py ~
vim ~/.ycm_extra_conf.py
找到以下内容:
# 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% YOU NEED IT.
try:
final_flags.remove( '-stdlib=libc++' )
except ValueError:
pass
将之删除后YCM才会补全c++标准库的内容。
这样,一个最小能用的配置文件就出炉了。
在日常使用中,有一些建议修改的变量。本人的.vimrc中对YCM的配置如下:
" YouCompleteMe
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>
nnoremap <F5> :YcmForceCompileAndDiagnostics<CR>
"let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
"Do not ask when starting vim
let g:ycm_confirm_extra_conf = 0
let g:syntastic_always_populate_loc_list = 1
其中,g:ycm_global_ycm_extra_conf 定义了全局配置文件,对于懒人来说是个好用的功能。当YCM在向上搜索的路径中找不到配置文件后,YCM将导入全局配置文件。
g:ycm_confirm_extra_conf 决定了在导入配置时是否需要手动确认。设置为0后YCM就不会老是在启动vim的时候来烦你了。
本示例中安装了syntastic插件进行语法检查,因此g:syntastic_always_populate_loc_list设置为1将更方便地使用其功能。又因为本示例安装了ListToggle,打开错误/警告提示面板将变成简单的一个快捷键。
在vim中,
键可以自由设置,一般来说它是逗号”,”
进行至此,可用的快捷键如下:
跳转到当前函数的定义或声明。
F5 刷新错误/警告。(其实没什么用,每次保存时候都会自动刷新的)
打开错误/警告提示面板
打开quickfix窗口
主动调用语义补全的按键默认是
,可以通过修改变量g:ycm_key_invoke_completion来设置。
2、我在网上找到的.vimrc配置:
在.vimrc文件末尾加上:
" 自动补全配置
set completeopt=longest,menu "让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)
autocmd InsertLeave * if pumvisible() == 0|pclose|endif "离开插入模式后自动关闭预览窗口
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>" "回车即选中当前项
"上下左右键的行为 会显示其他信息
inoremap <expr> <Down> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <Up> pumvisible() ? "\<C-p>" : "\<Up>"
inoremap <expr> <PageDown> pumvisible() ? "\<PageDown>\<C-p>\<C-n>" : "\<PageDown>"
inoremap <expr> <PageUp> pumvisible() ? "\<PageUp>\<C-p>\<C-n>" : "\<PageUp>"
"youcompleteme 默认tab s-tab 和自动补全冲突
"let g:ycm_key_list_select_completion=['<c-n>']
let g:ycm_key_list_select_completion = ['<Down>']
"let g:ycm_key_list_previous_completion=['<c-p>']
let g:ycm_key_list_previous_completion = ['<Up>']
let g:ycm_confirm_extra_conf=0 "关闭加载.ycm_extra_conf.py提示
let g:ycm_collect_identifiers_from_tags_files=1 " 开启 YCM 基于标签引擎
let g:ycm_min_num_of_chars_for_completion=2 " 从第2个键入字符就开始罗列匹配项
let g:ycm_cache_omnifunc=0 " 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_seed_identifiers_with_syntax=1 " 语法关键字补全
nnoremap <F5> :YcmForceCompileAndDiagnostics<CR> "force recomile with syntastic
"nnoremap <leader>lo :lopen<CR> "open locationlist
"nnoremap <leader>lc :lclose<CR> "close locationlist
inoremap <leader><leader> <C-x><C-o>
"在注释输入中也能补全
let g:ycm_complete_in_comments = 1
"在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
"注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR> " 跳转到定义处
可以更加完善代码补全功能。
1、如果出现以下错误:
YouCompleteMe unavailable: requires Vim compiled with Python (2.6+ or 3.3+) support
证明该vim版本并不支持python,用以下命令确认
$ vim --version | grep "python"
结果显示
+cryptv +linebreak -python +vreplace
+cscope +lispindent -python3 +wildignore
表示该vim版本不支持python,-号表示不支持,+号表示支持。
在此网址下载vim源码编译安装即可
ftp://ftp.vim.org/pub/vim/unix/
2、如果还出现一种没有cmake的错误,在yum仓库cmake下载即可:
$ sudo yum install cmake
贴子网址:
http://tieba.baidu.com/p/2672605209?see_lz=1#40874659085l