歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Vim自動補全插件----YouCompleteMe安裝與配置

Vim自動補全插件----YouCompleteMe安裝與配置

日期:2017/2/28 14:33:58   编辑:Linux教程

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

YouCompleteMe:一個隨鍵而全的、支持模糊搜索的、高速補全的插件。YCM 由 google 公司搜索項目組的軟件工程師 Strahinja Val Markovic 所開發,YCM 後端調用 libclang(以獲取AST,當然還有其他語言的語義分析庫)、前端由 C++ 開發(以提升補全效 率)、外層由 python 封裝(以成為 vim 插件),它可能是我見過安裝最復雜的 vim 插件了。

推薦閱讀:

Vim學習指南 http://www.linuxidc.com/Linux/2013-08/89096.htm

快速學會 Vi編輯器 http://www.linuxidc.com/Linux/2013-08/88586.htm

強大的Vim 編輯器 http://www.linuxidc.com/Linux/2013-07/87544.htm

在CentOS 6.2上搭建Vim開發環境 http://www.linuxidc.com/Linux/2013-07/87363.htm

Vim 7.4a 發布,全新更快的正則表達式引擎 http://www.linuxidc.com/Linux/2013-07/87035.htm

CentOS 5.4 安裝高亮Vim編輯工具 http://www.linuxidc.com/Linux/2013-06/86508.htm

Vim技巧分享:C語言設置 http://www.linuxidc.com/Linux/2012-12/77124.htm

Ubuntu中設置Vim的行號 http://www.linuxidc.com/Linux/2012-12/75485.htm

Vim編輯器使用基礎教程 http://www.linuxidc.com/Linux/2013-05/84031.htm

先看個補全效果圖

還可以進行路徑自動補全

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源碼 建立目錄:

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2014年資料/4月/8日/Vim自動補全插件----YouCompleteMe安裝與配置

下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm

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標准庫

clang 的標准庫————libc++(接口層)和 libc++abi(實現層)需要安裝頭文件和動態鏈接庫(*.so)。

  • 安裝libc++
            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

參數說明:

  • -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

  1. 下載源碼。使用vundle搞定,在vimrc文件中加入
    Bundle 'Valloric/YouCompleteMe'
  2. 執行命令:
        $ 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
    
  3. 在YouCompleteMe中生成libclang.so和ycm_core.so文件
    執行 make ycm_core,這樣將在~/.vim/bundle/YouCompleteMe/python/目錄下自動生成兩個文件(libclang.so和ycm_core.so)
  4. 這還是不夠的,還必須執行命令:make ycm_support_libs。 這條命令才會生成第三個文件ycm_client_support.so。因為,YouCompleteMe是C/S架構的,所以存在服務器和服務端的說法。
  5. 最後設置.ycm_extra_conf.py文件。
  6. 在.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 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> " 跳轉到定義處

Copyright © Linux教程網 All Rights Reserved