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

时间:2022-11-30 17:25:23

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

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

tar llvm-3.7.0.src.tar
tar llvm-3.7.0.src.tarmkdir
mkdir llvm-3.7.0.src/tools/clang/
tar xvf cfe-3.7.0.src.tar
cp -rf cfe-3.7.0.src/* llvm-3.7.0.src/tools/clang/
<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>
mkdir llvm-build
cd llvm-build/../llvm-3.7.0.src/configure --enable-optimized --enable-targets=host-only --prefix=/home/yourname/llvm/install
make 
make install

编译安装cmake:

下载cmake最新源码:

./bootstrap
make
make install
进行安装。

3. 安装

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

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

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(视情况而定)
会生成如下文件和目录:

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

部分解释说明:

" 自动补全配置
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查看到语法错误的高亮颜色:

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可忽略。

:highlight SpellBad term=reverse ctermbg=170 gui=undercurl guisp=Red
修改后就不那么刺眼了。
如果想长久生效,需要将命令加入到:~/.vimrc 或者/etc/vimrc中

6.自动不全C++

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