閱讀338 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Vim實用技巧(第2版)》——1.2 不要自我重複

本節書摘來自異步社區《Vim實用技巧(第2版)》一書中的第1章,第1.2節,作者:【英】Drew Neil(尼爾)著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看

1.2 不要自我重複

對於在行尾添加內容這樣的常見操作,如添加分號,Vim提供了一個專門的命令,可以把兩步操作合並為一步。
假設有如下的JavaScript程序片段。

the_vim_way/2_foo_bar.js

var foo = 1
var bar = 'a'
var foobar = foo + bar

我們想在每行的結尾添加一個分號。要實現這一點,先得把光標移到行尾,然後切換到插入模式進行修改。$命令可以完成移動動作,接著就可以執行 a;<Esc> 完成修改了。

要完成全部修改,也可以對下麵兩行做完全相同的操作,不過那樣做會錯過這裏將要提到的小竅門。由於 . 命令可以重複上次的修改,因此不必重複之前的操作,而是執行兩次 j$.。一個鍵(.)頂3個(a;<Esc>),雖然每次省得並不多,不過在重複操作時,累積效應可不小。

不過讓我們再仔細審視一下這個操作模式:j$.j命令使光標下移一行,而 $ 命令把光標移到行尾。我們用了兩下按鍵,僅僅是為了把光標移到指定位置,以便可以用 . 命令。你覺得還有改進的餘地嗎?

減少無關的移動
a 命令在當前光標之後添加內容,A 命令則在當前行的結尾添加內容。不管光標當前處於什麼位置,輸入A 都會進入插入模式,並把光標移到行尾。換句話說,它把$a封裝成了一個按鍵操作。在本技巧後的一箭雙雕部分中,我們將會看到Vim提供了不少這樣的複合命令。

下麵是對之前例子的改進。
screenshot
screenshot
用 A 來代替 $a,大大提升了 . 命令的效率。不必再把光標移到行尾,隻需保證它位於該行內就行了(可在任意位置)。現在可以重複執行足夠多次的 j. ,完成對後續行的修改。

一鍵移動,另一鍵操作,真是太完美了!請留意這種應用模式,因為我們即將在更多的例子中看到它的身影。

雖然這一模式對這個簡短的例子來說很好用,但它不是萬能的。試想一下,如果我們不得不給連續50行添加分號,即便每個修改輸一次 j. ,看起來也是一項很繁重的工作。跳到技巧30可以看到另外一種解決方法。

一箭雙雕

我們可以這樣說,A 命令把兩個動作($a)合並成了一次按鍵。不過它不是唯一一個這樣的命令,很多Vim的單鍵命令都可以被看成兩個或多個其他命令的組合。下表列出了類似的一些例子,你能找出它們之間別的共同點嗎?
screenshot
如果你發覺自己正在輸入 ko(或更糟糕,在用 k$a),馬上打住!想想你在幹什麼,然後你就會意識到可以把它換成O 命令。

你找出這些命令別的共同點了嗎?它們全都會從普通模式切換到插入模式。仔細想想這一點,並想想這對 . 命令可能產生怎樣的影響。

最後更新:2017-06-06 07:38:11

  上一篇:go  《Vim實用技巧(第2版)》——1.3 以退為進
  下一篇:go  《Vim實用技巧(第2版)》——2.5 能夠重複,就別用次數