天天看點

《Vim實用技巧(第2版)》——2.3 構造可重複的修改

本節書摘來自異步社群《vim實用技巧(第2版)》一書中的第2章,第2.3節,作者:【英】drew neil(尼爾)著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

vim對重複操作進行了優化,要利用這一點,必須考慮該如何構造修改。

在vim中,要完成一件事,總是有不止一種方式。在評估哪種方式最好時,最顯而易見的名額是效率,即哪種手段需要的按鍵次數最少(又名vimgolf [1])。然而,在平局時該如何選擇獲勝者呢?

在下例中,假設光标位于行尾處的字元“h”上,而我們想要删除單詞“nigh”:

normal_mode/the_end.txt

<code>the end is nigh</code>

反向删除

因為光标已經位于單詞末尾,是以可以先反向删除該詞。

《Vim實用技巧(第2版)》——2.3 構造可重複的修改

按 db 指令删除從光标起始位置到單詞開頭的内容,但會原封未動地留下最後一個字元 “h”,再按一下 x 鍵就可以删除這個搗亂的字元。這樣,整個操作的 vim高爾夫得分是3分。

正向删除

這一次,讓我們嘗試一下正向删除。

《Vim實用技巧(第2版)》——2.3 構造可重複的修改

先用 b 指令把光标移到單詞的開頭,移動好後,就可以用一個 dw 指令删掉整個單詞。這一次的vim高爾夫得分也是3分。

删除整個單詞

到目前為止,已有的兩種方式都要先做某種準備工作或清理工作。另外,也可以使用更為精準的 aw 文本對象(text object),而不是用動作指令(參見 :h aw

《Vim實用技巧(第2版)》——2.3 構造可重複的修改

)。

《Vim實用技巧(第2版)》——2.3 構造可重複的修改

可以把 daw 指令解讀為“delete a word”,這樣比較容易記憶。在技巧52和技巧53中将介紹更多關于文本對象的細節。

決勝局:哪種方式最具重複性?

我們嘗試了3種不同的方式來删除一個詞:dbx、bdw 以及 daw。每種情況的vim高爾夫得分都是3分。那麼要怎麼回答這個問題:“哪種方式最好?”

還記得嗎,vim對重複操作進行了優化。讓我們再回顧一下這3種方式,這一次我們跟着用一次 . 指令,看看會發生什麼。我建議你自己也親自試一下。

反向删除方案包含兩步操作:db 指令删除至單詞的開頭,而後x 指令删除一個字元。如果我們跟着執行一次 . 指令,它會重複删除一個字元( . = = x )。我不覺得這有什麼價值。

正向删除方案也包含兩步。這一次,b 隻是一次普通的移動,而 dw 完成修改。此時用 . 指令會重複 dw,删除從光标位置到下個單詞開頭的内容。不過因為我們剛好已經在行尾了,并沒有“下一個單詞”,是以在這個場景裡 . 指令沒什麼用。不過,至少它代表了一個更長點的操作(. = = dw)。

最後的方案隻調用一個操作:daw。這個操作不僅僅删除了該單詞,它還會删除一個空格,是以光标最終會停在單詞“is”的最後一個字元上。如果此時使用 . 指令,它會重複上次删除單詞的指令。這一次, . 指令會做真正有用的事情(. = = daw)。

結論

daw 可以發揮 . 指令的最大威力,是以我宣布它是本輪的獲勝者。

要想充分利用 . 指令,事先常常需要進行一番周詳的考慮。如果你發現自己要在幾個地方做同樣的小修改,就可以嘗試構造你的修改,讓它們能夠被 . 指令重複執行。要識别出這類機會需要進行一定的實踐,不過一旦養成了使修改可重複的習慣,你就會從 vim 這裡得到“獎賞”。

有時,我并沒有看到用 . 指令的機會,然而在做完一次修改後,我發現要做另一次同樣的操作,這時候,我腦海裡會浮現出 . 指令,而它也已經準備好為我效力了。每當遇到這種情況時,我都會開心地笑起來。