(轉)Vim自動補全神器:YouCompleteMe


原文出處:http://blog.jobbole.com/58978/

 

第一次聽說這個插件還是在偶然的情況下看到別人的博客,聽說了這個插件的大名。本來打算在實訓期間來完成安裝的,無奈網實在不給力,也就拖到了回家的時候。在開始准備工作的時候就了解到這個插件不是很容易安裝,安裝的時候果然名不虛傳。(關於這方面的內容,請查看另一篇文章)不過,有付出總有回報,安裝之后用上這個插件,真心為這個插件的強大所折服。

那這個插件有何不同?

YouCompleteMe的特別之處

基於語義補全

總所周知,Vim是一款文本編輯器。也就是說,其最基礎的工作就是編輯文本,不管該文本的內容是什么。在Vim被程序員所使用后,其慢慢的被肩負了與IDE一樣的工作,文本自動補全(ie.acp,omnicppcompleter),代碼檢查(Syntastic)等等工作。

針對文本自動補全這個功能來說,主要有兩種實現方式。

  • 基於文本

我們常用的omnicppcompleter,acp,vim自帶的c-x, c-n的實現方式就是基於文本。更通俗的說法,其實就是一個字:

其通過文本進行一些正則表達式的匹配,再根據生成的tags(利用ctags生成)來實現自動補全的效果。

  • 基於語義

顧名思義,其是通過分析源文件,經過語法分析以后進行補全。由於對源文件進行分析,基於語義的補全可以做到很精確。但是這顯然是vim所不可能支持的。而且經過這么多年發展,由於語法分析有很高的難度,也一直沒有合適的工具出現。直到,由apple支持的clang/llvm橫空出世。YouCompleteMe也正是在clang/llvm的基礎上進行構建的。

整合實現了多種插件

  • clang_complete
  • AutoComplPop
  • Supertab
  • neocomplcache
  • Syntastic(類似功能,僅僅針對c/c++/obj-c代碼)

支持語言

  • c
  • c++
  • obj-c
  • c#
  • python

對於其他的語言,會調用vim設置的omnifunc來匹配,因此同樣支持php,ruby等語言。

已知的有 * javascript —-tern_for_vim * ruby/java —-eclim

使用效果圖

ycmsdfsdgeerg

使用感受

  • 和IDE一樣,自動補全,
  • 根據include的文件進行補全
  • 不用再蹩腳的生成tags
  • 補全非常精准,而且速度很快,不會有延遲(以前在大項目上,acp用起來實在是很卡)
  • 支持類似tags的跳轉,跳到定義處以及使用處
  • 出錯提示很智能,並且用起來真的是如絲般柔滑,不用輸入:w進行強制檢測

安裝

說完了那么多好處,就要說到安裝了。不同於以往其他vim插件,YCM是一款編譯型的插件。在下載完后,需要手動編譯后才能使用。對應其他的插件來說,僅僅就是把.vim的文件丟到相應文件夾下就可以。而這也加大了使用YCM的難度。

安裝准備

  • 最新版的Vim(7.3.584+),編譯時添加+python標志(已經安裝的可以通過vim --version查看)
  • cmake(mac可以通過homebrew安裝,brew install cmake,ubuntu可以通過sudo apt-get install cmake)
  • 安裝vundle插件,用於安裝管理vim的插件

mac下快速安裝

.vimrc中添加下列代碼

保存退出后打開vim,在正常模式下輸入

等待vundle將YouCompleteMe安裝完成

而后進行編譯安裝:

如果不需要c-family的補全,可以去掉--clang-completer。如果需要c#的補全,請加上--omnisharp-completer。

正常來說,YCM會去下載clang的包,如果已經有,也可以用系統--system-libclang。

就這樣,安裝結束。打開vim,如果沒有提示YCM未編譯,則說明安裝已經成功了。

手動編譯安裝

安裝的腳本並不是什么時候都好用,至少對我來說是這樣的。安裝完之后出現了問題,參考issue#809

在用:BundleInstall安裝完成或者使用

獲取最新的倉庫,而后使用git submodule update --init --recursive確認倉庫的完整性后,開始安裝流程。

  1. 下載最新的clang二進制文件 YCM要求clang版本 > 3.2,一般來說都是下載最新的
  2. 安裝python-dev.(ubuntu下使用sudo apt-get install python-dev,mac下默認提供,否則請安裝command line tools)
  3. 編譯

    這里需要注意的是,~/ycm_temp/llvm_root_dir中包含的是根據第一步下載的壓縮包解壓出來的內容(包括includebin等等文件)。

這樣就完成了,開始感受YCM提供的完全不遜色於大型IDE所提供的自動補全功能吧。

配置

不同於很多vim插件,YCM首先需要編譯,另外還需要有配置。在vim啟動后,YCM會找尋當前路徑以及上層路徑的.ycm_extra_conf.py.在~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py中提供了默認的模板。也可以參考我的(就在模板上改改而已)。不過這個解決了標准庫提示找不到的問題。

一般來說,我會在~目錄下放一個默認的模板,而后再根據不同的項目在當前目錄下再拷貝個.ycm_extra_conf.py。

 

YouCompleteMe提供的其他功能

YCM除了提供了基本的補全功能,自動提示錯誤的功能外,還提供了類似tags的功能:

  • 跳轉到定義GoToDefinition
  • 跳轉到聲明GoToDeclaration
  • 以及兩者的合體GoToDefinitionElseDeclaration

可以在.vimrc中配置相應的快捷鍵。

另外,YCM也提供了豐富的配置選項,同樣在.vimrc中配置。具體請參考

同時,YCM可以打開location-list來顯示警告和錯誤的信息:YcmDiags。個人關於ycm的配置如下:

YCM提供的跳躍功能采用了vim的jumplist,往前跳和往后跳的快捷鍵為Ctrl+O以及Ctrl+I。

總結

YouCompleteMe是我用過的最爽的一個自動補全的插件了。之前使用acp時,遇到大文件基本上就卡死了,以至於都不怎么敢使用。由於YCM使用的時C/S結構,部分使用vim腳本編寫,部分認為原生代碼,使得跑起來速度飛快。

拋棄Vim自帶的坑爹的補全吧,拋棄ctags吧,拋棄cscope吧,YCM才是終極補全神器。

在安裝過程中,我也遇到了不少的坑。一會會發一篇解決這些坑的文章。

最后祝大家碼年順利,一碼平川,碼到功成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM