VIM插件: YouCompleteMe[代码自动补全]

时间:2021-02-17 17:22:04

自从转入终端编程,最令我头疼的就是代码补全的问题,vc6.0中有assist X插件,简单安装就可以完美代码补全;vs中自带代码补全功能。到了后台server + 模拟终端编程的模式,完全找不到了方法。代码写的很是痛苦。

痛点:前面定义了一个变量,后面用的时候忽然忘记这个变量的名字了,于是不得不翻回去查这个变量。更有时候这个变量的名字很长,记不住啊,逼得我把名字写在纸上,费了老劲了。

后来使用了ctags,不管怎么样,还是帮了很大忙。但是这种基于文本的匹配很不好,速度慢,准确度低。于是一直向往传说中的YouCompleteMe。于是乎动手配置,结果从下午搞到了凌晨四点半,经历了无数的坑,没有结果。

我没有放弃,继续搞。不断的google,终于找到了几篇感觉靠谱的文章,但是由于公司的权限的限制,我不能用最新版的linux系统,不得不升级gcc、cmake,同时系统预装的python2.6.6我不敢升级,virtualenv又不能用,无奈只好用docker。但是docker又踩了好多的坑,比如docker磁盘空间no left等问题都出现了。

VIM插件: YouCompleteMe[代码自动补全]

被逼无奈咨询我的leader,他了解到我用的安装系统是centos6.6,他说你可以用最新版的Ubuntu系统试试,不要用centos,更不能用6.6版本,不然要升级的东西太多,太费劲。

所以最后的方法是:在16.04的Ubuntu系统上安装YCM,安装到docker中,然后放到生产环境的机器中编写代码。

为了避开docker给我带来的麻烦,我决定先用VMware + Ubuntu16.04试试,于是下载、安装。安装之后我发现,Ubuntu16.04就是好,cmake、gcc、python等软件包的版本都符合YCM的要求,直接安装YCM就可以了。

Ubuntu16.04的一些软件可能没有安装,但是通过apt-get可以直接安装很高版本的软件包,直接符合YCM的要求


下面直接开干:

1. 安装用到的软件包

通过apt-get直接获得高版本的软件包,不用再次升级(yum的软件包基本都是很低的版本的软件包,坑爹)。

sudo apt-get install vim
sudo apt-get install git
sudo apt-get install subversion
sudo apt-get install python-dev libxml2-dev libxslt-dev
sudo apt-get install gcc
sudo apt-get install cmake

apt-get 安装软件简直不能再爽了,yum 安装然后在升级,真是太费劲,特别是升级gcc真的不简单啊,各种libstdc++ 找不到。

大概就是这些安装包,具体缺什么在apt-get安装,反正基本都满足要求,不用升级。

2. 安装Vundle

通过下面的命令clone一个Vundle:

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

顺便把下面的代码放到~/.vimrc 中:

set nocompatible " be iMproved, required filetype off " required set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() Plugin 'VundleVim/Vundle.vim' Plugin 'Valloric/YouCompleteMe' call vundle#end() " required filetype plugin indent on " required

3. 安装YouCompleteMe

第一步:

首先确定YCM的安装方式,分为两种:使用Vundle和使用源代码安装,注意此步仅仅相当于安装了一个空壳,并不能使用YCM,还需要后续步骤。

(1)使用Vundle安装

  Vundle是Vim的一款管理插件的插件,安装详细请参照Vundle官方网站。注意把官网下方的配置文件放入你自己的.vimrc里,可以把不需要的插件去除。 在你的vimrc中添加Plugin ‘Valloric/YouCompleteMe’,然后执行:PluginInstall。 注:使用Vundle更新YCM的时候可能需要重新编译,引用来自官方的提示:
  

YCM is a plugin with a compiled component. If you update YCM using Vundle and the ycm_support_libs library APIs have changed (happens rarely), YCM will notify you to recompile it. You should then rerun the install process.

不推荐这种安装方式,看不到进度,不知道啥时候在哪里出错了。

(2)使用源码安装

#下载YouCompleteMe源码
git clone https://github.com/Valloric/YouCompleteMe.git ~/.vim/bundle/YouCompleteMe
cd YouCompleteMe/ 
#获取YCM的依赖包 
git submodule update --init --recursive
#然后在在vimrc文件中加入
Plugin 'Valloric/YouCompleteMe'  

第二步:

(1)快速安装

此处给出支持C-family的命令,其他的选项见参考文档。

cd ~/.vim/bundle/YouCompleteMe  
./install.py --clang-completer

官方文档上说这种方式可能会出错,但是应该先尝试一下。因为Ubuntu16.04通过apt-get安装的软件的版本都很高,所以有很大的可能性成功。中间出了什么错,再google就可以了。反正我亲测,这种方法是可以的。

在fast installation中遇到一个错误,就是提示python与C语言的连接的头文件,google了一下发现少安装了一个python-dev,通过apt-get搞定,继续编辑,最后就成功了。

(2)完整安装

如果你真的没办法只能用centos,下面的方法试试,我没测试。
这里不写了,给一个官方连接的文档:

4. YouCompleteMe配置:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => YouCompleteMe 代码自动补全 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Bundle 'Valloric/YouCompleteMe' " 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>']
set completeopt=longest,menu
let g:ycm_confirm_extra_conf=0      " 关闭加载.ycm_extra_conf.py提示 let g:ycm_complete_in_comments = 1 "在注释输入中也能补全
let g:ycm_complete_in_strings = 1   "在字符串输入中也能补全 let g:ycm_collect_identifiers_from_tags_files=1 " 开启 YCM 基于标签引擎
let g:ycm_collect_identifiers_from_comments_and_strings = 1   "注释和字符串中的文字也会被收入补全 let g:ycm_seed_identifiers_with_syntax=1 "语言关键字补全, 不过python关键字都很短,所以,需要的自己打开
let g:ycm_collect_identifiers_from_tags_files = 1
let g:ycm_min_num_of_chars_for_completion=2                     " 从第2个键入字符就开始罗列匹配项 let g:ycm_path_to_python_interpreter='/usr/bin/python' " 引入,可以补全系统,以及python的第三方包 针对新老版本YCM做了兼容
" old version if !empty(glob("~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py")) let g:ycm_global_ycm_extra_conf = "~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py" endif " new version
if !empty(glob("~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py"))
    let g:ycm_global_ycm_extra_conf = "~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py"
endif

"mapping nmap <leader>gd :YcmDiags<CR> nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR> " 跳转到申明处
nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>            " 跳转到定义处 nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR> " 直接触发自动补全
let g:ycm_key_invoke_completion = '<C-Space>'
" 黑名单,不启用 let g:ycm_filetype_blacklist = { \ 'tagbar' : 1, \ 'gitcommit' : 1, \} 

5. 参考链接:

  1. http://davisvigneault.com/2016/02/youcompleteme-rocks/
  2. http://wsmmsh.github.io/2016/02/02/Centos%E5%AE%89%E8%A3%85YouCompleteMe/
  3. http://www.cnblogs.com/xiehongfeng100/p/4651972.html
  4. http://btorpey.github.io/blog/2015/01/02/building-clang/
  5. http://clang.llvm.org/get_started.html
  6. http://llvm.org/docs/GettingStarted.html#getting-started-quickly-a-summary