一、安裝前須知
YCM是vim的一款基于語義的智能補全插件。該插件的功能與以下插件相沖突:
- clang_complete
- AutoComplPop
- Supertab
- neocomplcache
雖然可以補全很多種程式設計語言,但YCM主要還是針對c++的,此外它對python的支援也不錯。
作為一個c++程式員,要想盡可能地發揮YCM的功能,推薦安裝以下軟體:
- vim (盡量新的版本,至少 >= 4.3.7,截至 2013-10-27)
- git (作為vundle插件的支援)
- vim 插件 Vundle (參考:https://github.com/gmarik/vundle)
- vim 插件 syntastic 與 ListToggle
- CMake (>=2.8) (為c++項目生成 compile database)
- pylint (進階python文法檢查支援)
如果你的軟體源中的vim版本不夠高,那麼很有可能你需要從源碼安裝vim,參考這裡:
ftp://ftp.vim.org/pub/vim/unix/
二、安裝Vundle
Vundle的安裝:
Vundle是vim的一款進行插件管理的插件。它需要git的支援,git可以在各發行版軟體源内找到并安裝。除了安裝時的一個指令,日常vundle的使用并不需要了解git指令。
以下安裝流程參考自vundle的github簡介。
-
使用git下載下傳vundle
運作指令:
$ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
這樣插件将被下載下傳到 ~/.vim/bundle/vundle
-
編輯.vimrc
在.vimrc末尾添加以下内容:
""""""""""""""""""""" Vundle
set nocompatible
filetype off
set rtp+=~/.vim/bundle/vundle
call vundle#rc()
Bundle 'gmarik/vundle'
Bundle 'Valloric/YouCompleteMe'
Bundle 'Valloric/ListToggle'
Bundle 'scrooloose/syntastic'
filetype plugin indent on
""""""""""""""""""""" Vundle
關鍵的是其中以Bundle開頭的行,每一個Bundle代表一個vim插件,這些省略完整URL插件都是托管在https://github.com上的。如果想要安裝新的插件,在“call vundle#rc()” 和 ”filetype plugin indent on”之間添加新的Bundle ‘插件名稱’即可。
編輯完成後,在vim下運作下面的指令進行插件安裝,請確定你的網絡連接配接正常。
在末行模式輸入
:source ~/.vimrc
:BundleInstall
指令進行安裝。
此時,安裝過程是看不到你安裝進度。是以用以下指令
$ watch -n du -lh ~.vim/bundle
每兩秒對目錄及檔案大小進行觀察,會發現慢慢增大,可粗略檢視安裝進度。
安裝流程比較緩慢,請耐心等待。
如果安裝成功,你将看到Done!的提示字樣。在本例中,插件:YouCompleteMe, syntastic和ListToggle被安裝進你的vim中。
三、YCM文法補全子產品的編譯
YCM文法補全子產品的編譯。
為了讓YCM實作文法補全,還需要編譯文法補全子產品和編輯一個配置檔案。
在終端下執行以下指令:
$HOME/.vim/bundle/YouCompleteMe
并執行 install.sh –clang-completer
即可安裝文法補全子產品。
如果出現問題如下:
In file included from /home/king/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/BoostParts/boost/python/detail/prefix.hpp::,
from /home/king/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/BoostParts/boost/python/handle.hpp:,
from /home/king/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/BoostParts/boost/python/converter/arg_to_python_base.hpp:,
from /home/king/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/BoostParts/libs/python/src/converter/arg_to_python_base.cpp::
/home/king/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/BoostParts/boost/python/detail/wrap_python.hpp::: 緻命錯誤:pyconfig.h:No such file or directory
# include <pyconfig.h>
^
編譯中斷。
BoostParts/CMakeFiles/BoostParts.dir/build.make:: recipe for target 'BoostParts/CMakeFiles/BoostParts.dir/libs/python/src/converter/arg_to_python_base.cpp.o' failed
gmake[]: *** [BoostParts/CMakeFiles/BoostParts.dir/libs/python/src/converter/arg_to_python_base.cpp.o] Error
gmake[]: *** 正在等待未完成的任務....
CMakeFiles/Makefile2:: recipe for target 'BoostParts/CMakeFiles/BoostParts.dir/all' failed
gmake[]: *** [BoostParts/CMakeFiles/BoostParts.dir/all] Error
CMakeFiles/Makefile2:: recipe for target 'ycm/CMakeFiles/ycm_core.dir/rule' failed
gmake[]: *** [ycm/CMakeFiles/ycm_core.dir/rule] Error
Makefile:: recipe for target 'ycm_core' failed
gmake: *** [ycm_core] Error
ERROR: the build failed.
NOTE: it is *highly* unlikely that this is a bug but rather
that this is a problem with the configuration of your system
or a missing dependency. Please carefully read CONTRIBUTING.md
and if you're sure that it is a bug, please raise an issue on the
issue tracker, including the entire output of this script
and the invocation line used to run it.
出現缺少pyconfig.h檔案,我百度過後找到解決方案如下:
下載下傳python-devel
$ sudo yum install python-devel
繼續執行指令:
$HOME/.vim/bundle/YouCompleteMe
即可。
四、配置檔案 .ycm_extra_conf.py
這個檔案(.ycm_extra_conf.py)決定了YCM在進行c系語言(c,c++,etc.) 文法補全時的行為。預設的樣闆配置檔案在
$HOME/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py
對于YCM來說,當打開一個代碼檔案時,插件将順着檔案所在的路徑一直向上查找,如果搜尋到第一個配置檔案将立刻讀入。如果一直搜尋到根目錄依舊無法找到配置檔案,文法補全将不被啟用。由此可知,檔案所在目錄的配置檔案優先級最高,根目錄的優先級最低。
一種比較好的使用方法是在每個項目中建立一個配置檔案,或者将項目根據語言進行分類,在每個語言檔案夾下建立一個配置檔案。
預設配置檔案是支援c++的,但是需要修改一處地方。可以将該檔案拷貝出來并編輯:
$ cp $HOME/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py ~
vim ~/.ycm_extra_conf.py
找到以下内容:
# NOTE: This is just for YouCompleteMe; it's highly likely that your project
# does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR
# ycm_extra_conf IF YOU'RE NOT % YOU NEED IT.
try:
final_flags.remove( '-stdlib=libc++' )
except ValueError:
pass
将之删除後YCM才會補全c++标準庫的内容。
這樣,一個最小能用的配置檔案就出爐了。
五、YCM變量配置
在日常使用中,有一些建議修改的變量。本人的.vimrc中對YCM的配置如下:
" YouCompleteMe
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>
nnoremap <F5> :YcmForceCompileAndDiagnostics<CR>
"let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
"Do not ask when starting vim
let g:ycm_confirm_extra_conf = 0
let g:syntastic_always_populate_loc_list = 1
其中,g:ycm_global_ycm_extra_conf 定義了全局配置檔案,對于懶人來說是個好用的功能。當YCM在向上搜尋的路徑中找不到配置檔案後,YCM将導入全局配置檔案。
g:ycm_confirm_extra_conf 決定了在導入配置時是否需要手動确認。設定為0後YCM就不會老是在啟動vim的時候來煩你了。
本示例中安裝了syntastic插件進行文法檢查,是以g:syntastic_always_populate_loc_list設定為1将更友善地使用其功能。又因為本示例安裝了ListToggle,打開錯誤/警告提示面闆将變成簡單的一個快捷鍵。
在vim中,
<leader>
鍵可以自由設定,一般來說它是逗号”,”
進行至此,可用的快捷鍵如下:
<leader>jd
跳轉到目前函數的定義或聲明。
F5 重新整理錯誤/警告。(其實沒什麼用,每次儲存時候都會自動重新整理的)
<leader>l
打開錯誤/警告提示面闆
<leader>q
打開quickfix視窗
主動調用語義補全的按鍵預設是
<c-space>
,可以通過修改變量g:ycm_key_invoke_completion來設定。
2、我在網上找到的.vimrc配置:
在.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> " 跳轉到定義處
可以更加完善代碼補全功能。
六、vim編輯時候出現的錯誤
1、如果出現以下錯誤:
YouCompleteMe unavailable: requires Vim compiled with Python (+ or +) support
證明該vim版本并不支援python,用以下指令确認
結果顯示
+cryptv +linebreak -python +vreplace
+cscope +lispindent -python3 +wildignore
表示該vim版本不支援python,-号表示不支援,+号表示支援。
在此網址下載下傳vim源碼編譯安裝即可
ftp://ftp.vim.org/pub/vim/unix/
2、如果還出現一種沒有cmake的錯誤,在yum倉庫cmake下載下傳即可:
$ sudo yum install cmake
===========原文轉載自貼吧=============
貼子網址:
http://tieba.baidu.com/p/2672605209?see_lz=1#40874659085l