編輯神器Vim新教程GitHub3400星,復雜命令輕松搞定
用聰明的方式打開 Vim,提高編輯效率。
提起文本編輯器,你一定會想到編輯器之神 Vim。作為一個快 30 歲的「老牌」編輯器,直到現在還很受歡迎。Vim 編輯文件非常高效,可支持多個操作系統,如 Unix/Linux、Windows、macOS,甚至 iOS 和 Android 上都能找到 Vim 的移植版本。
Vim 雖然非常強大,但是需要記住很多操作命令。如果沒有有效的學習方法,操作起來很不方便,只有做到非常熟練才能感受到它帶來的快捷。下圖展示了 Vim 中關于刪除、復制與粘貼的部分命令:

其實 Vim 的操作命令還遠不如此,如果沒有很好的學習方法,可能很難使用這種編輯器。
那么有沒有更好的方式來進行 Vim 學習呢?
近日,在 GitHub 上開源了一個用聰明的方式學習 Vim 的項目,上線短短幾天,便收獲了 3400 星。讓我們來看看它是怎么做到聰明學習 Vim 的。

項目地址:https://github.com/iggredible/Learn-Vim
用聰明的方式打開 Vim
該項目提供了學習 Vim 的具體步驟,共分為 19 個章節。通過學習,你將掌握 vim 的語法、對文件的移動操作、撤銷等等多種操作命令。
學習目錄如下圖所示:

這個「聰明」學習 Vim 到底體現在哪些方面呢?與別的 Vim 學習教程的不同之處又有哪些呢?接下來一一解析。
Vim 語法
在所有章節中,首先介紹一下 Vim 語法。一旦理解了 Vim 命令的語法結構,就可以與 Vim 進行「對話」了,就如想要學習一門語言,語法規則是繞不開的一步。而這個語法,就是「動詞 + 名詞」。現在使用基本的 Vim 動詞和名詞來建立詞匯表。
Vim 名詞與動詞
Vim 中的名詞(移動):移動是在 Vim 中進行上下左右等操作。Vim 中的一些動作如下所示:
h:左j:下k:上l:右w:移動到下個單詞的開頭}:跳到下一段$:移動到本行末尾
Vim 中的動詞(操作符):以 h 操作符為例,Vim 中有 16 種。但只需掌握其中的 3 種,就能滿足 80% 的編輯要求。
y 復制文本d 刪除文本,并保存到寄存器c 刪除文本,保存到寄存器,并開啟「插入」模式
現在了解了 Vim 中基本的名詞和動詞,就可以根據語法規則組合上述名詞和動詞:
y$:把當前所有的內容,從當前位置拖至行尾;
dw:從當前位置刪除到下一個單詞的開頭;
c}:從當前位置到當前段落末尾進行更改。
當然移動也接受數字作為參數,如果你想上移 3 行,不需要鍵入 k 三次,直接使用 3k 就行了:
y2h:向左移動 2 個字符;
d2w:刪除后面的 2 個單詞;
c2j:更改接下來 2 行。
除此以外,Vim 還允許通過鍵入操作符命令兩次來執行行操作。例如:鍵入「dd」,刪除整行;鍵入「cc」,更改整行內容。
Vim 可組合性和語法
在學習了 Vim 語法之后,下面介紹一下 Vim 中的可組合性。可組合性意味著擁有一組可以組合且執行更復雜命令的通用命令。
在 Vim 中可以組合較簡單的命令執行復雜的命令。當 Vim 與外部程序集成時,可組合性的真正威力就顯露出來了。
假如你有一個非常混亂的文本,如下所示,你想把它變成列表形式:
Id|Name|Cuteness01|Puppy|Very02|Kitten|Ok03|Bunny|Ok
用 Vim 命令不容易做到,但是你可以用 column 終端命令快速完成。將光標放在「Id」上,運行「!}column -t -s "|"」。就可以得到如下表格數據:
Id Name Cuteness01 Puppy Very02 Kitten Ok03 Bunny Ok
上述的操作過程可分解成這樣:動詞為「!」(過濾操作符),名詞為「}」(轉到下一段)。過濾器操作符「!」接受另一個參數,一個終端命令「column -t -s "|"」。
假設你不僅希望將文本列表化,還想篩選出帶有「Ok」的行。awk 可以輕松地完成這項任務。可以執行如下操作:
!}column -t -s "|" | awk 'NR > 1 && /Ok/ {print $0}'
得到的結果:
02 Kitten Ok03 Bunny Ok
對操作符、動作和終端命令了解得越多,編寫復雜動作的能力就會成倍增加。
基于 Vim 語法的更多操作符
在了解了 Vim 語法后,就可以完成更多的文件操作。例如第 5 章就介紹了對文件的操作。
對文件的操作,最基本的是對字符操作,字符操作的運動單元是左、下、上、右。
h 左j 下k 上l 右
接下來轉到一個更大的移動單元,詞:
w 移到下一個單詞的開頭e 移到下一個單詞的末尾b 移到前一個單詞的開頭ge 移到前一個單詞的末尾
詞的操作介紹完,下面介紹一下對行的操作:
0 移動到當前行的第一個字符;^ 移動到當前行中的第一個非空字符;g_ 移動到當前行的最后一個非空白字符;$ 移動到當前行的最后一個字符;n| 移動到當前行的第 n 列。
此外還有對句子和段落、匹配、行號、窗口等的操作,這里不再贅述。
該教程還在持續更新中,通過教程的學習,希望能更好地掌握 Vim 命令,并更快地進行代碼編輯。