使用Vim編寫程序少不了使用自動補全插件,在linux下有沒有類似VS中的Visual Assist X這么方便快捷的補全插件呢?以前用的是neocomplcache+code_complete+omnicppcomplete,但效果還是不是很好??吹接衁CM后前面的插件可以說拜拜了。
YouCompleteMe:一個隨鍵而全的、支持模糊搜索的、高速補全的插件。YCM 由 google 公司搜索項目組的軟件工程師 Strahinja Val Markovic 所開發,YCM 后端調用 libclang(以獲取AST,當然還有其他語言的語義分析庫)、前端由 C++ 開發(以提升補全效 率)、外層由 python 封裝(以成為 vim 插件),它可能是我見過安裝最復雜的 vim 插件了。
先看個補全效果圖
還可以進行路徑自動補全
錄了張使用YCM和ultisnips的動態giif補全效果圖,這兩者配合起來寫代碼很爽。
我的vim的配置可以看這里
YouCompleteMe要求Vim版本7.3.584+,前面已經介紹了編譯安裝Vim7.4方法。 同時YouCompleteMe要求clang版本為3.3以上。如果想獲取最新的clang可以使用SVN,按照其官網上介紹的方法編譯安裝。我們這里介紹源碼編譯安裝clang3.3。
先下載如下4個源碼:llvm-3.3源碼clang-3.3源碼clang-tools-extra-3.3源碼compiler-rt-3.3源碼建立目錄:
mkdir ~/llvm-clang
分別解壓上面下載的4個文件到上述目錄
tar -xvzf llvm-3.3.src.tar.gz
tar -xvzf compiler-rt-3.3.src.tar.gz
tar -xvzf clang-tools-extra-3.3.src.tar.gz
tar -xvzf cfe-3.3.src.tar.gz
再將工具移動到llvm的相應目錄下,使得clang,clang-tools-extra和compiler-rt就可以和llvm一起編譯了:
mv cfe-3.3.src/ llvm-3.3.src/tools/clang/
mv clang-tools-extra-3.3.src/ llvm-3.3.src/tools/clang/extra/
mv compiler-rt-3.3.src/ llvm-3.3.src/PRojects/compiler-rt/
下載最新的LLVM、clang 及輔助庫源碼可用:
cd ~/llvm-clang svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm cd llvm/tools svn co http://llvm.org/svn/llvm-project/cfe/trunk clang cd ../.. cd llvm/tools/clang/tools svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra cd ../../../.. cd llvm/projects svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt cd ..
返回~/llvm-clang目錄,并新建一個目錄llvm-build專門用于編譯llvm-clang,使得不污染源碼。
mkdir llvm-build
cd llvm-build/
../llvm-3.3.src/configure --enable-optimized
建立編譯環境
此種配置后,llv-clang默認安裝到目錄 /usr/local/ 下, 如果想改變安裝目錄,則加上配置: --prefix=Path 來制定 輸入make -j4
(本人機器為雙核)開始編譯
sudo make install
進行安裝
如要卸載則在該目錄下輸入
sudo make uninstall
安裝好后,輸入clang -v
查看版本信息:
clang 的標準庫————libc++(接口層)和 libc++abi(實現層)需要安裝頭文件和動態鏈接庫(*.so)。
cd ~/llvm-clang svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx cd libcxx/lib ./buildit
頭文件已經生成到~/llvm-clang/libcxx/include/
,要讓 clang 找到必須復制到/usr/include/c++/v1/
cp -r ~/llvm-clang/libcxx/include/ /usr/include/c++/v1/
*.so 文件已生成 ~/llvm-clang/libcxx/lib/libc++.so.1.0,要讓 clang 訪問必須復 制到 /usr/lib/,并創建軟鏈接
ln -s ~/llvm-clang/libcxx/lib/libc++.so.1.0 ~/llvm-clang/libcxx/lib/libc++.so.1 ln -s ~/llvm-clang/libcxx/lib/libc++.so.1.0 ~/llvm-clang/libcxx/lib/libc++.so cp ~/dllvm-clang/libcxx/lib/libc++.so* /usr/lib/
類似,源碼安裝 libc++abi 的頭文件和動態鏈接庫:
cd ~/llvm-clang/ svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi cd libcxxabi/lib ./buildit
頭文件已經生成到~/llvm-clang/libcxxabi/include/
,要讓 clang 找到必須復制到/usr/include/c++/v1/
cp -r ~/llvm-clang/libcxxabi/include/ /usr/include/c++/v1/
*.so 文件已生成~/llvm-clang/libcxx/lib/libc++abi.so.1.0
,要讓 clang 訪問必 須復制到/usr/lib/
,并創建軟鏈接
ln -s ~/llvm-clang/libcxxabi/lib/libc++abi.so.1.0 ~/llvm-clang/libcxxabi/lib/libc++abi.so.1
ln -s ~/llvm-clang/libcxxabi/lib/libc++abi.so.1.0 ~/llvm-clang/libcxxabi/lib/libc++abi.so
cp ~/llvm-clang/libcxxabi/lib/libc++abi.so* /usr/lib/
后續可以通過如下選項進行代碼編譯:
clang++ -std=c++11 -stdlib=libc++ -Werror -Weverything -Wno-disabled-macro- expansion -Wno-float-equal -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno- global-constructors -Wno-exit-time-destructors -Wno-missing-prototypes -Wno-padded -lc++ -lc++abi main.cpp
參數說明:
這些參數在YouCompleteMe的配置文件.ycm_extra_conf.py的flags中設置
安裝配置YouCompleteMeBundle 'Valloric/YouCompleteMe'
$ cd ~ $ mkdir ~/ycm_build $ cd ~/ycm_build $ cmake -G "Unix Makefiles" -DUSE_SYSTEM_LIBclang=ON -DEXTERNAL_LIBCLANG_PATH=CLANG_INSTALL_PATH/libclang.so . ~/.vim/bundle/YouCompleteMe/cpp注意:這里的CLANG_INSTALL_PATH要替換成你自己libclang.so所在的目錄,例如我的是 /ycm_temp/llvmsrc/build/Release+Asserts/lib(即:上面步驟的編譯llvm-clang所生成的),如果安裝了的話在/usr/local/lib/下也有libclang.so,這個目錄也可以。可以通過sudo find / -name "libclang.so" -print查看
make ycm_core
,這樣將在~/.vim/bundle/YouCompleteMe/python/目錄下自動生成兩個文件(libclang.so和ycm_core.so)make ycm_support_libs
。 這條命令才會生成第三個文件ycm_client_support.so。因為,YouCompleteMe是C/S架構的,所以存在服務器和服務端的說法。.ycm_extra_conf.py
文件。" 自動補全配置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 locationlistinoremap <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 = 0nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR> " 跳轉到定義處
新聞熱點
疑難解答