提升你的 Vim 技能的 5 個方法

2020-04-05 23:24:00

通過一些有趣的小技巧使你的文字編輯器更上一層樓。

Vim 是最受歡迎的文字編輯器之一,因此絕對值得你花時間去學習如何使用它。就算你只是學習使用這個無處不在的 Vi(m) 命令列文字編輯器開啟檔案、輸入和編輯一些文字、儲存編輯的檔案並退出程式,你都會受益匪淺。

你會發現,使用 Vim 非常方便的的場景幾乎總是涉及到執行遠端 Shell 操作的任務。如果你時不時地使用 ssh,比如

$ ssh [email protected]

並在虛擬專用伺服器(VPS)或本地虛擬化容器中工作,那麼就可以從這些強大的 Vim 技能中受益匪淺。

將 Vim 設定為預設的文字編輯器

幾乎所有的現代 Linux(或 BSD)發行版中,都可以在終端模擬器的 shell 命令提示字元下使用 Vim。一旦在你的使用者 shell 程式中將 Vim 定義為預設編輯器後,那麼就可以使用熟悉的 Vim 鍵系結來在內建的實用程式(例如 man)中導航。我將說明如何使用 Bash 和 Z shell(zsh)來實現此目的,zsh 現在是 macOS 使用者的預設 shell(自 Catalina 起)。

在 Bash 中將 Vim 設定為預設

Bash 通過點檔案的組合來管理設定。最常見的的做法將你的編輯器新增到主目錄中的 .bashrc 檔案中,但也可以將其新增到 .bash_profile 中。(請閱讀 GNU Bash 文件了解兩者的不同之處)。

通過在 ~/.bashrc 中新增以下內容,將 Vim 設定為預設編輯器:

# set default editor to Vimexport EDITOR=vim

# 開頭的行是可選的注釋,這是一個好方法,可以提醒自己該命令的作用。

在 zsh 中將 Vim 設定為預設

zsh 是一種越來越流行的終端模擬器,尤其是在蘋果公司的基於 FreeBSD 的 Darwin 系統最近從 Bash 轉向 zsh 以來。

zsh 點檔案與 Bash 的檔案相當,因此你可以在 ~/.zshrc~/.zprofile 之間進行選擇。有關何時使用哪一個的詳細資訊,請參見 zsh文件

將其設定為預設:

# set default editor to Vimexport EDITOR=vim

優化 Vim 設定

Vim 像是終端模擬器 shell 一樣,也使用點檔案來設定個人偏好。如果你發現了這種模式,則可能已經猜到它是 ~/.vimrc

你可能要更改的第一個設定是將對傳統的 Vi 相容模式切換為“關閉”。由於 Vim 是 Vi 的超集,因此 Vi 中的所有功能在 Vim 中都是可用的,並且在 Vim 中得到了很大的改進,你可以獲得許多高階功能。最新版本(8.2)允許你在分割的視窗中以子進程 shell 的方式開啟一個終端。

順便說一句,明確關閉對傳統的 Vi 的相容性看起來沒有什麼作用(事實上,可能並沒有什麼作用)。當 Vim 遇到 .vimrc 檔案時,它會暗暗地自動將相容模式切換到關閉。但有時將其明確關閉仍然很重要。縮寫 nocpnocompatible 的同義詞,作用是一樣的。條條大道通羅馬,切換偏好設定有很多方式。

.vimrc 語法中, 以 " 開頭的行是注釋(就像 .bashrc 檔案中的 # 一樣),這些註釋可以幫助你記住諸如為何選擇了一個隱晦的設定名稱之類的內容。

要關閉 Vi 相容性,請將以下內容新增到 ~/.vimrc 檔案中:

" ensure that legacy compatibility mode is off" documentation: <http://vimdoc.sourceforge.net/htmldoc/options.html\#'compatible>'set nocp

理解模式

Vim 的 “模式”概念是非常重要的,尤其是“普通模式”和“插入模式”之間的區別。對模式的混淆是大多數新使用者的困擾。模式並不是 Vim 所獨有的,甚至也不是 Vi 所引入的。命令模式是如此的古老,以至於它比 70 年代發明的複製和貼上功能還要早。

重要的模式

Vim 依賴於不同的模式來定義鍵盤的敲擊行為。需要了解的重要模式有:

  • 普通模式:預設模式,主要用於導航和開啟檔案。
  • 插入模式(包括替換):這種模式下 Vim 允許將文字輸入到開啟的檔案中。
  • 可視模式:Vim 的行為類似於基於滑鼠的輸入方式,如複製、編輯、替換等。
  • 命令模式(包括行模式、Ex 命令模式和末行模式):是在 Vim 中做更多事情的強大方法。

每種模式都有很多值得探索的地方。使用 Vimtutorvimtutor)可以互動式地學習移動游標、模式和在末行模式下執行 Ex 命令。一些不可缺少的生產力操作符包括:

