Vim自動補全外掛程式----YouCompleteMe安裝與配置

來源:互聯網
上載者:User

標籤:

Vim自動補全外掛程式----YouCompleteMe安裝與配置

使用Vim編寫程式少不了使用自動補全外掛程式,在Linux下有沒有類似VS中的Visual Assist X這麼方便快捷的補全外掛程式呢?以前用的是neocomplcache+code_complete+omnicppcomplete,但效果還是不是很好。看到有YCM後前面的外掛程式可以說拜拜了。

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。

  • Vim自動補全外掛程式----YouCompleteMe安裝與配置
    • 編譯安裝IIvm-clang3.3
    • 安裝clang標準庫
    • 安裝配置YouCompleteMe
編譯安裝llvm-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.gztar -xvzf compiler-rt-3.3.src.tar.gztar -xvzf clang-tools-extra-3.3.src.tar.gztar -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-clangsvn co http://llvm.org/svn/llvm-project/llvm/trunk llvmcd llvm/toolssvn co http://llvm.org/svn/llvm-project/cfe/trunk clangcd ../..cd llvm/tools/clang/toolssvn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extracd ../../../..cd llvm/projectssvn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rtcd ..

返回~/llvm-clang目錄,並建立一個目錄llvm-build專門用於編譯llvm-clang,使得不汙染源碼。

mkdir llvm-buildcd 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 -v
安裝clang標準庫

clang 的標準庫————libc++(介面層)和 libc++abi(實現層)需要安裝標頭檔和動態連結程式庫(*.so)。

安裝libc++

cd ~/llvm-clangsvn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxxcd libcxx/lib./buildit

標頭檔已經產生到 ~/llvm-clang/libcxx/include/,要讓 clang 找到必須複製到 /usr/include/c++/v1/

sudo 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.1ln -s ~/llvm-clang/libcxx/lib/libc++.so.1.0 ~/llvm-clang/libcxx/lib/libc++.sosudo cp ~/dllvm-clang/libcxx/lib/libc++.so* /usr/lib/

類似,源碼安裝 libc++abi 的標頭檔和動態連結程式庫:

cd  ~/llvm-clang/svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabicd libcxxabi/lib./buildit

標頭檔已經產生到 ~/llvm-clang/libcxxabi/include/,要讓 clang 找到必須複製到 /usr/include/c++/v1/

sudo 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.1ln -s ~/llvm-clang/libcxxabi/lib/libc++abi.so.1.0 ~/llvm-clang/libcxxabi/lib/libc++abi.sosudo 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

參數說明:

  • -std=c++11: 使用 C++11 新特性;
  • -stdlib=libc++: 指定使用 clang 的標準庫標頭檔 /usr/include/c++/v1/;
  • -Werror: 將所有編譯警告視為編譯錯誤;
  • -Weverything: 開啟所有編譯警告選項。在 GCC 中,無法通過單個選項開啟所有 編譯警告,必須繁瑣的同時指定 -Wall、-Wextra、以及大量分散的其他選項,為此clang 新增了 -Weverything。當然,有些警告意義不大,完全可忽略,如下;
  • -Wno-disabled-macro-expansion:禁止使用宏運算式,忽略此警告;
  • -Wno-float-equal:浮點類型不應使用 != 和 == 運算子,忽略此警告;
  • -Wno-c++98-compat、-Wno-c++98-compat-pedantic:採用 C++11 新特性的代 碼無法相容 C++98,忽略此警告;
  • -Wno-global-constructors:在 main() 之前存在執行的代碼,忽略此警告;
  • -Wno-exit-time-destructors:在 main() 之後存在執行的代碼,忽略此警告;
  • -Wno-missing-prototypes:雖有函數定義但缺失函數原型,忽略此警告;
  • -Wno-padded:結構體大小應為 4 位元組整數倍,忽略此警告(編譯器自動調整對齊 邊界);
  • -lc++:指定連結 /usr/lib/libc++.so 標準庫;
  • -lc++abi:指定連結 /usr/lib/libc++abi.so 標準庫。注意:這兩個選項非常重 要,缺失將導致連結失敗!

這些參數在YouCompleteMe的設定檔.ycm_extra_conf.py的flags中設定

安裝配置YouCompleteMe
  • 下載源碼。使用vundle搞定,在~/.vimrc檔案中加入 
Bundle ‘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/third_party/ycmd/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查看

  • 在YouCompleteMe中產生libclang.so和ycm_core.so檔案 。執行 make ycm_core,這樣將在~/.vim/bundle/YouCompleteMe/python/目錄下自動產生兩個檔案(libclang.so和ycm_core.so)
  1. make ycm_core
  • 這還是不夠的,還必須執行命令:make ycm_support_libs。 這條命令才會產生第三個檔案ycm_client_support.so。因為,YouCompleteMe是C/S架構的,所以存在伺服器和服務端的說法。
  1. make ycm_support_libs
  • 最後設定.ycm_extra_conf.py檔案。

  不同於很多vim外掛程式,YCM首先需要編譯,另外還需要有配置.在vim啟動後,YCM會找尋當前路徑以及上層路徑的.ycm_extra_conf.py.在~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py中提供了預設的模板.也可以參考我的(就在模板上改改而已).不過這個解決了標準庫提示找不到的問題.

C

C++

  一般來說,在~目錄下放一個預設的模板,而後再根據不同的項目在目前的目錄下再拷貝個.ycm_extra_conf.py(由上面兩個超連結獲得時注意均重新命名為該名字).

  • 在.vimrc中添加配置:
" 自動補全配置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> " 跳轉到定義處

 

本文轉載自:http://www.cnblogs.com/zhongcq/p/3630047.html

參考文章:http://www.junevimer.com/2013/12/11/youcompleteme.html

Vim自動補全外掛程式----YouCompleteMe安裝與配置

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.