vim中的殺手級插件: YouCompleteMe[轉載]

Vim代碼補全現狀

在漫長的Vim發展歷史中,代碼補全一直是比較被忽視的環節,相比衆多IDE,vim自己的代碼提示功能包括其衆多補全插件顯得無比簡陋, 這是由於vim的先天不足,它是文本編譯器,不能理解程序語意。引用王垠的一段文字:python

「文本編輯器」這種東西通常都不真正的理解程序語言。不少 Emacs 和 vi 的用戶覺得用 etags 和 ctags 這樣的工具就能讓他們「跳轉到定義」,然而這些 tags 工具其實只是對程序的「文本」作一些愚蠢的正則表達式匹配。它們根本沒有對程序進行 parse,因此其實只是在進行一些「瞎猜」。簡單的函數定義它們也許能猜對位置,可是對於有重名的定義,或者局部變量的時候,它們就力不從心了。linux

《編輯器與IDE》www.yinwang.org/blog-cn/2013/04/…c++

或許對於python,PHP等動態語言,由於自己的語言特性和豐富的工具支持,也能作到不錯的補全效果,但對於C/C++代碼的補全, AutoComplPop, omnicppcomplete, neocomplcache等插件的確都是在」瞎猜」。
git

還有一個緣由是沒有大牛來作這些功能。在漫長的Vim或emacs歷史中,它都是掌握在少數精英程序員手裏,擴展它都須要必定的專業知識,我輩普通程序員只是在使用它。而代碼補全並非大牛們的必須,我曾經和一個瑞典的PSE作Pair Programming, 只使用emacs和grep等linux命令,他就能夠在整個工程裏穿梭自如,經常使用庫的調用瞭然於心,代碼結構清晰,幾乎沒有語法和拼寫錯誤。估計他看到我花裏胡哨的vim, 還用代碼提示,內心也是一陣鄙視吧。因此儘管大牛們讓emacs能夠煮咖啡,vim能夠發微博,可是vim和emacs的代碼提示一如既往的爛了二三十年。程序員

在Apply公司支持的LLVM/clang誕生後,事情迎來了起色。clang強大語義分析能力,爲C/C++/Object-C源代碼級別的分析和轉化提供了可能,基於clang的語意補全插件開始在vim和emacs上出現。github

YouCompleteMe

YouCompleteMe是一個比較新Vim代碼補全插件,能夠基於clang爲C/C++代碼提供代碼提示。它安裝配置簡單,Bug 不多。 對C/C++來講youcompleteme如今應該是最好選擇,藉助clang的強大功能,補全效率和準確性極高,並且能夠模糊匹配(見下面的demo)。無論你的C++代碼用什麼怪異的寫法,只要能編譯經過,都能補全,即便是C++11的lambda和auto都沒有障礙,比codeblock這些根據tag index補全的IDE都要強大。正則表達式

YCM的安裝配置

YCM須要最新版本Vim(7.3.584)的支持,從代碼編譯Vim的方法看這裏
使用Vundle安裝 youcompleteme後,須要先編譯才能使用。vim

1
2
cd ~/.vim/bundle/YouCompleteMe
./install.sh --clang-completer

語意補全要正確工做,須要配置好.ycm_extra_conf.py文件,模板在這裏。能夠把這個文件放在項目的根目錄下,打開項目文件時,YCM會循環向上搜索並加載這個文件,或者在vimrc文件中加入編輯器

1
let g:ycm_global_ycm_extra_conf = 'your path to .ycm_extra_conf.py'

若是.ycm_extra_conf.py中include path等配置沒有問題,YCM已經能夠工做了。
YCM更新很頻繁,最近版本已經能夠和UltiSnip整合了。
## 2013-08-14更新
### 集成Syntastic
YCM很早就支持集成Syntastic了,上面demo裏面,代碼前的出現紅色叉叉,就是YCM結合Syntastic爆出的語法錯誤。剛開始用YCM的時候,更看重其代碼補全功能,Syntastic沒放在心上,結果發現越用越離不開了。當編寫C++代碼的時候,每次光標懸停2秒鐘以上的時候,YCM都會在後臺掃描你當前的文件,你剛剛輸入的代碼有什麼編譯錯誤,立刻就能顯示出來,及時的改掉,再也不積累到最後編譯的時候。固然這是現代IDE的標配功能,vim中也有插件能夠實現,可是有了YCM後,再用vundle安裝Syntastic,甚至不用任何配置就實現了這些功能,實在是太方便了。
ide

代碼跳轉

YCM支持代碼跳轉了,又一項對程序開發極有用的功能,如今支持c, cpp, object-c, object-cpp, python代碼跳轉到聲明和實現。特別對c和c++, 這個跳轉可不是像基於ctags的那些插件,常常讓你在一大堆重名的tag里人肉搜索,十跳九不中。得利於clang的強大功能,YCM的代碼跳轉幾乎沒有失手,固然前提是你要設置好.ycm_extra_conf.py,代碼被YCM解析時沒太多編譯錯誤。

主要功能是3個YcmCompleter的subcommands:

  • GoToDeclaration
  • GoToDefinition
  • GoToDefinitionElseDeclaration

在vim配置文件中加上一行就搞定了

1
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>
相關文章
相關標籤/搜索