1. 程式人生 > >Vim智慧補全外掛YouCompleteMe安裝

Vim智慧補全外掛YouCompleteMe安裝

以下的內容來源與官方的手冊,內容是英文版的,自己整理了一下。後面的關於YCM的介紹只翻譯了部分,更多的內容包括最終要的選項部分,只能下次機會再翻譯了。

在安裝和配置的整個過程中,這兩篇文章給了我很大的幫助:

一、準備

1:確保Vim的版本至少是Vim73.584,且支援Python2指令碼。
檢視已安裝的vim的版本:

 vim --version
檢視是否支援python2:進入vim,命令:echo has('python'),檢視左下角,輸出為1,則表示支援。如果為0,則需要重新編譯安裝vim,在編譯時新增python支援。

二、安裝

2:安裝YCM,通過Vundle或者Pathongen,官網上推薦用Vundle,大多安裝指導的資料也都是基於Vundle。
通過Vundle安裝YCM的方法:
在.vimrc中新增:
Bundle 'Valloric/YouCompleteMe'
然後進入vim,執行:BundleInstall
記住:如果用Vundle更新YCM,yum_support_lib庫API改變了,YCM會提醒你重新編譯它。


3:如果不需要對C家族的語言進行語義支援,則跳過這一步。
下載最新版的libclang。Clang是一個開源編譯器,能夠編譯C/C++/Objective-C++。Clang提供的libclang庫是用於驅動YCM對這些語言的語義支援。YCM需要版本至少為3.4的libclang,但是理論上3.2+版本也行。也可以使用系統libclang,如果確定是3.3版本或者更高。官網上推薦下載llvm.org官網的二進位制檔案。連結::,確保選對適合自己系統的包。


4編譯YCM需要的ycm_support_libs庫
需要cmake,如果未安裝,安裝之:
:sudo apt-get install build-essential cmake
確保python標頭檔案已安裝:sudo apt-get install python-dev
接下來假設你已經通過Vundle安裝了YCM,那麼YCM的目錄為:~/.vim/bundle/YouCompleteMe
接下來建立一個資料夾用來放置編譯檔案:
 cd ~
 mkdir ycm_build
 cd ycm_build
下一步生成makefile,這一步很重要,有點複雜。
1)如果不需要C族語言的語義支援:在ycm_build目錄下執行:
:~/ycm_build$ cmake -G "Unix Makefiles" . ~/.vim/bundle/YouCompleteMe/cpp
2)如果需要C族語言的語義支援,還得分幾種情況:
(1)假如你從llvm的官網下載了LLVM+Clang,然後解壓到:~/ycm_temp/llvm_root_dir (該目錄下有 bin, lib, include 等資料夾),然後執行:
:~/ycm_build$ cmake -G "Unix Makefiles" -DPATH_TO_LLVM_ROOT=~/ycm_temp/llvm_root_dir ~/.vim/bundle/YouCompleteMe/cpp
(2)如果想用系統的libclang:
:~/ycm_build$ cmake -G "Unix Makefiles" -DUSE_SYSTEM_LIBCLANG=ON ~/.vim/bundle/YouCompleteMe/cpp
(3)如果想用自定義的libclang:
:~/ycm_build$ cmake -G "Unix Makefiles" -DEXTERNAL_LIBCLANG_PATH=/path/to/libclang.so ~/.vim/bundle/YouCompleteMe/cpp  
/path/to/libclang.so這部分填入你自己的路徑。


由於我採用了通過源直接安裝最新版的LLVM+Clang,所以用第二種方法:
:~/ycm_build$ cmake -G "Unix Makefiles" -DUSE_SYSTEM_LIBCLANG=ON ~/.vim/bundle/YouCompleteMe/cpp
一下是執行該命令後的部分輸出內容,可以看到using external libclang那一行中找到了libclang.so
-- The C compiler identification is GNU 4.8.1
-- The CXX compiler identification is GNU 4.8.1
.............
Your C++ compiler supports C++11, compiling in that mode.
-- Found PythonLibs: /usr/lib/i386-linux-gnu/libpython2.7.so (found suitable version "2.7.5+", minimum required is "2.6") 
Using libclang to provide semantic completion for C/C++/ObjC
Using external libclang: /usr/lib/llvm-3.4/lib/libclang.so
-- Found PythonInterp: /usr/bin/python (found version "2.7.5") 
.............
-- Build files have been written to: /home/username/ycm_build

然後執行:
:~/ycm_build$ make ycm_support_libs
迄今為止的操作都是照著官方的手冊上的指導做的,我自己這麼做成功了。看到別人的帖子,有說make失敗的,需要先make ycm_core,再make ycm_support_libs。如果失敗了,先檢查一下libclang.so這部分是不是路徑錯了,再試試這種方法。

三、其他安裝

Ubuntu Linux X64超快安裝
最好還是完整安裝,這種快速安裝未必適合所有人。安裝之前,同樣也要確定滿足以上所述的vim版本、python支援等條件。
編譯YCM,如果需要對C-family的語義支援:
cd ~/.vim/bundle/YouCompleteMe
./install.sh --clang-completer
如果不需要對C-family的語義支援:
cd ~/.vim/bundle/YouCompleteMe
./install.sh
如果需要支援C#,新增 --omnisharp-complete 


