vim中的調試和補全(windows平臺)

vim一個歷史悠久的字符界面編輯器,可以說是GUI編輯器橫行時代的一個少數派。(與其類似的自然還有emacs。)在沒有用過vim的人那裏,看到有人在用vim必然十分驚訝,居然還有人在用這樣非主流的東西,看起來一點都不好用。但是,喜歡的人,卻非常喜歡,常常拉出一大堆理由和牛人,來支持自己的觀點。
作爲到現在爲止1/2的代碼都是用vim寫的人,我倒是想先來比較一下vim和vc(大約1/4的代碼是用vc寫的。)。一般人常將vim和vc的擴展性做比較,來說明vim的擴展性好,因爲,vim自帶腳本解釋器可以自己設置命令來完成一些事情。但實際上vc的擴展性也很好,但是不常見,比如:你可以寫vba腳本來擴展它的功能,比如,加入一個註釋函數的功能,因爲,vc自帶代碼分析工具,所以在vba中是可以看到編輯的代碼的代碼結構,也就可以從中抽取出函數名,函數參數等等。總的來說功能更加強大,但是,現成腳本不多。另外,vim還有兩大致命弱點 。1.函數,變量補全。vim本身自帶非常弱的補全功能,幾乎就是在匹配出現過的字符串。如果,工程寫的比較大,只有神纔可能將所有的函數名,函數參數和變量名,都記下來。如果,反覆的查找,那麼就太低效率了。2.調試。在vim中是沒有辦法的,自己到外面找gdb吧。更加不明白爲什麼有人會喜歡用命令行調試,一次就只能看到那麼幾行代碼,調試到哪了有時也犯糊塗,一點都不直觀。相比較彙編調試,那是強上了百倍。

那爲什麼我還要想用vim,而不是vc呢?因爲,vc太大了,一跑起來,機器都顫抖了。相比較vim就小的多了,而且十分喜歡它的簡潔,不喜歡到處掛滿對話框的樣子。無論如何,至少他可以成爲衆多IDE的選擇之一。

我這個做的還和一般人不太一樣,一般人做的是linux平臺,那個相對要簡單一點,因爲插件作者都是先考慮到linux,之後纔是windows。但是,對於我而言,我只是看中了linux的命令行以及命令行中的工具。所以,希望在windows下實現這些,當然,在linux做,其實也是一個類似的過程。

vim中的調試:

在vim中實現調試有三種方案,vimdbg,clewn,pyclewn,下面的表格來自http://pyclewn.sourceforge.net/

Comparison of clewn, vimGdb and pyclewn

The following table lists the differences between clewn, vimGdb and pyclewn(clewn and vimGdb are hosted atclewn).

  vimGdb clewn pyclewn
platform unix unix

all unix platformssupported by python -requires GNU gdb frommacports on Mac Os X

Windows (python 3 only)

language C C

python 2.4 and above

python 3

C language for thepdb-clone pythonextension module, _bdb

vim mode vim in aterminal,gvim gvim gvim and vim in aterminal (vim 7.3or above required)
vim interface a vim patch a standalone programconnected to gvim witha netbeans socket

a standalone programconnected to vim witha netbeans socket

pyclewn may be startedfrom within vim sincevim 7.3

vim version a differentpatch foreach vimversion vim 6.3 and above vim 7.0 and above
debuggers gdb gdb gdb, pdb
gdb features  
  • watched variables
  • project file
  • tight integrationwith vim
  • gdb/mi interface
  • asynchronous gdbcommands
  • watched variables
  • project file
pdb features    
  • interrupt thedebuggee
  • attach to a runningpython process
  • the threadstackcommand

本文選擇的是第三種,不單單說是第三種能力強大,也在於第一種我嘗試在cygwin中重新編譯vim,但是失敗了。倒不是編譯失敗,而是運行vimGdb時,它說gdb fork 失敗之類的,我想應該是cygwin還沒有兼容到這種程度。我也想嘗試第二種,但是它要求vim是gvim,但是這個在cygwin中,目前還做不到,因爲它還沒有移植gtk等桌面環境。不過,我看到cygwin,正在做這件事,在之後可以行了吧。所以,就只剩下第三條了,而且它官方自己都說支持windows,那麼應該是可行了。不過,它說的windows並不是cygwin甚至連mingw也不行,而是指純正的windows,就是安裝windows版vim的,windows版python的。

安裝過程:

