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

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

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

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

先看個補全效果圖前端

還能夠進行路徑自動補全python

錄了張使用YCMultisnips的動態giif補全效果圖,這二者配合起來寫代碼很爽。linux

 

個人vim的配置能夠看這裏c++

YouCompleteMe要求Vim版本7.3.584+,前面已經介紹了編譯安裝Vim7.4方法。 同時YouCompleteMe要求clang版本爲3.3以上。若是想獲取最新的clang可使用SVN,按照其官網上介紹的方法編譯安裝。咱們這裏介紹源碼編譯安裝clang3.3。git

編譯安裝llvm-clang3.3

先下載以下4個源碼: llvm-3.3源碼 clang-3.3源碼 clang-tools-extra-3.3源碼 compiler-rt-3.3源碼 創建目錄:github

mkdir ~/llvm-clang

分別解壓上面下載的4個文件到上述目錄vim

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

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

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.1

ln -s ~/llvm-clang/libcxxabi/lib/libc++abi.so.1.0 ~/llvm-clang/libcxxabi/lib/libc++abi.so

sudo 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 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> " 跳轉到定義處

 

 

 

下面這部分介紹vundle:

相比sublime text2等現代編輯器,Vim缺少默認的插件管理器,全部插件的文件都散佈在~/.vim下的幾個文件夾中,配置vim的過程, 就是在網上不停的搜插件,拷貝到~/.vim下,發現更新,要從新下載從新拷貝,想要刪除某個不須要插件,更是要當心翼翼的不要刪錯。配置出順手的Vim, 須要極大的耐心和運氣。

固然vim社區的活力是不容懷疑的,沒有槍沒有炮大神們本身造。之前使用過tpope的pathogen,使用git submodule和pathogen, 管理插件已經大大簡化。而今天介紹的vundle, 更是把git操做整合進去,用戶須要作的只是去Github上找到本身想要的插件的名字,安裝,更新和卸載均可有vundle來完成了。雖然去發現一個好的插件仍然是一個上下求索的過程,可是用戶已經能夠從安裝配置的繁瑣過程解脫了。
Vundle的具體介紹查看vim.org,或者github repo

安裝和配置

下載vundle

$ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

在~/.vimrc 中添加bundle的配置

set nocompatible                " be iMproved
filetype off                    " required!
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()

" let Vundle manage Vundle
Bundle 'gmarik/vundle'

"my Bundle here:
"
" original repos on github
Bundle 'kien/ctrlp.vim'
Bundle 'sukima/xmledit'
Bundle 'sjl/gundo.vim'
Bundle 'jiangmiao/auto-pairs'
Bundle 'klen/python-mode'
Bundle 'Valloric/ListToggle'
Bundle 'SirVer/ultisnips'
Bundle 'Valloric/YouCompleteMe'
Bundle 'scrooloose/syntastic'
Bundle 't9md/vim-quickhl'
" Bundle 'Lokaltog/vim-powerline'
Bundle 'scrooloose/nerdcommenter'
"..................................
" vim-scripts repos
Bundle 'YankRing.vim'
Bundle 'vcscommand.vim'
Bundle 'ShowPairs'
Bundle 'SudoEdit.vim'
Bundle 'EasyGrep'
Bundle 'VOoM'
Bundle 'VimIM'
"..................................
" non github repos
" Bundle 'git://git.wincent.com/command-t.git'
"......................................
filetype plugin indent on
bundle分爲三類:
  1. 在Github vim-scripts 用戶下的repos,只須要寫出repos名稱
  2. 在Github其餘用戶下的repos, 須要寫出」用戶名/repos名」
  3. 不在Github上的插件,須要寫出git全路徑

安裝插件

打開一個vim, 運行:BundleInstall 

安裝完成後插件就能用了

其它經常使用命令:

  • 更新插件:BundleUpdate
  • 清除再也不使用的插件:BundleClean,
  • 列出全部插件:BundleList
  • 查找插件:BundleSearch

 

 

 

vim7.4的安裝參考https://github.com/Valloric/YouCompleteMe/wiki/Building-Vim-from-source

Mirror of the Vim Mercurial repository  http://code.google.com/p/vim/https://github.com/mingcaoyouxin/vim)

         vim.wikia.com/wiki/Building_Vim

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

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

     http://valloric.github.io/YouCompleteMe/

     http://www.linuxzen.com/vim-dai-ma-bu-quan-he-jian-cha-youcompleteme-syntastic.html

相關文章
相關標籤/搜索