Vim功能介紹

一、VIM的歷史
1. ed
ed是UNIX上最古老最基本的編輯器,它最初是UNIX之父Ken Thompson編寫的,他第一次在 ed中應用了正則表達式(regular expression),這個創舉將RE理論帶入了實踐,對UNIX界造成了深遠的影響。實際上ed是受來自加州伯克利大學的QED編輯器的影響,Ken便是從這所院校這裏畢業的。

ed是一種行模式編輯器,下面是一個ed會話的例子:

$ ed greeting0   # 因爲新創建文件,所以讀入了0個字節a   # 進入編輯模式(append)hello world, eveyone. # 輸入一行文本.   # 回到命令模式1p   # 顯示(print)第一行hello world, eveyone.1c   # 最後一個詞寫錯了,修改(change)第一行hello world, everyone..   # 回到命令模式1p   # 重新顯示第一行,這回發現無誤hello world, everyone.q   # 退出(quit)?   # ?表示沒有保存或者命令不認識w   # 保存(write)23   # 提示寫了23個字節q   # 退出也許大家覺得這個編輯器很難用,可是在70年代,許多使用UNIX的人都是用廉價的終端機通過電話線連到UNIX服務器上的,因爲傳輸速率慢,所以這種簡潔的行模式編輯就很有意義,現在雖然硬件有了長足的發展,ed編輯器很少有人用了,但是它的很多理念比如命令字符、正則表達式卻在它的很多後輩身上體現出來。下面這個網址有一些ed的笑話,從中我們或多或少能體會到那個時代人們的某種精神。

http://www.gnu.org/fun/jokes/ed.msg.html

GNU ed:  http://www.gnu.org/software/ed/ed.htmlReferencehttp://en.wikipedia.org/wiki/ed  http://snap.nlc.dcccd.edu/learn/nlc/ed.html  http://cm.bell-labs.com/cm/cs/who/dmr/qed.html  http://www.answers.com/topic/ken-thompson 2. ex
ex是ed的擴展,實際上vi構建在ex之上,vi引入了現在我們所熟悉的全屏編輯模式。

3. vi
隨着硬件的發展,UNIX上許多全屏模式編輯器被開發出來,pico,nano,joe,jed,jove,但是最爲廣泛使用的無疑就是VI(nvi,elvis,vim等)和Emacs(GNU Emacs,XEmacs等)。

1976年左右Bill Joy開發了vi,他也是伯克利大學的畢業生,後來他跟其他人一起成立了 Sun Microsystems公司併成爲了Sun的首席科學家。一開始Bill開發了ex,爾後開發了vi作爲 ex的visual interface,也就是說vi允許一次能看到一屏的文本而非一行,vi也因此得名。在當今的UNIX系統上,可能沒有缺省安裝Emacs,但是肯定會有vi,當然,ed編輯器也必定存在:-)

下面引用《Unix技術大全――Internet卷》的一段文字
“早期,當鍵盤和視頻終端成爲最新的計算機交互手段時,人們開發了VI。那時候的鍵盤不具有目前熟悉的全部功能鍵,所以,VI就設計成只需要打字機的鍵盤加上退出鍵就能完成對文本的輸入和修改(現在有的還接受一些其他的鍵輸入方式,如光標控制鍵)。儘管看起來受了限制,不能充分利用現代鍵盤新增的許多鍵,可是‘禍中有福’,限制帶來的好處是手指不離開打字區就能完成所有的編輯工作。”

Reference: http://www.bellevuelinux.org/vi/history.html  http://www.theregister.co.uk/2003/09/11/bill_joys_greatest_gift/ 4. VIM
技術不斷進步,需求也在不斷提高,VI的各種變種也不斷涌現,知名的有nvi,elvis,VIM,vile,yzis,其中移植性最好、特性最多、使用最廣的當屬VIM,VIM主要是Bram Moolenaar 開發的。最初Bram在Amiga計算機上改進一個叫Stevie的VI版本,他稱之爲“Vi IMitation”。隨着功能的逐漸豐富,VIM的含義也就改成了“Vi IMproved”。相比原始的VI,VIM增加的一項最重要的功能便是多級撤銷,VI只支持一級撤銷。

下面是VIM的重要版本歷史:

