您的位置:首页 > 运维架构 > Linux

Centos 7 安装 vim自动补全神器 YouCompleteMe

2016-09-16 23:47 603 查看


1 下载最新的YouCompleteMe

git clone --recursive https://github.com/Valloric/YouCompleteMe.git
检查完整性:git submodule update --init --recursive

yum install python-devel


2. 安装LLVM-clang

clang 是近几年发展得非常好的 C 家族语言 (包括C/C++/Obj-C/Obj-C++) 编译器前端。所谓前端,就是它可以认识 C/C++/Obj-C/ObjC++ 代码,并且把它转化成某种更接近机器指令的形式。理论上说,“某种形式”是语法树,但作为一个工具,clang 实际上会帮助你调用链接器生成可执行代码,这跟 gcc 是一样的。

llvm 是一个通用的编译优化和代码生成平台,它定义了一个中间语言 LLVM IR,只要前端把代码编译成 LLVM IR,就可以使用 llvm 丰富的优化模块和代码生成模块。换句话说,llvm 让“创造一种计算机语言”变成了一个相对容易的事情,这件事情会有深远的影响。libc++ 是针对 clang 特别重写的 C++ 标准库,也算是 clang 的“御用”库了。这就像 libstdc++ 和 gcc 的关系,但 clang 也可以用 libstdc++。

llvm及其套件采用模块化,分布式设计,它的某些组件模块可单独被外部调用完成一些特定功能(例如:clang_complete和YouCompleteMe采用clang来完成自动补全,也是本篇因由)。这与GCC整体设计不同, 这种设计可能也是编译器发展方向。另外听说clang-llvm编译性能更高,生成的代码性能也高,使用范围也越来越大,值得研究一番。官方网站:http://llvm.org/。

下载源码编译安装:

llvm  clang  compiler-rt   clang-tools-extra

[python] view
plain copy

 





wget http://llvm.org/releases/3.7.0/llvm-3.7.0.src.tar.xz  

wget http://llvm.org/releases/3.7.0/cfe-3.7.0.src.tar.xz  

wget http://llvm.org/releases/3.7.0/clang-tools-extra-3.7.0.src.tar.xz  

wget http://llvm.org/releases/3.7.0/compiler-rt-3.7.0.src.tar.xzwget   

[python] view
plain copy

 





tar llvm-3.7.0.src.tar  

tar llvm-3.7.0.src.tarmkdir   

mkdir llvm-3.7.0.src/tools/clang/  

[python] view
plain copy

 





tar xvf cfe-3.7.0.src.tar  

[python] view
plain copy

 





