1. 程式人生 > 其它 >vim 從嫌棄到依賴(4)—— .命令

vim 從嫌棄到依賴(4)—— .命令

通過之前幾篇文章的介紹,如果各位小夥伴能夠勤加練習,並在日常工作上經常使用,那麼相信那些內容已經會對工作效率的提升產生好的影響。但是如果那些就是vim的全部的話,我們也就沒那麼大的必要花這麼大的精力來學習如何使用它,而且它也不會在程式設計師中口口相傳,並且令很多程式設計師對它如此著迷。接下來讓我們更加深入到vim中,去學習更多更好的,可以進一步提升效率的技巧

Don’t Repeat Yourself. Let vim repeat it for you

不要進行重複的操作,讓vim替你自動完成這些重複的操作。

vim之所以好用,效率高。就是它對重複操作進行了大量的優化,並且提供了一些方式方法能讓你不必做重複功。而且儘量讓這些方法簡單易用。最簡單的就是使用.

來重複上次修改(確實是夠簡單的)

廢話不多說,還是以例子來說明
假設我有這樣一段Python程式碼

if user == "vim":
print("vim is best!")
else:
print("vim is not best")

我需要將第2行和第3行進行縮排,可以這麼做,先使用j 移動游標到第二行,然後使用 >> 縮排程式碼,接著使用 2j 跳轉游標到第四行,然後使用 . 重複上一次修改

配合搜尋命令可以完成對文字的快速修改,但是我們現在還沒介紹到搜尋相關操作,所以先按下不表

如何定義上次修改

不同的編輯器對上次修改的定義不同,有的可能是詞、句子、段甚至有的可能按照輸入時間來算,一段時間內的輸入算作上次修改,而vim可以自己定義上次修改範圍是多少。

vim一般將從進入插入模式開始,到從插入模式退出這段時間內做的修改做為上次修改,或者在普通模式下將我們使用一次operat = operator + motion 公式作為一次修改,例如我們有這麼一段話

this is no more one line
this is no more one line

我們將游標移動到 第一個n 處。然後使用d2w 刪除兩個單詞,然後再下一行再次使用. 發現它執行與上一行一樣的操作

在進入插入模式時,連同進入插入模式的操作一起與在插入模式下輸入的內容一同被算作上次修改,例如

this is only one line
this is only one line

改為

this is no more one line
this is no more one line

我們可以先將游標移動到 only 的首位,然後使用 cw 進入插入模式,輸入 no more 退出輸入模式,接著使用j 移動到下一行,再使用 2b 移動到第二行同樣的位置,最後使用 . 來重複


上一次修改僅限於進入插入模式的一次操作,而之前進行的移動游標之類的操作就不再統計為一次修改。例如有這麼一段程式碼

var foot = "foot"
var ball = "ball"
var football = foot + bar

我們要在每行的後面加上一個分號。

  • 方案一:可以先使用 $移動游標到行尾,然後使用 a 插入模式,接著新增一個分號,在下一行需要先使用$ 移動游標到行尾,然後使用. 直接使用,就會變成這樣

    針對這種情況只有事先手動的調整游標位置,然後使用點命令。這裡就不演示了

針對這個例子,我們有更高效的方法,可以使用複合命令。使用A 可以直接從行尾進入插入模式

  • 方案二:使用 A 在行尾進入插入模式,節省後續移動游標的步驟

    通過這個例子,我們看到了使用複合命令加上. 可以極大的簡化重複操作,提高效率。在這裡再給出一些類似的複合命令給各位小夥伴參考
複合命令 等效長命令 含義
A $a 在行尾進入插入模式
I ^i 在行首進入插入模式
o A<CR> 在下一行進入插入模式
O ko(k$a<CR>) 在上一行進入插入模式
S ^c$ 刪除當前行並進入插入模式
C c$ 刪除當前游標位置到行尾的內容並進入插入模式
s cl 刪除游標後的一個字元並進入插入模式

在《vim實用技巧》這本書中,作者介紹了一個實用vim的經典範式——一個鍵移動、另一個鍵操作。例如上述實用. 命令的操作中,使用j 來移動行,然後使用. 來執行操作。後續將有許多操作使用該正規化。

最後還是做一個總結:本篇講述了vim中比較強大的一個命令——. 命令,它能重複上次修改。但是需要注意以下幾點:

  • 上次修改是從進入插入模式開始,到回到普通模式為止這段時間內做的修改,或者在普通模式下使用一條命令進行的修改
  • . 命令並不關心上次修改的位置,只會簡單的重複上次修改。所以在使用前儘量考慮該使用哪些命令能最大限度的讓. 重複更多操作。
  • 使用複合命令不光能減少輸入字元數,配合. 命令將產生強大的效果