git clone --recursive https://github.com/Valloric/YouCompleteMe.git
检查完整性:git submodule update --init --recursive
yum install python-devel
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/
mv clang-tools-extra-3.7.src/ llvm-3.7.src/tools/clang/extra/
mv compiler-rt-3.7.src/ llvm-3.7.src/projects/compiler-rt/
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
进行安装。
拷贝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_support_libs :Built target ycm_support_libs
最后在.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 pumvisible() ? "\" : "\" "回车即选中当前项
"上下左右键的行为 会显示其他信息
inoremap pumvisible() ? "\" : "\"
inoremap pumvisible() ? "\" : "\"
inoremap pumvisible() ? "\\\" : "\"
inoremap pumvisible() ? "\\\" : "\"
"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 = ['']
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 :YcmForceCompileAndDiagnostics "force recomile with syntastic
"nnoremap lo :lopen "open locationlist
"nnoremap lc :lclose "close locationlist
inoremap
"在注释输入中也能补全
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 jd :YcmCompleter GoToDefinitionElseDeclaration " 跳转到定义处
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
修改后就不那么刺眼了。
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