Vim 是從 vi 發展出來的一個文字編輯器。其程式碼補完、編譯及錯誤跳轉等方便程式設計的功能特別豐富，在程式設計師中被廣泛使用。和 Emacs 並列成為類 Unix 系統使用者最喜歡的編輯器。 Vim 的第一個版本由布萊姆米勒在 1991 年釋出。最初的簡稱是 Vi IMitation，隨著功能的不斷增加，正式名稱改成了 Vi IMproved。現在是在開放原始碼方式下發行的自由軟體。 Vim 歷史 布萊姆米勒 1988 年購入他的 Amiga 計算機，以在雅達利 ST 運作的為基礎，將它移植到 Amiga 電腦上，於 1988 年發布了 Vim 的 10 版本。最初的目標只是完全複製 vi 的功能，那個時候的 Vim 是 Vi IMitation（Vi 模仿品）的簡稱。1991 年 Vim 114 版被 Fred Fish Disk 591 這個 Amiga 用的免費軟體集所收錄了。1992 年 122 版本的 Vim 被移植到了 UNIX 和 MSDOS 上。從那個時候開始，Vim 的全名就變成 Vi IMproved（改良）了。 在這之後，Vim 加入了不計其數的新功能。做為第一個里程碑的是 1994 年的 30 版本加入了多視窗編輯（分割視窗）模式，可以在同一終端中同時編輯多個檔案。1996 年釋出的 Vim 40 是第一個利用 GUI（圖形使用者介面）的版本。1998 年 50 版本的 Vim 加入了 highlight（語法高亮）功能。2001 年的 Vim 60 版本加入了程式碼摺疊、外掛、多國語言支援、垂直分割視窗等功能。2006 年 5 月釋出的 Vim 70 版更加入了拼字檢查、上下文相關補全，標籤頁編輯等新功能。2008 年 8 月釋出的 Vim 72，合併了 Vim 71 以來的所有修正補丁，並且為 vim 指令碼增加了浮點數支援。 協議 目前，VIM 是按照 VIM 許可證釋出的開源軟體，這個協議相容 GPL。它的協議中包含一些慈善條款，建議使用者向荷蘭 ICCF 捐款，用於幫助烏干達的艾滋病患者。VIM 啟動時會顯示 「Help poor children in Uganda」 的字樣，在中文版本中則是 「 請幫助烏幹達的可憐孩童！」。 在指令列輸入 help uganda 可以看到詳細的捐款方式。 學習曲線 對於大多數使用者來說，Vim 有著一個比較陡峭的學習曲線。這意味著開始學習的時候可能會進展緩慢，但是一旦掌握一些基本操作之後，能大幅度提高編輯效率。為了幫助學習，Vim 為初學者準備了 Vim 教學。通常可以在 Unix 系統命令列下輸入 vimtutor 或者點選 Windows 系統桌面上的 Vim 教學圖示進入。在 Vim 使用者手冊中更加詳細的描述了 Vim 的基礎和進階功能。可以在 Vim 中輸入 help usermanual 進入使用者手冊。手冊除了原始的英文版本之外，也被志願者翻譯成了各國文字，其中包括中文。 新使用者也應該學習 Vim 的幫助系統。可以在 Vim 中輸入不帶引數的 help 來閱讀主幫助檔案。 模式 從 vi 衍生出來的 Vim 具有多種模式，這種獨特的設計容易使初學者產生混淆。幾乎所有的編輯器都會有插入和執行命令兩種模式，並且大多數的編輯器使用了與 Vim 截然不同的方式：命令目錄（滑鼠或者鍵盤驅動），組合鍵（通常透過 control 鍵（CTRL）和 alt 鍵（ALT）組成）或者滑鼠輸入。Vim 和 vi 一樣，僅僅透過鍵盤來在這些模式之中切換。這就使得 Vim 可以不用進行選單或者滑鼠操作，並且最小化組合鍵的操作。對文字錄入員或者程式設計師可以大大增強速度和效率。 Vim 具有 6 種基本模式和 5 種派生模式。 基本模式 普通模式 在普通模式中，用的編輯器命令，比如移動游標，刪除文字等等。這也是 Vim 啟動後的預設模式。這正好和許多新使用者期待的操作方式相反（大多數編輯器預設模式為插入模式）。 Vim 強大的編輯能力來自於其普通模式命令。普通模式命令往往需要一個運算子結尾。例如普通模式命令 dd 刪除當前行，但是第一個 d 的後面可以跟另外的移動命令來代替第二個 d，比如用移動到下一行的 j 鍵就可以刪除當前行和下一行。另外還可以指定命令重複次數，2dd（重複 dd 兩次），和 dj 的效果是一樣的。使用者學習了各種各樣的文字間移動／跳轉的命令和其他的普通模式的編輯命令，並且能夠靈活組合使用的話，能夠比那些沒有模式的編輯器更加高效的進行文字編輯。 在普通模式中，有很多方法可以進入插入模式。比較普通的方式是按 a（append／追加）鍵或者 i（insert／插入）鍵。 插入模式 在這個模式中，大多數按鍵都會向文字緩衝區中插入文字。大多數新使用者希望文字編輯器編輯過程中一直保持這個模式。 在插入模式中，可以按 ESC 鍵回到普通模式。 可視模式 這個模式與普通模式比較相似。但是移動命令會擴大高亮的文字區域。高亮區域可以是字元、行或者是一塊文字。當執行一個非移動命令時，命令會被執行到這塊高亮的區域上。Vim 的 文字物件 也能和移動命令一樣用在這個模式中。 選擇模式 這個模式和無模式編輯器的行為比較相似（Windows 標準文字控制元件的方式）。這個模式中，可以用滑鼠或者游標鍵高亮選擇文字，不過輸入任何字元的話，Vim 會用這個字元替換選擇的高亮文字塊，並且自動進入插入模式。 命令列模式 在命令列模式中可以輸入會被解釋成並執行的文字。例如執行命令（ 鍵），搜尋（ 和 鍵）或者過濾命令（ 鍵）。在命令執行之後，Vim 返回到命令列模式之前的模式，通常是普通模式。 Ex 模式 這和命令列模式比較相似，在使用 visual 命令離開 Ex 模式前，可以一次執行多條命令。 衍生模式 運算子等待模式 這個派生模式指普通模式中，執行一個操作命令後 Vim 等待一個 動作 來完成這個命令。Vim 也支援在運算子等待模式中使用 文字物件 作為動作，包括 aw 一個單詞（a word）、as 一個句子（a sentence）、ap 一個段落（a paragraph）等等。 比如，在普通模式下 d2as 刪除當前和下一個句子。在可視模式下 apU 把當前段落所有字母大寫。 插入普通模式 這個模式是在插入模式下按下 ctrlo 鍵的時候進入。這個時候暫時進入普通模式，執行完一個命令之後，Vim 返回插入模式 插入可視模式 這個模式是在插入模式下按下 ctrlo 鍵並且開始一個可視選擇的時候開始。在可視區域選擇取消的時候，Vim 返回插入模式。 插入選擇模式 通常這個模式由插入模式下滑鼠拖拽或者 shift 方向鍵來進入。當選擇區域取消的時候，Vim 返回插入模式。 替換模式 這是一個特殊的插入模式，在這個模式中可以做和插入模式一樣的操作，但是每個輸入的字元都會覆蓋文字緩衝中已經存在的字元。在普通模式下按 R 鍵進入。 其他 Evim Easy Vim Evim（Easy Vim）是一個特殊的 GUI 模式用來儘量的表現的和 無模式 編輯器一樣。編輯器自動進入並且停留在插入模式，使用者 只 能透過選單、滑鼠和鍵盤控制鍵來對文字進行操作。可以在命令列下輸入 evim 或者 vim y 進入。在 Windows 下，通常也可以點選桌面上 Evim（Easy Vim）的圖示。 功能 概要 根據設定可以和原始 vi 幾乎相容（例外包括 Vim 不支援 Vi 的開啟模式僅支援可視模式） 多緩衝編輯 任意個數的分割視窗（橫，豎） 具備列表和字典功能的指令碼語言 可以在指令碼中呼叫 Lua，Perl，Ruby，Python，Tcl，MzScheme 單詞縮寫功能 動態單詞補全 多次撤銷和重做 對應 400 種以上文字 zhhans 檔案；zhhant 檔案； 的語法高亮 C／C，Perl，Java，Ruby，Python 等 40 種以上語言的自動縮排 利用 ctags 的標籤中跳轉 崩潰後 zhhans 檔案；zhhant 檔案； 恢復 游標位置和開啟的緩衝狀態的儲存復原（session 功能） 可以對兩個 zhhans 檔案；zhhant 檔案； 進行差分，同步功能的 diff 模式 遠端 zhhans 檔案；zhhant 檔案； 編輯 Omni 補全（上下文相關的補全） 幫助 Vim 提供了文字形式的大量文件。並且 Vim 為了能夠快速找到問題的解決方案，提供了各種各樣的功能。根據 Vim 自己的幫助檔案語法，關鍵字會被各種各樣醒目的顏色表示出來。可以用快捷鍵像在瀏覽器中那樣瀏覽幫助檔案。在 GUI 版的 Vim 中還可以使用滑鼠在幫助檔案中移動。方便使用者尋找問題解決方案的功能還不止這些，其中最主要的是 helpgrep 命令。使用這條命令，使用者可以在所有幫助檔案中搜索想要察看的內容，用 cwindows 可以在另一個視窗中表示搜尋的結果，根據搜尋的結果自動在幫助檔案內跳轉。使用 Vim 的幫助功能，更可以在搜尋的結果中，繼續進行搜尋。 程式開發相關功能 Vim 是程式設計師為了方便的編寫程式而開發的文字編輯器。Vim 具有可以讓寫程式碼的工作變得輕鬆愉快的各種各樣功能。和整合開發環境一樣，Vim 具有可以配置成在編輯程式碼原始檔之後直接進行編譯的功能。編譯出錯的情況下，可以在另一個視窗中顯示出錯誤。根據錯誤資訊，直接跳轉到正在編輯的原始檔出錯位置。程式碼高亮，文字摺疊，上下文關聯補完都是對程式設計師特別有幫助的功能（參考 help quickfix） 檔案比較 可以逐行的對文字檔案進行比較。Vim 可以並排顯示兩個版本的檔案，同時以各種各樣的顏色來表示有差別部分。改變過、新增的或者是被刪除的行會以顏色高亮來強調，沒有改變過的部分則會被自動摺疊表示。 對於已經在 vim 中開啟的兩個緩衝區，分別使用：diffthis 之後將會對這兩個緩衝區的內容進行比較，被比較的緩衝區可以是一個尚未存檔的記憶體中的緩衝區。 在比較兩個檔案的不同之處時，可以用：diffget 和：diffput 命令對每一處不同進行雙向的同步，也可以在比較不同時對內容進行其它編輯，然後用：diffupdate 對最新內容重新進行比較。 在瀏覽兩個檔案的不同之處時，可以用 c 和 c 兩個 Normal 模式的命令直接跳轉到上一個和下一個不同之處。 可以透過 diffopt 等選項更精細地控制哪些區別被認為是真正的不同之處，比如可以設定比較時忽略空白字元數量的不同。 Unix 下可以用 vimdiff 命令來使用這個功能。 指令碼語言 Vim 有其指令碼語言 Vimscript，使用 Vimscript 寫成的巨集可以實現自動執行復雜的操作。用 s 選項啟動 Vim，或者直接切換到宏所在目錄使用 source 命令都可以執行 Vim 指令碼。Vim 的配置檔案就可以作為 Vim 指令碼的一個範例，Unix 和 Linux 下配置檔名是vimrc，Windows 下配置檔案一般叫做_vimrc。這個檔案在啟動 Vim 的時候被自動執行。Vimscript 可以使用 Vim 命令列模式的所有命令，使用 normal 命令還可以使用通常模式中的所有命令。Vimscript 具有數字，字串兩種資料型別。用數字代表布林型別，0 代表假，之外的數全代表真。最新的 Vim 7 更提供了列表、關聯陣列等高階資料結構。Vimscript 也擁有各種比較運算子和算術運算子。控制結構實現了 if 分支和 forwhile 迴圈。使用者還可以自己定義函式，並且可以使用超過 100 種的預定義函式。編寫成的指令碼檔案可以在除錯模式中進行除錯。 不足之處 大檔案讀取速度很慢（可在 vimorg 下載並安裝名為 LargeFile 的 Script 來最佳化）LargeFile 即使檔案不大，如果有非常長的行的話，處理也會變慢（同上） vim 自己的指令碼語言處理速度不快，若是安插過多指令碼套件，啟動速度會變慢。 存在類似 Ctrl1 等不能被對映的鍵（限於某些字元終端的效能） Neovim Neovim 是 Vim 的一個重構版本，致力於成為 Vim 的超集（superset）。Neovim 和 Vim 配置檔案採用相同的語法，所以 Vim 的配置檔案也可以用於 Neovim。Neovim 的第一個版本在 2015 年 12 月發行，並且能夠完全相容 Vim 的特性。 Neovim 專案從 2014 年發起，有許多來自 Vim 社群的開源開發者為其提供早期支援，包括更好的指令碼支援、外掛以及和更好地融合圖形介面等。Neovim 專案在 2014 年 3 月 23 號成功獲得捐款，足夠支援一名全職開發者。還有很多其他發揮 Neovim 功能的前端正在開發中。 相比於 Vim，Neovim 的主要改進在於其支援非同步載入外掛。此外，Neovim 的外掛可以用任意語言編寫，而 Vim 的外掛僅能使用 Vimscript 進行編寫。Neovim 在 Ubuntu 發行版中可以用 PPA 源進行安裝，同時也支援採用其他包管理器進行安裝，因此在各種 Linux 發行版中都可以順利安裝。 參見 Vi Emacs 編輯器之戰 Emacs 和 vi（Vim）文字編輯器的使用者之間的競爭 檔案編輯器列表 文字編輯器比較 VimIMVim 的一個外掛中文輸入法 Vimperator 參考文獻 外部連結 vimorg （官方主頁） Vim Chinese Documentation （Vim 中文文件） spanish passion 大家來學 VIM（一個歷久彌新的編輯器） 碎碎念（HQ 零零 E 的 Vim 進階 blog） CategoryVi Category 文字編輯器 CategoryLinux 文字編輯器 Category 用 C 程式設計的自由軟體