基本就是官方的翻譯(http://pyclewn.sourceforge.net/install.html)本文寫於2013-3-29,可能未來下面軟件的版本會發生變化。

  1. 下載python3.2,不要圖新,新的未必支持。我就是下了3.3,然後安裝了好幾次都不成功。然後,正常安裝即可。
  2. 下載python extension,注意要選擇3.2版本,也就是要跟上面那個匹配。下載之後正常安裝即可。
  3. 下載MinGW,然後正常安裝。
  4. 下載vim,然後安裝。之後,將vim.exe所在的目錄加到環境變量PATH裏面。
  5. 下載pyclewn,然後安裝。如果,最後看到pyclewn postinstall completed。(在我的機器上,這句話在最右邊。)那麼說明安裝成功了,否則就可能失敗了,看看失敗原因。成功後在vim中輸入,:Pyclewn
  6. 貼張效果圖,具體命令怎麼使用還是看官方文檔吧。

vim中的代碼補全

網上關於vim中的代碼補全講的很多,但是很多都免不了有兩個問題,就是補全的不準確和補全的不及時。補全的不準去指的是直接用出現過的單詞去匹配,沒出現的沒法補全,函數參數提示就更沒辦法了。還有一種使用cscope或者是ctag的,兩種都是對文檔先進行語法分析,然後生成相應的文件。一來,對於文檔中剛寫過的它是分析不出來的,二來,對於複雜的表達式他也沒有辦法給出提示。總的來說,這些方法,相對於現在的IDE,就顯得十分古老了。要想先進一點,有兩種方案,一種是gccsense,另一種是clang_complete。他們的思想都是類似,要想準確的得到補全,只有編譯器自己才知道。所以,必須要在後臺,讓編譯器自己去分析代碼,從他的語法樹中獲取有用的信息。gccsense需要編譯gcc,但是,他需要很多前提庫,我在cygwin下找了一下,也沒有找全那個庫。只能是第二種方案了,第二種的後端編譯器用的是現在剛興起的clang,它是可以在mingw中編譯的。也可以參考原作者寫的,https://github.com/Rip-Rip/clang_complete/wiki

  1. 編譯clang之前,需要下載python2.7,否則clang編譯不了。高版本的沒有用的。確保python2.7能被訪問到,可能需要加到環境變量PATH中。
  2. 編譯clang,按照道理上說,我們可以去下載一個編譯好了的clang,然後就可以了。但是,我找了官方的編譯結果,結果卻發現clang一編譯東西,就彈出對話框說,它已經停止工作了。所以,就不得不自己編譯了。耗時比較長,估計在2小時以上,因爲,我是晚上編譯的,所以我也不太清楚。具體編譯過程,看一篇博文吧,它寫的很清楚。http://bencode.net/clangonwindows。做完後,別忘了將clang所在的目錄加到環境變量PATH中。
  3. 下載https://github.com/Rip-Rip/clang_complete中的文件,點那個zip就可以了。將文件解壓縮到,vim安裝目錄中有個叫vimfiles的地方。其實也就是將zip文件中的plugin對應到vimfiles的plugin,doc對應doc。這樣clang_complete就安裝好了。
  4. 但是,它似乎有點問題。clang_complete需要調用一個叫libclang.dll的文件,但是clang中並沒有這樣的文件,它只有clang.dll。我的做法是,到那個plugin中的cindex.py文件中搜索,libclang.dll將其改爲clang.dll。
  5. 在vim的~/.vimrc中加入
  6. let g:clang_complete_copen=0
    let g:clang_periodic_quickfix=1
    let g:clang_snippets=1
    let g:clang_snippets_engine='clang_complete'
    let g:clang_close_preview=1
    let g:clang_use_library=1
    let g:clang_user_options='-stdlib=libc++ -std=c++11 -IIncludePath'
    let g:clang_library_path='E:/MinGW/bin'
  7. 其中最後一個要改成你的clang。dll所在的路徑,注意/\的區別,此處沒有弄錯。其他,參數可以參考它的幫助文檔。這時候,只能祈禱可以使用吧!我也是看了它的源代碼才知道出了什麼問題,特別麻煩。此處所講更多的是要點,還有其他的一些東西,可以參考其他人的博文,比如本文參考中的一些就不錯。
  8. 別忘了將python3.2加入到PATH中,而將python2.7取消掉,否則前面的調試可能出問題。
  9. 來張效果圖:

後記:

在linux下做這個就十分的麻煩,在windows下就更麻煩了。經過了十多個小時的折騰,終於是將這兩個功能都弄好了,就算是弄到這樣子,還是與現在的IDE有一定的距離,他們在這些方面做得更爲的自然。但不管怎麼樣,好歹這是可以稱得上是比較現代的IDE了,剩下的更多是發揮vim本身的可定製性的時候了。它也可以成爲IDE的選擇之一了。但是,話又說回來,又有多少人願意如此複雜的去配置一個東西呢,結果也只是得到了別人隨隨便便就能用上的功能。思考之後就形成了,剛寫的博文,IDE的本質。之後,安裝了一個之前沒用過的IDE,netbeans想用來寫PHP。它界面華麗,功能強大。我越發的覺着,到底有多少人會願意花費巨大的時間,僅僅只是爲了可定製性呢?恐怕是很少吧。


參考:

pyclewn的用法:http://easwy.com/blog/archives/advanced-vim-skills-vim-gdb-pyclewn/

clang_complete:http://www.cnblogs.com/egmkang/archive/2011/02/20/clang_complete.html

clang_complete:http://www.pleee.com/archives/426.html

clang_complete作者寫的:https://github.com/Rip-Rip/clang_complete/wiki

將vim進一步打造成IDE:http://blog.csdn.net/wooin/article/details/1858917

另外一個將vim打造成IDE:http://blog.csdn.net/yangyang_gnu/article/details/6642271

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章