Vim

開源文本編輯器

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

Vim
在終端機模擬程式下執行的Vim
在終端機模擬程式下執行的Vim
原作者布萊姆·米勒(Bram Moolenaar)
首次發佈1991年11月2日,​33年前​(1991-11-02[1]
目前版本9.1.0[2][3]在維基數據編輯(2024年1月2日,10個月前)
原始碼庫 編輯維基數據連結
程式語言C和Vim指令稿
作業系統AmigaBeOSBSDLinuxMac OSMac OS XWindowsMS-DOSOpenVMSOS/2OS/390UNIX
平台跨平台,包括Unix, LinuxMicrosoft Windows
語言英語,法語,意大利語,波蘭語,俄語,中文[4]
類型文字編輯器
許可協定自由軟件慈善軟件英語CarewareVim許可協定
網站www.vim.org/ 編輯維基數據

Vim的第一個版本由布萊姆·米勒在1991年發佈。最初的簡稱是Vi IMitation,隨着功能的不斷增加,正式名稱改成了Vi IMproved。現在是在開放原始碼方式下發行的自由軟件

Vim歷史

布萊姆·米勒1988年購入他的Amiga電腦,以在雅達利ST運作的Stevie英語Stevie (text editor)為基礎,將它移植到Amiga電腦上,於1988年發佈了Vim的1.0版本。最初的目標只是完全複製vi的功能,那個時候的Vim是Vi IMitation(Vi 模仿品)的簡稱。1991年Vim 1.14版被"Fred Fish Disk #591"這個Amiga用的免費軟件集所收錄了。1992年1.22版本的Vim被移植到了UNIX和MS-DOS上。從那個時候開始,Vim的全名就變成Vi IMproved(改良)了。

在這之後,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是按照VIM許可證發佈的開源軟件,這個協定相容GPL[5]。它的協定中包含一些慈善條款,建議用戶向荷蘭ICCF捐款,用於幫助烏干達愛滋病患者。VIM啟動時會顯示「Help poor children in Uganda!」的字樣,在中文版本中則是「請幫助烏干達的可憐孩童![6]

在指令列輸入 :help 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的打開模式僅支援可視模式)
  • 多緩衝編輯
  • 任意個數的分割窗口(橫,豎)
  • 具備列表字典功能的手稿語言
  • 可以在指令碼中呼叫LuaPerlRubyPythonTclMzScheme
  • 單詞縮寫功能
  • 動態單詞補全
  • 多次復原和重做
  • 對應400種以上純文字檔案的語法突顯
  • CC++PerlJavaRubyPython等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

Neovim[7]是Vim的一個重構版本,致力於成為Vim的超集(superset)[8]。Neovim和Vim設定檔採用相同的語法,所以Vim的設定檔也可以用於Neovim[9]。Neovim的第一個版本在2015年12月發行,並且能夠完全相容Vim的特性[10]

Neovim專案從2014年發起,有許多來自Vim社區的開源開發者為其提供早期支援,包括更好的指令碼支援、外掛程式以及和更好地融合圖形介面等[11][12]。Neovim項目在2014年3月23號成功獲得捐款,足夠支援一名全職開發者[13]。還有很多其他發揮Neovim功能的前端正在開發中[14][15]

相比於Vim,Neovim的主要改進在於其支援非同步載入外掛程式。此外,Neovim的外掛程式可以用任意語言編寫,而Vim的外掛程式僅能使用Vimscript進行編寫[16][17]。Neovim在Ubuntu發行版中可以用PPA源進行安裝[18],同時也支援採用其他包管理器進行安裝[19],因此在各種Linux發行版中都可以順利安裝。

參見

參考文獻

  1. ^ (英文)Paul, Ryan. Two decades of productivity: Vim's 20th anniversary. ars technica. 2011-11-02 [2011-12-14]. (原始內容存檔於2012-05-04). 
  2. ^ 2.0 2.1 Vim 9.1 is available. 2024年1月2日 [2024年1月3日]. 
  3. ^ 3.0 3.1 Release v9.1.0. 2024年1月2日 [2024年1月3日]. 
  4. ^ Vim in non-English languages. [2008-02-04]. (原始內容存檔於2011-08-23). 
  5. ^ vim.org. Vim documentation: uganda. [2020-08-09]. (原始內容存檔於2012-02-23). 
  6. ^ Marshall, Wayne. Algorithms in Africa. Linux Journal. 1 January 2001 [30 March 2011]. (原始內容存檔於2012-07-21). 
  7. ^ Neovim: vim, out of the box. [2016-09-19]. (原始內容存檔於2022-05-16). 
  8. ^ Neovim Vision. [2016-09-19]. (原始內容存檔於2022-04-26). 
  9. ^ Switching to NeoVim. [2016-09-19]. (原始內容存檔於2016-02-16). 
  10. ^ How to start using Neovim instead of Vim. [2016-09-19]. (原始內容存檔於2017-06-04). 
  11. ^ Neovim: Rebuilding Vim For the 21st Century. [2016-09-19]. (原始內容存檔於2020-11-12). 
  12. ^ Vimcasts.org blog post. [2016-09-19]. (原始內容存檔於2021-08-17). 
  13. ^ Bountysource fundraiser. [2016-09-19]. (原始內容存檔於2021-01-05). 
  14. ^ NyaoVim frontend. [2016-09-19]. (原始內容存檔於2022-04-30). 
  15. ^ Mac OS X frontend. [2016-09-19]. (原始內容存檔於2022-04-17). 
  16. ^ Why Neovim is Better than Vim. [2016-09-19]. (原始內容存檔於2022-05-01). 
  17. ^ Keidel, Sven. A disintegrated development environment (PDF). 2015: 38–39 [February 10, 2016]. [永久失效連結]
  18. ^ Neovim PPA information. [2016-09-19]. (原始內容存檔於2017-06-20). 
  19. ^ Neovim wiki: installation instructions. [2016-09-19]. (原始內容存檔於2022-05-16). 

外部連結