天天看點

Fedora25下vim智能補全插件YouCompleteMe安裝

一、安裝前須知

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簡介。

  1. 使用git下載下傳vundle

    運作指令:

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

這樣插件将被下載下傳到 ~/.vim/bundle/vundle

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