DATE  VERSION  Milestone2005  Vim 7.0aa Spell Checking,multi tabpage2000 Jul 09 Vim 6.0a Folding (and more)  1998 Feb 19 Vim 5.0  Syntax coloring/highlighting  1996 May 29 Vim 4.0  Graphical User Interface (Robert Webb).  1994 Aug 12 Vim 3.0  Support for multiple buffers and windows.  1992  Vim 1.22 Port to Unix. Vim now competes with Vi.     This was when Vim became Vi IMproved.  1991 Nov 2 Vim 1.14 First release (on Fred Fish disk #591). 1988  Vim 1.0  Vi IMitation on the AmigaReference: Learning the vi Editor,6th Edition,O'Reilly。   http://www.mamiyami.com/document/oreilly/books/unix2/vi/index.htm  (中國電力出版社有中譯版)  http://www.vmunix.com/vim/hist.html  http://www.vmunix.com/vim/  http://www.vim.org/  vim :help vi_diff.txt      :help version4.txt      :help version5.txt      :help version6.txt二、VI/VIM基礎知識
很多人應該都知道VI是個有模式的編輯器:編輯模式和命令模式,按ESC回到命令模式,用i或者a進入編輯模式,由於區分了模式,導致VI的命令非常簡潔,而無模式編輯器比如 Emacs,所有的命令都需要加上控制鍵Ctrl或Alt,所以有個笑話說Emacser們最希望計算機備一個腳踏板,這樣就可以用腳踩Ctrl和Alt鍵了(編輯器聖戰――在VI和Emacs之間有很多口水戰,自然也引出非常多的幽默),這裏羅嗦一句VI vs. Emacs: VI繼承了ed的理念,另外也有歷史原因,VI追求的是快捷――啓動程序迅速,編輯文本高效,功能專注,而Emacs追求的是功能的豐富強大以及集成帶來的方便,在Emacs裏頭可以發郵件,上新聞組,聽mp3,瀏覽網頁,玩遊戲,幾乎可以login->emacs->logout了:-),VI和Emacs都是程序員的編輯器,相比而言,Emacs更是提供了一種程序員的生活氛圍。

閒話少說,這篇文檔也不是一份VI/VIM教程,所以這一節我只會簡單的提及VI/VIM的基礎知識。VIM引入了更多的模式,在VIM裏頭:help mode可以看到VIM的所有模式,主要有如下幾種:

Normal mode  即通常所謂的命令模式,在此模式使用a、i、A、I、o、O等進入Insert modeInsert mode  即通常所謂的編輯模式,在此模式使用ESC進入Normal mode或者   Ctrl-o臨時進入Normal mode。Command-line mode 命令行模式,在Normal mode下按冒號進入,按ESC取消執行命令或者回車   執行命令,然後回到Normal mode。   (Visual Studio.Net也添加了命令行腳本功能,幸甚)Visual mode  即選擇模式(注意跟用鼠標選擇不同),用v,V,C-v或C-q進入Select mode  鼠標選擇Replace mode  在Normal mode下按R進入,按ESC返回Normal mode,相當於Windows下   命令行中按Insert鍵進入的覆蓋模式從VI/VIM中退出:按ESC確認返回到Normal mode,然後

:wq 保存並退出:q! 不保存並退出:x 退出,如果文件更改則保存ZZ 退出,如果文件更改則保存(按住Shift,再按兩次z)VI的命令是非常具有美感的,下面是幾個例子:

i 在光標前插入 I 在行首插入a 在光標後插入 A 在行末插入o 在下一行插入 O 在上一行插入x 刪除當前字符 X 刪除前一個字符類似的還有b,B,ge,gE,w,W,e,E,f,F,t,T,這些命令都可以用:help cmdname查到幫助。

dd 刪除一行 yy 拷貝一行h j k l 左下上右移動光標Ctrl-w h,Ctrl-w j,Ctrl-w k,Ctrl-w l 切換到左下上右窗口類似ed,VI/VIM的命令大多都可以帶一個數字前綴或者一個數字範圍,比如:

5dd 從當前行開始刪除5行5yy 從當前行開始拷貝5行1,3d 刪除1至3行1,3y 拷貝1至3行 (.代表當前行,$代表最後一行)d<motion>,y<motion>,c<motion>,v<motion>分別代表刪除/拷貝/修改/選擇<motion> 命令指定的範圍,比如

