一、VIM的歷史 1976年左右Bill Joy開發了vi,他也是伯克利大學的畢業生,后來他跟其他人一起成立了Sun Microsystems公司并成為了Sun的首席科學家。一開始Bill開發了ex,爾后開發了vi作為ex的visual interface,也就是說vi允許一次能看到一屏的文本而非一行,vi也因此得名。 “早期,當鍵盤和視頻終端成為最新的計算機交互手段時,人們開發了VI。那時候的鍵盤不具有目前熟悉的全部功能鍵,所以,VI就設計成只需要打字機的鍵盤加上退出鍵就能完成對文本的輸入和修改(現在有的還接受一些其他的鍵輸入方式,如光標控制鍵)。盡管看起來受了限制,不能充分利用現代鍵盤新增的許多鍵,可是‘禍中有福’,限制帶來的好處是手指不離開打字區就能完成所有的編輯工作。” 技術不斷進步,需求也在不斷提高,VI的各種變種也不斷涌現,知名的有nvi,elvis,VIM,vile,yzis,其中移植性最好、特性最多、使用最廣的當屬VIM,VIM主要是Bram Moolenaar開發的。最初Bram在Amiga計算機上改進一個叫Stevie的VI版本,他稱之為“Vi IMitation”。隨著功能的逐漸豐富,VIM的含義也就改成了“Vi IMproved”。相比原始的VI,VIM增加的一項最重要的功能便是多級撤銷,VI只支持一級撤銷。 [separator] 二、VI/VIM基礎知識 很多人應該都知道VI是個有模式的編輯器:編輯模式和命令模式,按ESC回到命令模式,用i或者a進入編輯模式,由于區分了模式,導致VI的命令非常簡潔,而無模式編輯器比如Emacs,所有的命令都需要加上控制鍵Ctrl或Alt。VI繼承了ed的理念,另外也有歷史原因,VI追求的是快捷——啟動程序迅速,編輯文本高效,功能專注,而Emacs追求的是功能的豐富強大以及集成帶來的方便。 在VIM里頭:help mode可以看到VIM的所有模式,主要有如下幾種:
從VI/VIM中退出: 按ESC確認返回到Normal mode,然后
VI的命令是非常具有美感的,下面是幾個例子:
類似的還有b,B,ge,gE,w,W,e,E,f,F,t,T,這些命令都可以用:help cmdname查到幫助。
類似ed,VI/VIM的命令大多都可以帶一個數字前綴或者一個數字范圍,比如:
d<motion>,y<motion>,c<motion>,v<motion>分別代表刪除/拷貝/修改/選擇<motion> 命令指定的范圍,比如 將光標放在{處,然后輸入v%就可以把大括號中內容選定,然后按=就可以按照C語言格式縮排(:help =可以看到=命令的描述),%命令的作用是跳到匹配處,比如括號之間,C的宏指令#if #else #endif之間。 int some_ugly_modifier and some_ugly_name (void) dG可以從當前位置一直刪除到文件末尾,因為G的作用是跳到文件最后一行。 VIM的命令可以非常快捷的做到一些復雜的編輯操作。 命令解釋如下:
三、編程輔助 既然是程序員的編輯器,自然要show一下它的編程輔助功能。 (1) ctags,cscope 現在的IDE都提供了類、函數的索引功能,可以方便的找到某個類或者函數的在哪里定義的,VIM這方面可以利用ctags、cscope做到, Exuberant ctags支持的語言種類非常多,UltraEdit的tags功能也是利用的ctags。cscope只支持C,它能實現Source Insight的一些功能,比如查找某個函數調用了哪些函數,某個函數被哪些函數調用。VIM對這兩個工具集成的非常好,利用它們就可以在源文件中方便的跳轉搜索類和函數了。 Reference:
(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還未正式發布。(此文發表至PConline時,已經正式發布。)
(3) 語法高亮 VIM發行版里帶了450多種語言的語法高亮,在其主頁上還可以找到更多。
(4) 自動縮進 在打開自動縮進選項后,VIM會自動的控制縮進,比如輸入{自動向右縮進一個tab字符(具體用什么縮進可以配置),輸入}自動回退縮進。使用=命令可以對選擇的程序塊排版縮進,這對于整理代碼非常有幫助。另外對選擇的塊用>>和<<命令可以很方便的控制一個程序塊的縮進。
(5) 類和函數列表 taglist等插件可以提供很方便的類和函數列表功能。 (6) 自動完成 VIM在Insert mode下輸入一個單詞的前幾個字符,然后用Ctrl-p或者Ctrl-n就可以列出以這些字符開頭的單詞,特別在配置了ctags后也能列出頭文件中的符號,特別方便,除此外VIM還有行自動完成、文件名自動完成等,這點即使是現在強大的IDE也未免不足。 如果設置了如下選項:
則在命令行打開文件或者輸入命令時按Tab(以輸入字符為前綴補全)或者Ctrl-d(列出包含輸入字符的所有匹配項目)自動補全,這一功能大大降低了VIM的使用難度。 另外有許多插件可以實現許多IDE中的自動完成類成員的功能,當然,這個功能還比不上Eclispe、Visual Studio等IDE中的強大,這一點是VIM比較可惜的地方。VIM 7.0引入了Omni Completion,可以自定義匹配完成函數,也許可以彌補這個缺陷。
(7) folding VIM支持折疊代碼,還可以根據文件中特殊的標記對文件中的行折疊,可以實現Outline視圖,這可以極大的方便編輯很大的文件。 Reference: :help fold (8) quickfix 許多人對于UNIX開發的印象都是“編輯代碼,退出編輯器,編譯,發現錯誤,記錄出錯信息,遍輯代碼,退出編輯器,編譯,用gdb調試,再編輯代碼……”,這是古老的VI時代的事情了,有了VIM的quickfix特性,可以在VIM里編譯然后直接跳到編譯出錯的行,這個反復的過程無需退出編輯器,而且VIM的quickfix特性可以經配置后支持不同的編譯器以及不同的語言:只要編譯器在出錯信息里包含文件名和行號。 不過比較遺憾的是VIM對于集成調試支持還不好,有些項目嘗試集成GDB到VIM,比如http://skawina./mikolaj/vimgdb/和http://www./zellerin/gdbvim/,在http://www./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=Java Reference: :help autocmd.txt (10)mode line 在編輯文件時常常指定一些選項,比如縮進量、是否將制表符轉換成空格等,每次手動指定這些選項很麻煩,寫到vimrc中卻又成了全局選項,而且換了一份 VIM,原有的設置就丟失了。VIM可以識別文件中的特殊行,自動設置一些選項,下面是寫在C源文件開頭的一個mode line示例:
四、強大方便的幫助系統 使用了那么多軟件,只有VIM和Emacs的幫助系統給筆者方便快捷的感覺,大部分軟件的幫助往往是擺設而已,而VIM的幫助的確是考慮到了自己“help”的身份,利用它能很方便容易的找到想要的東西。 VIM的幫助是超鏈接形式的,它使用的就是tags,所以可以跟ctags功能一樣按Ctrl-]跳轉到鏈接所指處,按Ctrl-t返回。
:help options 可以找到所有的選項說明 查看某一個選項的值(實際上選項是VIM中的一種變量,類似SHELL的變量以$符號引用,VIM的選項以&引用,另外VIM的寄存器以@引用): :echo &tabstop 五、其它高級功能 (1)寄存器 VIM里面的寄存器可以用來保存拷貝的文本、記錄的宏、設置的書簽等等,一般的編輯器都只有一個剪切板(MS Office加入了多個剪切板),而VIM和Emacs編輯器中的多寄存器可以實現多個剪切板的功能。VIM中有九類寄存器:
使用:reg命令可以看到所有寄存器中的內容,使用"+y或者"*y可以將visual mode下選擇 Reference: :help registers (2) 宏 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./~brutt/msf-abbrev.html Reference: :help :ab (6) :s//和:g//,:!g// 這兩個命名加上正則表達式,常常能完成非常復雜的編輯任務,可以毫不夸張地說是VIM的兩柄瑞士軍刀。:s是替換操作,:g是查找匹配模式的行,:!g是查找不匹配模式的行。 http://www./tips/tip.php?tip_id=1063這個tip可以把:g找到的行拷貝到一個新的緩沖區中,非常有用。
(7) 插件 VIM自己有腳本語言,另外也支持用Perl/Python/Tcl/Ruby/Scheme編寫插件,這些插件極大的豐富了VIM的功能。 (8) color scheme VIM有許多配色方案,下面這個鏈接有許多配色方案效果的圖樣:http://www.cs./~maverick/VimColorSchemeTest/ (9) 二進制編輯 VIM可以利用xxd實現二進制編輯,不過這項功能還是不夠好用。 (10) sign sign指在編輯窗口的最左列顯示一個標記,利用這個功能能實現很多IDE中的書簽標記或者斷點標記。 Reference: :help sign 六、VIM Scripts VIM script包含幾大類:
VIM的script安裝非常簡單,下載的script文件或者壓縮包里頭都有安裝說明,在VIM的安裝目錄(比如C:\VIM64)下面有一個 vimfiles目錄,把script放到vimfiles目錄下即可。對于多用戶系統,可以在HOME目錄(一般是c:\Documents and Settings\ <USER_NAME>\)下面建立一個vimfiles目錄,把script放置到這里。 下面是一些好用的VIM插件,具體使用辦法請參考各自。vim文件頭部的注釋。 BufExplorer.vim ***** Taglist.vim ***** TabBar.vim *** minibufexpl.vim *** c.vim *** CRefVim ** latex-suite ***** word_complete.vim *** Vim JDE cppcomplete.vim ** The NEAD Commenter ** winmanager sketch.vim *** DrawIt.vim ** MultipleSearch *** SearchComplete.vim * Vim Intellisense project JavaBrower vimspell cream IComplete 七、VIM資源
幾個學習正則表達式的工具(from happyvim at newsmth)
http://www./ yzis是一個新的VI變種,它支持變寬字體,目前功能還不夠豐富。 http://ex-vi./ 傳統VI的源代碼 八、編譯安裝最新CVS版的VIM 1. 獲取源代碼 cvs -z3 -d:pserver:anonymous@cvs.:/cvsroot/vim co vim7 源代碼位于當前目錄的vim7目錄下面,假設安裝目標在d:\work\program\Vim\vim70b 2.編譯 注意重新編譯前最好clean一下,確保“*obj*”目錄被刪除了,否則可能出現莫名其妙的問題,比如鏈接時找不到一些函數。下面是一個批處理腳本: rem ---------------------------------------------> 對于MinGW, @echo off 如果發現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 然后進入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支持或者鍵綁定。
評論:![]() ![]() 此文摘自太平洋電腦網: ![]() ![]() vim有三種模式-普通(可視命令)模式,命令行模式,編輯模式。啟動vim后在任何模式下按Esc鍵進入到普通模式。普通模式下輸入 : 回車進入命令行模式,此時vim最窗口最下面一行為 : 后面可以輸入命令行命令.在執行任何命令前要確保在相應的模式下。 ![]() ![]() 2.基本設置-命令行模式下
:scriptnames 列出配置文件.vimrc所在的目錄 :version 用戶所用的配置文件.vimrc的位置
![]() ![]() 3.光標定位(普通模式、可視模式) $ 當前行的末尾 0 當前行的開頭 ^ 當前行第一個字母 gg 文件頭 G 文件尾 `` 回到光標跳轉前的位置 H 跳到屏幕上的第一行 M 跳到屏幕的中間行 L 跳到屏幕上的最后一行 w: 光標以單詞向前移動至單詞第一個字母 b: 與w相反,向后移動至單詞的第一個字母 e: 光標以單詞向前移動至單詞最后一字母 ge: 與e相反,向后移動至單詞的最后一字母 %: 移動到與制匹配的括號上去(),{},[],<>等 CTRL+G 得到當前光標在文件中的位置 向前翻頁: CTRL+F 向下移動半屏:CTRL+G 向后翻頁: CTRL+B 補記: .光標定位(普通模式、可視模式)$ 當前行的末尾0 當前行的開頭^ 當前行第一個字母gg 文件頭G 文件尾`` 回到光標跳轉前的位置H 跳到屏幕上的第一行M 跳到屏幕的中間行L 跳到屏幕上的最后一行w: 光標以單詞向前移動至單詞第一個字母b: 與w相反,向后移動至單詞的第一個字母e: 光標以單詞向前移動至單詞最后一字母ge: 與e相反,向后移動至單詞的最后一字母%: 移動到與制匹配的括號上去()... 光標定位技巧的補充: ‘‘ 同`` -- 此命令相當有用, 它移動光標到上一個標記處, 比如用 gd, * 等查 找到某個單詞后, 再輸入此命令則回到上次停留的位置. ‘. -- 此命令相當好使, 它移動光標到上一次的修改行. `. -- 此命令相當強大, 它移動光標到上一次的修改點.
![]() ![]() 4.刪除和復制(普通模式、可視模式) 刪除:
可視模式下的方式: 可視模式下,選中要編輯的文字,可執行d、y,操作。 寄存器下的操作: 在復制前可以先指定一個寄存器,方法是在雙引號后跟一個字母,例如"a指定了寄存器a,"B指定了寄存器B。所以,"ayy把當前行放進了寄存器a,以后就可以用"ap來粘貼寄存器a里的內容了。如果不確定寄存器里放了什么內容,可以使用:reg來查看。 Vim提供了一個很有用的特殊寄存器"+,它的內容就是系統剪貼板的內容。可以在Vim里用"+p粘貼出來。
![]() ![]() 5.多文件操作
|
|