用聰明的方式學習Vim,不再死記硬背,復雜命令一學就會

五嘎子 5年前發布 | 3K 次閱讀 vim

   Vim 難學難用?但事實是,它依舊受許多程序員的歡迎。

  或許,只是你的「打開方式」不對。

  最近,在 GitHub 上便出現了一個叫做用聰明的方式學習 Vim 的項目,上線短短幾天時間,便已經斬獲 2200 星。

  那么,如此學習 Vim 的方式,到底有多「聰明」?

  用聰明的方式與 Vim「交流」

  很多人可能會被 Vim 命令的復雜性嚇到。

  因此,作者將 Vim 命令的一般結構,分解成了一個簡單語法規則

  這也是本教程中最為重要的一個章節——一旦了解了 Vim 命令類似語法的結構,就能跟它「暢談無阻」。

  按照作者的說法,「只需要知道一個語法規則」,就可以說 Vim 的語言了:

verb + noun

  如果拿英文短句做類比,就例如:

Eat (verb) a donut (noun)

Kick (verb) a ball (noun)

  現在,只需要使用基本的 Vim 動詞和名詞來增加詞匯量。

  Vim 的名詞和動詞

  這里說到的 Nouns,就是 Vim 中的一些動作,例如:

h:左
j:下
k:上
l:右
w:移動到下個詞的開頭
}:跳到下一個段
$:移動到本行末尾

  而 Vim 中的 Verbs,就相當于操作符。

  以 h 操作符為例,Vim 中有 16 種,但只需要知道其中 3 種,便可以滿足 80% 的需求。

y:復制
d:刪除文本,保存到 register
c:刪除文本,保存到 register,并開始「插入」模式

  OK,了解了「名詞」和「動詞」,現在便可以應用到「語法規則」中了:

y$:把當前所有的東西,從當前位置拖拽至行末
dw:從當前位置刪除到下一個單詞的開頭
c}:將當前位置更改為此段末尾

  當然,類似這樣的組合,也接受數字作為其中的參數,例如:

y2h:向左拉 2 個字符
d2w:刪除接下來的 2 個單詞
c2j:改變接下來的 2 行內容

  除此之外,行式操作(linewise operations)是文本編輯中的常見操作,因此,Vim 也允許你通過連續鍵入 2 次操作符來完成類似這樣的操作。

  比如,鍵入「dd」,刪除整行內容;鍵入「cc」,更改整行內容。

  可組合性和語法

  在討論 Vim 語法之后,便是 Vim 的可組合性(Composability)。

  可組合性意味著擁有一組通用命令,可以組合起來執行更復雜的命令。當與外部程序集成時,Vim 的可組合性的真正威力就顯現出來了。

  舉個例子,現在有一段「亂七八糟」的文字,如下所示:

IdNameCuteness
01PuppyVery
02KittenOk
03BunnyOk

  現在需要將這些文字轉換成為表格形式,若是用 Vim 命令來實現這點可能會有一些困難,但是可以使用 column terminal 命令快速完成。

  將鼠標指向「ID」,然后運行 !}column -t -s “” ,就可以得到漂亮的表格了:

Id   Name    Cuteness
01  Puppy    Very
02  Kitten    Ok
03  Bunny   Ok

  回過頭來看下剛才的命令。

  「!」是過濾操作符,「}」是名詞,過濾操作符接收了另一個參數,也就是一個終端命令,「column -t -s “” 」。

  簡而言之,經過這樣的一番操作后,便完成了文字表格化的任務。

  再例如,除了表格化之外,再篩選帶有「OK」的行,可以這樣做:

!}column -t -s “” awk ‘NR > 1 && /Ok/ {print $0}’

  得到的結果便是:

02  Kitten  Ok
03  Bunny  Ok

  這就是一種與 Vim「交流」的聰明方式。

  但作者也同時指出,剛開始學習、適應這種「Vim 語法」是需要一定時間,但只要熟練起來后,便可輕松駕馭。

  基于 Vim 語法的更多操作

  在介紹完 Vim 的語法規則后,便可以基于此來完成更多操作和任務。

  例如在本教程中的第五章,便介紹了「如何在文件中移動」。

  剛開始用鍵盤來完成這項任務,肯定是比較慢的,但作者認為:

只要你把這個方法熟悉起來,要比用鼠標還要快。

  最基本的操作便是向左、向右、向上和向下移動一個字符:

h   Left
j    Down
k   Up
l    Right

  在字符之后,便是以文字為單元的移動。

W:移動到下一個單詞的開頭處
E:移動到下一個單詞的結尾處
B:移動到前一個單詞的開頭處
gE:移動到前一個單詞的結尾處

  接下來是以「行」為單位的移動:

0:移動到當前行的第一個字符處
^:移動到當前行第一個非空字符處
g_:移動到當前行最后一個非空字符處
$:移動到當前行最后一個字符處
n:移動到當前行的第n列

  當然,用類似的 Vim 方式,還可以完成「段」級別、搜索、滾動、標記等一系列移動操作。

  此外,教程中還提供了許多其他操作的教程,例如「Insert Mode」、「Undo」等等。

  目前教程還在更新中,有興趣的讀者可以持續關注這份「聰明的 Vim 教程」。

  傳送門:

  https://github.com/iggredible/Learn-Vim

 本文由用戶 五嘎子 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
  轉載自:https://mp.weixin.qq.com/s/uydh_PQqG24eCYPRh5zHhg