int main(void){ ......;}將光標放在{處,然後輸入v%就可以把大括號中內容選定,然後按=就可以按照C語言格式縮排(:help =可以看到=命令的描述),%命令的作用是跳到匹配處,比如括號之間,C的宏指令#if #else #endif之間。

int some_ugly_modifier and some_ugly_name (void)如果光標放在第一個s上,想刪除到“(”爲止,則輸入dt(就可以了,t(的作用是跳到下一個"("前。

dG可以從當前位置一直刪除到文件末尾,因爲G的作用是跳到文件最後一行。

VIM的命令可以非常快捷的做到一些複雜的編輯操作,下面是幾個示例:

(a)

將“(1), ...., (2), ....,(100)”替換成“(2), ...., (3), ...., (101)”。在文本中一處處找到並修改是很累的,在VIM下一條命令就可以搞定:

:%s/(/(/d+/))//="(".(submatch(1)+1).")"/g命令解釋如下:

%       全文(“%”是“1,___FCKpd___13rdquo;範圍的縮寫)s       替換/       搜索字符串開始(       左括號/)      開始記錄匹配/d+     一個或多個數字/)      結束記錄匹配)       右括號/       搜索字符串結束/=      把後面的表達式計算出來作爲替換字符串"("     左括號.       字符串連接運算符(submatch(1) + 1)       把第一個匹配的結果加一作爲一個整體返回.")"    添上右括號/g      替換字符串結束,g表示替換每一行的所有匹配結果。(b)

這個問題是我曾經碰到的,有一個log系統對於輸出行長度有限制,因此在輸出很長的log時需要斷行,在斷行時以單行的“-$-”標記,現在的需求是把這些行連起來,在VIM中也可以很方便的做到(edyfox at newsmth指點):

:%s//n-/$-/n//g命令的含義就是把“換行-$-換行”替換成空,另一個辦法是:

:g/-/$-/norm ddkJx命令g/-/$-/的含義就是找到所有的斷行標記,然後norm表示在找到的每一個行上執行後面的命令,dd刪除這個斷行標記,k移動到上一行,J合併當前行和下一行,由於J合併後會留一個空格(只對於英文情況下),所以x來刪除這個空格。

(c)

在Fortran代碼

integer, dimension(:, :), allocatable ::  &  short_var, &  A_very_long_name_var, &  other中,想把每行的&符號定位到固定的一列,比如第78列,手動對齊也是很麻煩的,這個問題可以用 VIM 的 Align 插件 (http://www.vim.org/scripts/script.php?script_id=294) 解決,另外利用宏也可以:

:set ve=all 使得光標可以定位到屏幕任何位置(缺省下VIM的光標只能放在行內的字符上)gg              到文件第一行//s/+&/s*$      找以&結尾的行,&前至少一個空白字符,後0或多個空白字符qa              記錄宏到寄存器aD               刪除到行尾78|             定位到第78列i&<ESC>         插入&並返回到命令模式n               查找下一個&q               停止記錄宏10000@a         執行一萬遍寄存器a中保存的命令:set ve=""      恢復ve缺省值(d)連續插入72個等號

按ESC進入Normal mode,輸入72i=再按ESC即可。

(e)在多行開始插入//

移動光標到需要註釋掉的第一行開頭,然後按Ctrl-v(如果使用了VIM的mswin.vim,則 Ctrl-v表示粘貼,這時需要用Ctrl-q代替)進入Visual blockwise模式,這個模式是 Visual mode的一種,相當於UltraEdit中的塊選擇。然後按j選擇上所有需要註釋行的行首(看起來效果是選擇了第一列),輸入I//再按ESC就可以在每一行開頭插入//了。

Reference: http://newsmth.org/ VIM board  http://edyfox.codecarver.org/html/index.html edyfox的個人主頁這些例子也許初看起來有點嚇人,可是在很多時候VIM這些強大的命令能省不少力,VIM 不愧是爲“編輯”這個功能費盡心思。

三、編程輔助
既然是程序員的編輯器,自然要show一下它的編程輔助功能。

(1) ctags,cscope
現在的IDE都提供了類、函數的索引功能,可以方便的找到某個類或者函數的在哪裏定義的,VIM這方面可以利用ctags、cscope做到,Exuberant ctags支持的語言種類非常多,UltraEdit的tags功能也是利用的ctags。cscope只支持C,它能實現Source Insight的一些功能,比如查找某個函數調用了哪些函數,某個函數被哪些函數調用。VIM對這兩個工具集成的非常好,利用它們就可以在源文件中方便的跳轉搜索類和函數了。

Reference: http://ctags.sourceforge.net/ Exuberant ctags  http://iamphet.nm.ru/cscope/ cscope for Win32  :help ctags  :help cscope(2)multi window,multi buffer,multi tab page
一個buffer對應一個文件,它可以對應多個window,這樣可以方便的對照編輯一個文件的不同部分,tab page跟現在許多編輯器上常見的標籤頁意義並不一樣,可以將tab page理解爲一個windows的容器,這樣如果想新建一個窗口編輯文件但又不想打亂現在的多窗口布局,那麼就可以新開一個tab page,把新窗口放到這個新的tab page裏頭。tab page是VIM 7.0不久前新增的特性,目前VIM 7.0還未正式發佈。

Reference: :help windows  :help buffers  :help tabpage(3) 語法高亮
VIM發行版裏帶了450多種語言的語法高亮,在其主頁vim.org上還可以找到更多。

Reference: :help syntax(4) 自動縮進
在打開自動縮進選項後,VIM會自動的控制縮進,比如輸入{自動向右縮進一個tab字符(具體用什麼縮進可以配置),輸入}自動回退縮進。使用=命令可以對選擇的程序塊排版縮進,這對於整理代碼非常有幫助。另外對選擇的塊用>>和<<命令可以很方便的控制一個程序塊的縮進。

Reference: :help cindent  :help autoindent  :help smartindent(5) 類和函數列表
taglist等插件可以提供很方便的類和函數列表功能。

(6) 自動完成
VIM在Insert mode下輸入一個單詞的前幾個字符,然後用Ctrl-p或者Ctrl-n就可以列出以這些字符開頭的單詞,特別在配置了ctags後也能列出頭文件中的符號,特別方便,除此外VIM 還有行自動完成、文件名自動完成等,這點即使是現在強大的IDE也未免不足。

如果設置瞭如下選項:

:set wildmode=list:full:set wildmenu則在命令行打開文件或者輸入命令時按Tab(以輸入字符爲前綴補全)或者Ctrl-d(列出包含輸入字符的所有匹配項目)自動補全,這一功能大大降低了VIM的使用難度。

另外有許多插件可以實現許多IDE中的自動完成類成員的功能,當然,這個功能還比不上 Eclispe、Visual Studio等IDE中的強大,這一點是VIM比較可惜的地方。VIM 7.0引入了Omni Completion,可以自定義匹配完成函數,也許可以彌補這個缺陷。

Reference: :help 'complete'  :help omni-completion(7) folding
VIM支持摺疊代碼,還可以根據文件中特殊的標記對文件中的行摺疊,可以實現Outline視圖,這可以極大的方便編輯很大的文件。

Reference :help fold(8) quickfix
許多人對於UNIX開發的印象都是“編輯代碼,退出編輯器,編譯,發現錯誤,記錄出錯信息,遍輯代碼,退出編輯器,編譯,用gdb調試,再編輯代碼……”,這是古老的VI時代的事情了,有了VIM的quickfix特性,我們可以在VIM裏編譯然後直接跳到編譯出錯的行,這個反覆的過程無需退出編輯器,而且VIM的quickfix特性可以經配置後支持不同的編譯器以及不同的語言:只要編譯器在出錯信息裏包含文件名和行號。

不過比較遺憾的是VIM對於集成調試支持還不好,有些項目嘗試集成GDB到VIM,比如 http://skawina.eu.org/mikolaj/vimgdb/http://www.volny.cz/zellerin/gdbvim/ ,在http://www.vim.org/search.php 中的scripts處搜索gdb也可以找到一些插件.這方面 Emacs的GUD(Grand Unified Debugger)調試界面要更強大,畢竟GCC/GDB/Emacs是一家。

Reference: :help quickfix(9)auto command
VIM可以在某些事件發生時比如打開文件、保存文件、切換窗口時自動執行一些VIM命令,VIM的許多插件都利用了這個功能。常用的一種情況是把某種文件後綴指定到一種文件格式上,比如*.jv指定到Java文件格式,這樣在每次打開.jv類型的文件時自動使用Java的語法高亮:

:autocmd BufNewFile, BufRead *.jv :set ft=JavaReference: :help autocmd.txt(10)mode line
在編輯文件時常常指定一些選項,比如縮進量、是否將製表符轉換成空格等,每次手動指定這些選項很麻煩,寫到vimrc中卻又成了全局選項,而且換了一份VIM,原有的設置就丟失了。VIM可以識別文件中的特殊行,自動設置一些選項,下面是寫在C源文件開頭的一個mode line示例:

/* vi:set tw=0 ts=8 sw=8 noet nowrap ft=c fdm=syntax: *//* * File: xxxx.c * Author: xxx */四、強大方便的幫助系統
使用了那麼多軟件,只有VIM和Emacs的幫助系統給我方便快捷的感覺,大部分軟件的幫助往往是擺設而已,而VIM的幫助的確是考慮到了自己“help”的身份,利用它能很方便容易的找到想要的東西。

VIM的幫助是超鏈接形式的,它使用的就是tags,所以可以跟ctags功能一樣按Ctrl-]跳轉到鏈接所指處,按Ctrl-t返回。

 :help  打開幫助首頁,這個首頁分類非常清楚 :help cmd 查找normal mode命令,比如:help dd :help i_cmd 查找insert mode命令,比如:help i_Ctrl-y :help :cmd 查找command-line命令,比如:help :s   :help 'option 查找選項,比如:help 'tabstop(這些信息都在:help打開的幫助首頁上)
如果你記不清命令或者選項的全稱,那麼可以利用Tab或者Ctrl-d的自動補全功能。

 :help options 可以找到所有的選項說明查看某一個選項的值(實際上選項是VIM中的一種變量,類似SHELL的變量以$符號引用, VIM的選項以&引用,另外VIM的寄存器以@引用):

 :echo &tabstop五、其它高級功能
(1)寄存器
VIM裏面的寄存器可以用來保存拷貝的文本、記錄的宏、設置的書籤等等,一般的編輯器都只有一個剪切板(MS Office加入了多個剪切板),而VIM和Emacs編輯器中的多寄存器可以實現多個剪切板的功能。VIM中有九類寄存器:

無名寄存器 " 最近一次刪除/修改/替換操作的文本都會放入這個寄存器10個數字寄存器 0-9 拷貝或者刪除的文本存入這些寄存器,這些寄存器是循環使用   的,在每次存入內容到寄存器1時,原有的內容會依次存入到   後一個寄存器中。小刪除寄存器 - 刪除內容少於一行時放入這個寄存器26個命名寄存器 a-zA-Z  大小寫無關。這些寄存器可以在拷貝或者刪除等操作中指定使用。四個只讀寄存器  :.%# 特殊用途。表達式寄存器 = 特殊用途。選擇和拖放寄存器 *+~ 用於與系統剪切板交互,以及接收拖放操作的內容。黑洞寄存器 _ 放到這裏面的內容都被丟棄,這樣可以刪除或拷貝時不影響其它寄存器。最後一次搜索模式寄存器 / 保存最後一次搜索的正則表達式。使用:reg命令可以看到所有寄存器中的內容,使用"+y或者"*y可以將visual mode下選擇的內容拷貝到系統剪切板,使用"+p或者"*p可以將剪切板中的內容粘貼到VIM中,如果打開了mswin特性的話則在insert mode下使用Ctrl-x,Ctrl-v,Ctrl-c了。

Reference: :help registers(2) 宏
Normal mode下按q<reg>,<reg>指{a-zA-Z0-9"}37個寄存器中的一個,然後可以進行任何操作,包括在模式間切換,最後在Normal模式下按q可以結束宏錄製,用@<reg>命令可以應用這個宏,命令前可以帶數字前綴表示執行多少次這個宏。

Reference: :help q(3) 書籤
Normal mode下按m<reg>作書籤,<reg>指26個命名寄存器中的一個,然後可以用'<reg>或者`<reg>跳到書籤處。

Reference: :help m(4) 映射
VI/VIM可以將某個按鍵序列映射到一個命令序列上,比如在配置文件.vimrc(Windows下是_vimrc)中寫入

map <F6> <ESC>i<C-R>=strftime("%Y-%m-%d")<ESC><ESC>即可以在Normal mode下插入當前日期。

Reference: :help :map(5) 縮寫
VI/VIM支持用一個縮寫字符串代替一個長的字符串,比如

:ab hw hello world然後在Insert mode下輸入“hw ”(不包括引號)後VIM就自動替換成了“hello world”。

這裏展示一個Emacs下abbrev功能的動畫(沒錯,是Emacs的):
http://www.bloomington.in.us/~brutt/msf-abbrev.html
http://www.bloomington.in.us/~brutt/msf-abbrev-demo.gif

Reference: :help :ab(6) :s//和:g//,:!g//
這兩個命名加上正則表達式,常常能完成非常複雜的編輯任務,可以毫不誇張地說是VIM 的兩柄瑞士軍刀。:s是替換操作,:g是查找匹配模式的行,:!g是查找不匹配模式的行。http://www.vim.org/tips/tip.php?tip_id=1063 這個tip可以把:g找到的行拷貝到一個新的緩衝區中,非常有用。

Reference: :help :s  :help :g(7) 插件
VIM自己有腳本語言,另外也支持用Perl/Python/Tcl/Ruby/Scheme編寫插件,這些插件極大的豐富了VIM的功能。

(8) color scheme
VIM有許多配色方案,下面這個鏈接有許多配色方案效果的圖樣:
http://www.cs.cmu.edu/~maverick/VimColorSchemeTest/

(9) 二進制編輯
VIM可以利用xxd實現二進制編輯,不過這項功能還是不夠好用。

(10) sign
sign指在編輯窗口的最左列顯示一個標記,利用這個功能能實現很多IDE中的書籤標記或者斷點標記。

Reference: :help sign六、VIM Scripts
VIM script包含幾大類:

color scheme 配色方案ftplugin File type插件,特定語言語法的設置,比如如何識別註釋syntax  語法高亮的配色plugin  提供額外功能的插件,比如智能完成、緩衝區管理。VIM的script安裝非常簡單,下載的script文件或者壓縮包裏頭都有安裝說明,在VIM的安裝目錄(比如C:/VIM64)下面有一個vimfiles目錄,把script放到vimfiles目錄下即可。對於多用戶系統,可以在HOME目錄(一般是c:/Documents and Settings/ <USER_NAME>/)下面建立一個vimfiles目錄,把script放置到這裏。

下面是一些好用的VIM插件,具體使用辦法請參考各自。vim文件頭部的註釋。

BufExplorer.vim  *****http://www.vim.org/scripts/script.php?script_id=42    這個插件可以使編輯多文件更加方便,裝完插件後Normal mode下輸入/be即可打開緩衝區列表,光標放置在某一個文件上按回車即可打開這個文件,而緩衝區列表自動關閉。Taglist.vim  *****http://www.vim.org/scripts/script.php?script_id=273    這個插件可以實現類或者函數列表功能,支持C/C++,java,perl,python,tcl,sql,php等語言,它可以在VIM中創建一個窗口,列出編輯的源文件中的類、函數、變量定義列表,而且更方便的是這個列表也插入在了右鍵菜單中,分類存放,訪問非常方便。TabBar.vim  ***http://www.vim.org/scripts/script.php?script_id=1338    這個插件實現了類似UltraEdit中的標籤頁的功能,而且能通過Alt-<n>來切換,<n>代表1-9。minibufexpl.vim  ***http://www.vim.org/scripts/script.php?script_id=159    實現了類似UltraEdit中的標籤也功能。c.vim   ***http://www.vim.org/scripts/script.php?script_id=213    提供了很多便於C/C++編程的功能,比如文件頭模版,代碼片斷等。CRefVim   **http://www.vim.org/scripts/script.php?script_id=614    爲VIM定製的C參考手冊,這樣對於語法或者函數不清楚的地方可以方便的查找了。latex-suite  *****http://www.vim.org/scripts/script.php?script_id=475http://vim-latex.sf.net/    提供了很多便於編輯TeX/LaTeX文件的功能,比如在VIM裏面編譯或者預覽、自動插入TeX標記等。word_complete.vim ***http://www.vim.org/scripts/script.php?script_id=73    Insert模式下在輸入的時候自動補全單詞,如果補全正確可以按Tab鍵接受,否則可以不管它繼續輸入或者按Ctrl-n,Ctrl-p切換補全。 注意是輸入三個字符後纔開始補全。Vim JDEhttp://www.vim.org/scripts/script.php?script_id=1213    支持C/C++等的自動完成(需要VIM 7.0,編譯時打開+ruby特性).cppcomplete.vim  **http://www.vim.org/scripts/script.php?script_id=527    能自動完成C/C++/Java的結構或類成員,注意它的快捷鍵是Alt-l(字母L)不是Alt-i。The NEAD Commenter **http://www.vim.org/scripts/script.php?script_id=1218    在許多類型的文件中方便的加上註釋或者取消註釋。winmanagerhttp://www.vim.org/scripts/script.php?script_id=95    把標準的File Explorer以及Buffer Explorer插件集成在一起,提供現代編輯器中常見的文件列表和緩衝區列表功能。sketch.vim ***http://www.vim.org/scripts/script.php?script_id=705Draw with mouse: boxes, arrows, lines, fills. Transparent/opaque drag and drop.    照着它的教程做一遍,你就會震撼於它的創意了。DrawIt.vim **http://www.vim.org/scripts/script.php?script_id=40    可以方便的畫連線圖。MultipleSearch  ***http://www.vim.org/scripts/script.php?script_id=479MultipleSearch2.vim ***http://www.vim.org/scripts/script.php?script_id=1183Mark.vim  ***http://www.vim.org/scripts/script.php?script_id=1238otf.vim   **http://www.vim.org/scripts/script.php?script_id=634    這些插件可以同時高亮顯示多次搜索結果,這個特性非常有利於顯示代碼中某些變量或函數的調用位置。SearchComplete.vim *http://www.vim.org/scripts/script.php?script_id=474    可以用/搜索時按Tab補全要搜索的單詞。Vim Intellisensehttp://insenvim.sourceforge.net/    顧名思義,此插件用於給VIM提供智能完成功能,支持C++,C#,Java,JSP,HTML,SQL,XML,我安裝後一直懶得配置,也就沒用上。projecthttp://www.vim.org/scripts/script.php?script_id=69    提供一些IDE功能,看介紹似乎很不錯。JavaBrowerhttp://www.vim.org/scripts/script.php?script_id=588    提供文件中Java類的樹狀列表。vimspellhttp://www.vim.org/scripts/script.php?script_id=465ispell or aspell based spell checker with fly-spelling。creamhttp://cream.sourceforge.net/    一套配置文件,可以把VIM的界面改成CUA(Common User Access)模型,降低VIM的學習難度,個人不推薦這種做法,不過其中有些高級配置值得學習(有意思的是Emacs也有類似的項目: Easymacs,EmacsW32)。ICompletehttp://icomplete.sf.net/    搭配VIM 7.0的Omni Complete,可以做到C/C++的智能完成功能.七、VIM資源
http://www.vim.org/ VIM主頁,有許多scripts和tips,查找插件的第一去處。http://newsmth.net/ 新水木BBS的VIM版,有很多VIM愛好者可以討論http://vimdoc.sf.net/ VIM文檔工程http://vcd.gro.clinux.org/ VIM中文文檔http://tnerual.eriogerg.free.fr/vim.html VIM Quick Reference Cardhttp://edyfox.codecarver.org/ newsmth VIM版版主的wikihttp://learn.tsinghua.edu.cn:8080/2001315450/ 王垠的個人主頁《學習vi編輯器(第六版)》機械工業出版社譯,O'Reilly幾個學習正則表達式的工具(from happyvim at newsmth)http://weitz.de/regex-coach/  Regex Coachhttp://jregexptester.sourceforge.net/ JRegexp Testerhttp://www.regexbuddy.com/  Regex Buddyhttp://www.yzis.org/  yzis是一個新的VI變種,它支持變寬字體,目前功能還不夠豐富.http://ex-vi.sourceforge.net/ 傳統VI的源代碼八、編譯安裝最新CVS版的VIM
1. 獲取源代碼
cvs -z3 -d:pserver:[email protected]:/cvsroot/vim co vim7源代碼位於當前目錄的vim7目錄下面,假設安裝目標在d:/work/program/Vim/vim70b

2.編譯
注意重新編譯前最好clean一下,確保“*obj*”目錄被刪除了,否則可能出現莫名其妙的問題,比如鏈接時找不到一些函數。下面是一個批處理腳本:

   rem --------------------------------------------->   @echo off   set path=c:/winnt;c:/winnt/system32   vcvars32.bat   cd vim7/src   rem .sh文件跟其它程序有關聯,避免運行VC的link時執行了link.sh   ren link.sh link.sh.old   @echo clean...   rem clean時加入這些選項是因爲$(OUTDIR)和$(OBJDIR)根據這些標誌合成的,    rem 如果不加這些標誌, 在rmdir /s /q時會找不到目錄, 從而沒有刪除掉。   nmake -f Make_mvc.mak clean FEATURES=HUGE GUI=yes OLE=yes MBYTE=yes IME=yes    GDYNAMIC_IME=yes GIME=yes PERL=d:/work/program/Perl DYNAMIC_PERL=yes PERL_VER=58 PYTHON=d:/work/program/Python24 DYNAMIC_PYTHON=yes PYTHON_VER=24  SNIFF=yes CSCOPE=yes CPUNU=i586 DEBUG=yes MAP=lines   @echo build big debug version...   nmake -f Make_mvc.mak all FEATURES=HUGE GUI=yes OLE=yes MBYTE=yes IME=yes   GDYNAMIC_IME=yes GIME=yes PERL=d:/work/program/Perl DYNAMIC_PERL=yes PERL_VER=58 PYTHON=d:/work/program/Python24 DYNAMIC_PYTHON=yes PYTHON_VER=24  SNIFF=yes CSCOPE=yes CPUNU=i586 DEBUG=yes MAP=lines   ren link.sh.old link.sh   @echo done.   pause   @echo on   rem <-----------------------------------------------對於MinGW,

    @echo off    @echo clean...    make -f Make_ming.mak clean DEBUG=yes    @echo make...    make -f Make_ming.mak all GUI=yes OLE=yes MBYTE=yes IME=yes GDYNAMIC_IME=yes    GIME=yes PERL=d:/work/program/Perl DYNAMIC_PERL=yes PERL_VER=58 PYTHON=d:/work/program/Python24 DYNAMIC_PYTHON=yes PYTHON_VER=24 CSCOPE=yes CPUNU=i586 DEBUG=yes MAP=lines    @echo done.    pause    @echo on如果發現MinGW編譯出來的gvimd.exe非常大(約4~5MB),可以用MinGW自帶的strip處理一下。

3. 安裝
如果你的系統先前有一份不同版本的VIM,那麼需要先卸載掉(運行vim/vimXX/uninstal.exe,或者在拷貝完文件後運行新版VIM的install.exe,它也會提示卸載舊版本),最近的VIM 7 CVS代碼安裝目錄也從vim70aa轉變到vim70b,也需要卸載原先的vim70aa,這一步主要是刪除一些註冊表項。

如果你從CVS上更新代碼後,install要求的安裝目錄名字沒有改變(也就是說VIM版本沒變),那麼不需要卸載原先的版本,直接拷貝文件覆蓋即可,如果你想更改目錄安裝的話也需要卸載。

   cd vim7   dir /s/b *.exe   dir /s/b *.dll   xcopy vim7/runtime d:/work/program/vim/vim70b (vim70b是一個目錄)   copy vim7/src/*.exe  d:/work/program/Vim/vim70b   copy vim7/src/xxd/xxd.exe d:/work/program/Vim/vim70b   copy vim7/src/vimtbar.dll d:/work/program/Vim/vim70b   copy vim7/src/GvimExt/gvimext.dll d:/work/program/Vim/vim70b   copy vim7/src/VisVim/Visvim.dll d:/work/program/Vim/vim70b然後進入vim70b目錄運行install.exe,如果發現一個DOS窗口一閃而逝,那麼很可能是建 立的vim70b目錄名不對,比如我前幾天升級後使用的仍然是vim70aa目錄名,在DOS窗口中運行 install.exe它就提示需要在vim70b目錄下運行,將vim70aa改名即可。install.exe的源代碼 是vim7/src/dosinst.c,這裏面修改了註冊表,並拷貝一些文件到WINDOWS目錄下等等。

4.善後
視情況你需要更新PATH環境變量、文件關聯、_vimrc中的路徑名等,並將diff.exe,ctags.exe,cscope.exe拷貝到vim70b下面。

最後運行gvimd.exe,鍵入:ver開始享受VIM吧。

九、一份vimrc配置文件
十、VIM的不足
前面已經提到,VIM在自動完成和集成調試方面還比不上現代的許多IDE,另外VIM對二進制編輯還沒有UltraEdit強大,對於現在流行的重構,VIM也支持不力,但是作爲一個文本編輯器而言,堪比的只有Emacs,另外Visual SlickEdit也很強大,不過它是商業軟件。VIM也可以嵌入到Visual Studio中作爲編輯器,另外Code Forge,Eclipse,NetBeans,Sun Visual Workshop 等也提供了一定的VIM支持或者鍵綁定。

Reference: :help workshop  :help netbeans  :help debugger

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/goodboylwj/archive/2007/06/28/1670348.aspx

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