《Vim實用技巧(第2版)》——2.3 構造可重複的修改
本節書摘來自異步社區《Vim實用技巧(第2版)》一書中的第2章,第2.3節,作者:【英】Drew Neil(尼爾)著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看
2.3 構造可重複的修改
Vim對重複操作進行了優化,要利用這一點,必須考慮該如何構造修改。
在Vim中,要完成一件事,總是有不止一種方式。在評估哪種方式最好時,最顯而易見的指標是效率,即哪種手段需要的按鍵次數最少(又名VimGolf [1])。然而,在平局時該如何選擇獲勝者呢?
在下例中,假設光標位於行尾處的字符“h”上,而我們想要刪除單詞“nigh”:
normal_mode/the_end.txt
The end is nigh
反向刪除
因為光標已經位於單詞末尾,所以可以先反向刪除該詞。
按 db 命令刪除從光標起始位置到單詞開頭的內容,但會原封未動地留下最後一個字符 “h”,再按一下 x 鍵就可以刪除這個搗亂的字符。這樣,整個操作的 Vim高爾夫得分是3分。
正向刪除
這一次,讓我們嚐試一下正向刪除。
先用 b 命令把光標移到單詞的開頭,移動好後,就可以用一個 dw 命令刪掉整個單詞。這一次的Vim高爾夫得分也是3分。
刪除整個單詞
到目前為止,已有的兩種方式都要先做某種準備工作或清理工作。另外,也可以使用更為精準的 aw 文本對象(text object),而不是用動作命令(參見 :h aw )。
可以把 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 這裏得到“獎賞”。
有時,我並沒有看到用 . 命令的機會,然而在做完一次修改後,我發現要做另一次同樣的操作,這時候,我腦海裏會浮現出 . 命令,而它也已經準備好為我效力了。每當遇到這種情況時,我都會開心地笑起來。
最後更新:2017-06-06 07:38:06