歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Vim好用的插件: YouCompleteMe

Vim好用的插件: YouCompleteMe

日期:2017/2/28 13:58:21   编辑:Linux教程

Vim代碼補全現狀

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

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

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

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

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

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後,需要先編譯才能使用。

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

語意補全要正確工作,需要配置好.ycm_extra_conf.py文件,模板在這裡。可以把這個文件放在項目的根目錄下,打開項目文件時,YCM會循環向上搜索並加載這個文件,或者在vimrc文件中加入

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,甚至不用任何配置就實現了這些功能,實在是太方便了。

代碼跳轉

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配置文件中加上一行就搞定了

nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>
Copyright © Linux教程網 All Rights Reserved