Vim

**Vim** 是從 vi 發展出來的一個文字編輯器。其代碼補完、編譯及錯誤跳轉等方便編程的功能特別豐富，在程式設計師中被廣泛使用。和 Emacs 並列成為類 Unix 系統使用者最喜歡的編輯器。

Vim 的第一個版本由布萊姆・米勒在 1991 年發布。最初的簡稱是 **V**i **IM**itation，隨著功能的不斷增加，正式名稱改成了 **V**i **IM**proved。現在是在開放原始碼方式下發行的自由軟體。

## Vim 歷史

布萊姆・米勒在 80 年代末購入他的 Amiga 電腦時，Amiga 上還沒有他最常用的編輯器 vi。Bram 從一個開源的 vi 複製 Stevie 開始，開發了 Vim 的 1.0 版本。最初的目標只是完全複製 vi 的功能，那個時候的 Vim 是 **V**i **IM**itation（類比）的簡稱。1991 年 Vim 1.14 版被 "Fred Fish Disk #591" 這個 Amiga 用的免費軟體集所收錄了。1992 年 1.22 版本的 Vim 被移植到了 UNIX 和 MS-DOS 上。從那個時候開始，Vim 的全名就變成 **V**i **IM**proved（改良）了。

在這之後，Vim 加入了不計其數的新功能。做為第一個里程碑的是 1994 年的 3.0 版本加入了多窗口編輯（分割視窗）模式，可以在同一終端中同時編輯多個檔案。1996 年發布的 Vim 4.0 是第一個利用 GUI（圖形化使用者介面）的版本。1998 年 5.0 版本的 Vim 加入了 highlight（語法突顯）功能。2001 年的 Vim 6.0 版本加入了代碼摺疊、外掛程式、多國語言支援、垂直分割視窗等功能。2006 年 5 月發布的 Vim 7.0 版更加入了拼字檢查、上下文相關補全，分頁編輯等新功能。2008 年 8 月發布的 Vim 7.2，合併了 Vim 7.1 以來的所有修正修補程式，並且加入了指令碼的浮點數支援。

## 協定

目前，VIM 是按照 VIM 許可證發布的開源軟體，這個協定相容 GPL。它的協定中包含一些慈善條款，建議使用者向荷蘭 ICCF 捐款，用於幫助烏干達的愛滋病患者。VIM 啟動時會顯示「**Help poor children in Uganda!**」的字樣，在中文版本中則是「**請幫助烏干達的可憐孩童！**」。

## 學習曲線

對於大多數使用者來說，Vim 有著一個比較陡峭的學習曲線。這意味著開始學習的時候可能會進展緩慢，但是一旦掌握一些基本操作之後，能大幅度提高編輯效率。為了幫助學習，Vim 為初學者準備了 Vim 教學。通常可以在 Unix 系統命令列下輸入 "vimtutor" 或者點擊 Windows 系統桌面上的 Vim 教學圖示進入。在 Vim 使用者手冊中更加詳細的描述了 Vim 的基礎和進階功能。可以在 Vim 中輸入 ":help user-manual" 進入使用者手冊。手冊除了原始的英文版本之外，也被志願者翻譯成了各國文字，其中包括中文。

新使用者也應該學習 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" 把當前段落所有字母大寫。

#### 插入普通模式

這個模式是在插入模式下按下 ctrl-o 鍵的時候進入。這個時候暫時進入普通模式，執行完一個命令之後，Vim 返回插入模式

#### 插入可視模式

這個模式是在插入模式下按下 ctrl-o 鍵並且開始一個可視選擇的時候開始。在可視區域選擇取消的時候，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 種以上純文字檔案的語法突顯
* C／C++，Perl，Java，Ruby，Python 等 40 種以上語言的自動縮排
* 利用 ctags 的標籤中跳轉
* 崩潰後檔案恢復
* 游標位置和打開的緩衝狀態的儲存復原（session 功能）
* 可以對兩個檔案進行差分，同步功能的 diff 模式
* 遠端檔案編輯
* 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 分支和 for/while 迴圈。使用者還可以自己定義函式，並且可以使用超過 100 種的預定義函式。編寫成的指令碼檔案可以在除錯模式中進行除錯。

## 不足之處

* 大檔案讀取速度很慢（可在 vim.org 下載並安裝名為 LargeFile 的 Script 來最佳化）LargeFile （頁面存檔備份，存於網際網路檔案館）
* 即使檔案不大，如果有非常長的行的話，處理也會變慢（同上）
* vim 自己的手稿語言處理速度不快，若是安插過多指令碼套件，啟動速度會變慢。
* 存在類似 Ctrl-1 等不能被對映的鍵（限於某些字元終端的效能）

## 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）文字編輯器的使用者之間的競爭
* 檔案編輯器列表
* 文字編輯器比較
* VimIM——Vim 的一個外掛程式中文輸入法
* Vimperator

## 參考文獻

## 外部連結

* vim.org （頁面存檔備份，存於網際網路檔案館）（官方首頁）
* Vim Chinese Documentation （頁面存檔備份，存於網際網路檔案館）（Vim 中文文件）
* spanish passion
* 大家來學 VIM（一個歷久彌新的編輯器） （頁面存檔備份，存於網際網路檔案館）
* 碎碎念（HQ 零零 E 的 Vim 進階 blog）