四、YCM的配置和使用

一般的使用:
1)如果需要補全的詞太長,繼續輸入就好,YCM會根據你輸入的重新整理補全。
2)關於大小寫的過濾問題,如果你色呼入“foo”,則會匹配“Foo”和“foo”,如果輸入“Foo”則會匹配“FOO”和“Foo”。
3)使用TAB鍵接受補全,一直按TAB則會迴圈所有的匹配補全項。shift+TAB則會反向迴圈。注意:如果使用控制檯Vim(非GVim或MacVim等),控制檯不會將shift+Tab傳遞給Vim,因此會無反應,需要重新對映按鍵。

瞭解一些關於YCM如何實現補全,避免困惑。YCM有好幾個補全引擎:
(1)基於識別符號的補全器,它會收集當前檔案和你訪問的其他檔案還有tags檔案的識別符號,然後在你輸入時進行搜尋,識別符號被放入相應檔案型別組裡。
(2)語義引擎。基於libclang的補全為C族語言提供語義補全。基於Jedi的補全為Python提供補全。還有基於omnifunc的補全器,使用Vim的omnicomplete系統提供的資料,在本地的YCM不存在適合當前語言的補全器時使用。
(3)其他,如:UltiSnips和檔案路徑補全器。

YCM是Client-sever架構的,Vim這部分的YCM只是很小的一個客戶端,與具有大量邏輯和功能的ycmd HTTP+JSON互動。server在你開啟或關閉Vim是自動開啟或關閉。

通用的語義補全用法:
可以使用Ctrl+Space來觸發補全。
C族語義補全引擎的使用:
YCM會尋找當前開啟的檔案的同級目錄下或上級目錄中的ycm_extra_conf.py這個檔案,找到後會載入為Python模組,且只加載一次。YCM呼叫該模組中的FalgsForFile方法。該模組必須提供帶有編譯當前檔案的必要資訊的這個方法。

×××××××××××××××××××××××××××××××××××分割線××××××××××××××××××××××××××××××××××××××××××××

如上所述,YCM在補全時需要ycm_extra_conf.py這個檔案,所以我們需要對這個檔案進行改動,以滿足基本C族語言的補全需要。在~/.vim/bundle/YouCompleteMe/cpp/ycm下找到該檔案的模板,在flag裡面新增如下內容(系統檔案用-isyetem,第三方檔案用 -I):

'-isystem',
'/usr/include',
'-isystem',
'/usr/include/c++/',
'-isystem',
'/usr/include/i386-linux-gnu/c++'

    如果要讓其對C++標準庫補全生效,還要把配置檔案中的這幾行(從try到pass這4行)註釋掉:

# 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 100% SURE YOU NEED IT.
try:
  final_flags.remove( '-stdlib=libc++' )
except ValueError:
  pass

        最好先把YCM作者提供的模板備份一下再做改動,然後將改動好的檔案就放在原來的位置,作為全域性的ycm_extra_conf.py,這樣平時寫個小Cpp的程式就不需要再單獨建立一個。要使之生效,需要在.vimrc裡面設定YCM相應的選項,此選項會在下面配置部分詳細說明。對於特定的工程,將其拷貝到工程資料夾下,然後在這基礎上再修改。不用擔心工程資料夾下的ycm_extra_conf.py會和全域性的衝突,因為開啟vim之後,ycm會現在工程資料夾下搜尋該檔案,此處的配置檔案優先順序最高。

五、我的YCM配置

在.vimrc檔案中新增針對YCM的設定:

"設定error和warning的提示符,如果沒有設定,ycm會以syntastic的
" g:syntastic_warning_symbol 和 g:syntastic_error_symbol 這兩個為準
let g:ycm_error_symbol='>>'
let g:ycm_warning_symbol='>*'
"設定跳轉的快捷鍵,可以跳轉到definition和declaration
nnoremap <leader>gc :YcmCompleter GoToDeclaration<CR>
nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>
nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>
"nmap <F4> :YcmDiags<CR>
"設定全域性配置檔案的路徑
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py'
"開啟基於tag的補全,可以在這之後新增需要的標籤路徑
let g:ycm_collect_identifiers_from_tags_files = 1
"開啟語義補全
let g:ycm_seed_identifiers_with_syntax = 1
"在接受補全後不分裂出一個視窗顯示接受的項
set completeopt-=preview
"不顯示開啟vim時檢查ycm_extra_conf檔案的資訊
let g:ycm_confirm_extra_conf=0
"每次重新生成匹配項,禁止快取匹配項
let g:ycm_cache_omnifunc=0
"在註釋中也可以補全
let g:ycm_complete_in_comments=1
"輸入第一個字元就開始補全
let g:ycm_min_num_of_chars_for_completion=1
"不查詢ultisnips提供的程式碼模板補全,如果需要,設定成1即可
let g:ycm_use_ultisnips_completer=0

<Ctrl>+<Space>這個快捷鍵保留給omniCppCompleter,雖然開啟了ycm補全,這個功能依然可用。 更多關於YCM的配置選項和其他資訊,檢視YCM的幫助文件就好。
針對.ycm_extra_conf.py的配置: 都是別人寫的,可以弄下來,針對自己的情況做些修改,儲存在Templates資料夾裡面,下次需要的話建立一個就很方便。