操作符說明
:E開啟資源管理器,用於定位檔案和目錄。
.重複上次的編輯操作。
;向前重複上一次的動作或移動
,向後重複上一次的動作或移動。
/向前搜尋文件。
?向後搜尋文件。
*查詢游標所在處的單詞的下一個出現的地方。
#查詢游標所在處的單詞的上一次出現的地方。
~切換大小寫。
%()[]{} 的開閉符號之間切換;對編碼非常有用。
z=提出拼寫建議。

像鋼琴一樣彈奏 Vim

儘管把 Vim 的操作符“語言”記在記憶中是很重要的,但要想掌握它,難點在於學會像音樂家一樣思考,把操作符和動作組合成“和弦”,這樣你就可以像彈鋼琴一樣彈奏 Vim。這就是 Vim 的文字操作能力可以與另一個著名的命令列編輯器 Emacs 相媲美的地方。(雖然其中一個編輯器會讓磨損掉你的 Esc 鍵,而另一個編輯器會讓你的 Ctrl 鍵磨損掉。)

在描述鍵“和弦”時,Vim 中的傳統做法是用大寫字母 C 後面加上一個連字元(C-)來指代 Ctrl 鍵。這並不是通用的,但我將從這裡開始遵循這一慣例,並在有可能引起混淆的時候加以說明。

如果你在 Vim 中鍵入長行,你會想把它設定成可以換行。想要根據你的工作方式對 Vim 進行個性化設定,請考慮一下這個設定:預設情況下,你希望 Vim 啟動時如何處理文字換行?開還是關?我喜歡將其關閉,並將其留在執行命令檔案之外。當我想讓文字自動換行時,我只需在命令列模式下用 :set wrap 設定即可。

讓 Vim 設定為預設情況下自動換行並沒有錯,這只是一個偏好問題 —— 它可能隨著時間的推移而改變。同樣你也可以控制貼上、程式碼語言縮排語法和 Tab 鍵的設定(製表符還是空格?多少個空格?可也在這裡深入研究這些選項)。所有這些預設行為的選項都是完全可設定和可更改的,並且在你使用命令列模式操作時可以實時更改。

你會在社群論壇、Vim 維基和文章(比如這篇文章)中找到很多關於設定 Vim 預設設定的建議。你應該很熟悉為你的個人計算環境設定偏好設定,Vim 也不例外。我強烈建議你從對設定進行很小的更改開始,慢慢地進行其它更改,以便你可以輕鬆地恢復設定。這樣一來,你就可以好多年避免使用外掛或完全不用外掛。

Vim 8.2 中的分割、標籤和終端

有兩種方法可以將你正在處理的檔案分割成不同的檢視:它們可以並排顯示,也可以使用應用程式分頁在全螢幕(視窗)中切換。這些對應用程式視窗的更改是從命令模式啟動的,這需要使用冒號(:)來調起提示符。

每個分割的視窗可以容納一個檔案進行編輯,你可以通過分頁在更多的檔案之間隨意切換。分割的螢幕空間有限,所以當你想分割更多的螢幕時,分頁是很方便的。想要如何設定,純屬個人喜好的問題。要水平分割一個視窗,使用 :sp,垂直分割時使用 :vs

Vim 8.2 開始,你可以用 :vert term 開啟一個垂直分割的終端 shell 子進程,以在你的程式碼旁邊的命令列上進行操作。你需要鍵入 exit 來關閉你的終端進程,就像你結束一個 shell 對談一樣,但你關閉這個分割的視窗和分頁的方式和關閉任何普通的 Vim 視窗一樣,要用 :q 來關閉。

要初始化一個分頁,請使用一個特殊的編輯命令::tabedit,它會自動切換到新開啟的分頁。如果你給該命令一個檔名作為引數,會開啟該檔案並進行編輯。如果你忽略了給它一個檔名作為引數,可以在命令列模式下的使用編輯命令 :e filename.txt,就像在任何一個普通的 Vim 視窗中一樣。可以使用下一個(:tabn)和上一個(:tabp)命令在分頁間導航。

要使用分割,你需要知道如何使用組合鍵 C-w 和你想要移動的方向的移動鍵,例如左(h)、下(j)、左(k)、右(l)。如果你想學習更多的組合鍵,請閱讀 Vim 手冊中的 :help split:help tabpage

獲取幫助

雖然可以在 Vimtutor 中開啟參考 Vim 手冊,但用 :help 開啟 Vim 幫助,可以讓你自己把時間花在編輯器上,不用完全依賴像這樣的文章,就能獲得更多的成果。經驗是掌握 Vim 的關鍵。經驗有助於提高你的整體計算直覺,因為 Vim 中的很多東西都是從 Unix 宇宙中汲取的。

祝你在探索 Vim 之美的過程中玩得開心,有什麼問題可以在評論中分享。