自从转入终端编程,最令我头疼的就是代码补全的问题,vc6.0中有assist X插件,简单安装就可以完美代码补全;vs中自带代码补全功能。到了后台server + 模拟终端编程的模式,完全找不到了方法。代码写的很是痛苦。
痛点:前面定义了一个变量,后面用的时候忽然忘记这个变量的名字了,于是不得不翻回去查这个变量。更有时候这个变量的名字很长,记不住啊,逼得我把名字写在纸上,费了老劲了。
后来使用了ctags,不管怎么样,还是帮了很大忙。但是这种基于文本的匹配很不好,速度慢,准确度低。于是一直向往传说中的YouCompleteMe。于是乎动手配置,结果从下午搞到了凌晨四点半,经历了无数的坑,没有结果。
我没有放弃,继续搞。不断的google,终于找到了几篇感觉靠谱的文章,但是由于公司的权限的限制,我不能用最新版的linux系统,不得不升级gcc、cmake,同时系统预装的python2.6.6我不敢升级,virtualenv又不能用,无奈只好用docker。但是docker又踩了好多的坑,比如docker磁盘空间no left等问题都出现了。
被逼无奈咨询我的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的要求
下面直接开干:
通过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安装,反正基本都满足要求,不用升级。
通过下面的命令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
首先确定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,下面的方法试试,我没测试。
这里不写了,给一个官方连接的文档:
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => YouCompleteMe 代码自动补全
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Bundle 'Valloric/YouCompleteMe'
" youcompleteme 默认tab s-tab 和自动补全冲突
" let g:ycm_key_list_select_completion=['']
" let g:ycm_key_list_select_completion = ['' ]
" let g:ycm_key_list_previous_completion=['']
" let g:ycm_key_list_previous_completion = ['' ]
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 gd :YcmDiags
nnoremap gl :YcmCompleter GoToDeclaration " 跳转到申明处
nnoremap gf :YcmCompleter GoToDefinition " 跳转到定义处
nnoremap gg :YcmCompleter GoToDefinitionElseDeclaration
" 直接触发自动补全
let g:ycm_key_invoke_completion = ''
" 黑名单,不启用
let g:ycm_filetype_blacklist = {
\ 'tagbar' : 1,
\ 'gitcommit' : 1,
\}