cp -rf cfe-3.7.0.src/* llvm-3.7.0.src/tools/clang/  

[python] view
plain copy

 





<p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 15px; line-height: 27px;"><code style="margin: 0px; padding: 0px;">mv clang-tools-extra-3.7.src/ llvm-3.7.src/tools/clang/extra/</code></p><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 15px; line-height: 27px;">mv compiler-rt-3.7.src/ llvm-3.7.src/projects/compiler-rt/</p>  

[python] view
plain copy

 





mkdir llvm-build  

[python] view
plain copy

 





cd llvm-build/  

../llvm-3.7.0.src/configure --enable-optimized --enable-targets=host-only --prefix=/home/yourname/llvm/install  

[python] view
plain copy

 





make   

[python] view
plain copy

 





make install  

编译安装cmake:
下载cmake最新源码:

[python] view
plain copy

 





./bootstrap  

make  

make install  

进行安装。


3. 安装

拷贝YouCompleteMe到~/.vim/bundle 目录

新建~/ycm_build,并进入目录执行下面命令:

[python] view
plain copy

 





cmake -G "Unix Makefiles" -DUSE_CLANG_COMPLETER=ON -DPATH_TO_LLVM_ROOT=/home/yourname/llvm/install(LLVM-clang安装位子)~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ -DEXTERNAL_LIBCLANG_PATH=/home/yourname/llvm/build/Release+Asserts/lib/libclang.so(视情况而定)  

会生成如下文件和目录:

[python] view
plain copy

 





BoostParts  CMakeCache.txt  CMakeFiles  cmake_install.cmake  compile_commands.json  Makefile  ycm  

执行make ycm_core进行编译,提示:Built target ycm_core 编译成功。

make ycm_support_libs  :Built target ycm_support_libs


4.配置

最后在.vimrc 中加入:execute pathogen#infect()

详细配置可以参考官方解释:https://github.com/Valloric/YouCompleteMe#options

部分解释说明:

[python] view
plain copy

 





" 自动补全配置  

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> " 跳转到定义处  


5.修改vim高亮颜色

vim默认的语法错误高亮颜色很刺眼而且看不清字,经过一番搜索,找到修改方法。

在末行模式输入:highlight 会显目前所有颜色的配置。

同样可以在后面跟参数,进行相关修改。

通过highlight查看到语法错误的高亮颜色:

[python] view
plain copy

 





FoldColumn     xxx term=standout ctermfg=4 ctermbg=248 guifg=DarkBlue guibg=Grey  

DiffAdd        xxx term=bold ctermbg=224 guibg=LightBlue  

DiffChange     xxx term=bold ctermbg=225 guibg=LightMagenta  

DiffDelete     xxx term=bold ctermfg=12 ctermbg=159 gui=bold guifg=Blue guibg=LightCyan  

DiffText       xxx term=reverse cterm=bold ctermbg=9 gui=bold guibg=Red  

SignColumn     xxx term=standout ctermfg=4 ctermbg=248 guifg=DarkBlue guibg=Grey  

Conceal        xxx ctermfg=7 ctermbg=242 guifg=LightGrey guibg=DarkGrey  

SpellBad       xxx term=reverse ctermbg=224 gui=undercurl guisp=Red  

SpellCap       xxx term=reverse ctermbg=81 gui=undercurl guisp=Blue  

SpellRare      xxx term=reverse ctermbg=225 gui=undercurl guisp=Magenta  

SpellLocal     xxx term=underline ctermbg=14 gui=undercurl guisp=DarkCyan  

Pmenu          xxx ctermfg=0 ctermbg=225 guibg=LightMagenta  

PmenuSel       xxx ctermfg=0 ctermbg=7 guibg=Grey  

PmenuSbar      xxx ctermbg=248 guibg=Grey  

PmenuThumb     xxx ctermbg=0 guibg=Black  

TabLine        xxx term=underline cterm=underline ctermfg=0 ct  

左边那一列就是可针对其进行设置的关键词,中间是样式的效果,右边是设置的具体参数。其中gui/guibg等是对gvim的设置,如果不用gvim可忽略。

[python] view
plain copy

 





:highlight SpellBad term=reverse ctermbg=170 gui=undercurl guisp=Red  

修改后就不那么刺眼了。
如果想长久生效,需要将命令加入到:~/.vimrc 或者/etc/vimrc中


6.自动不全C++

[python] view
plain copy

 





cd /usr/include/c++/4.8  

ctags -R --c++-kinds=+l+x+p --fields=+iaSl --extra=+q --language-force=c++ -f stdcpp.tags  

然后,让 OmniCppComplete 成功识别标签文件中的标准库接口。C++ 标准库源码文件中使用了 _GLIBCXX_STD 名字空间(GNU C++ 标准库的实现是这样,如果你使用其他版本的标准库,需要自行查找对应的名字空间名称),标签文件里面的各个标签都嵌套在该名字空间下,所以,要让 OmniCppComplete 正确识别这些标签,必须显式告知 OmniCppComplete 相应的名字空间名称。在.vimrc中增加如下内容:
let OmniCpp_DefaultNamespaces = ["_GLIBCXX_STD"]


最后,在 vim 中引入该标签文件。在 .vimrc 中增加如下内容:
set tags+=/usr/include/c++/4.8/stdcpp.tags
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: