1. 程式人生 > >Vim 實用技巧(持續更新中!)

Vim 實用技巧(持續更新中!)

Vim 實用技巧(持續更新中!)

轉載請註明出處:https://blog.csdn.net/jpch89/article/details/85273813
最後更新於:2018.12.31


文章目錄


1. 認識 .
命令

. 命令作用

  • 重複上次修改。(參見 :h .

應用舉例

  • x 命令會 刪除游標下的字元,使用 . 會讓 重複刪除游標下的字元
    多次輸入 u 撤銷上述修改。

  • dd 命令刪除一整行,使用 . 命令會 重複刪除當前行

  • >G 增加從當前行到文件末尾處的縮排層級,使用 . 會重複該操作。

  • 每次 i 進入插入模式的那一刻,到返回普通模式為止, Vim 會記錄每一個按鍵操作,做出這樣一個修改再用 . 命令,它會重新執行所有這些按鍵操作。

. 命令是一個微型的巨集 macro


2. 不要自我重複

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

在行尾新增分號:

  • $ 移動到行尾,然後 a 編輯,輸入分號,Esc 完成修改
  • 對剩下的兩行可以使用兩次 j$.
  • . 意味著 a;<Esc>,一個鍵頂三個鍵

有沒有改進的餘地?

  • 可以使用 A 代替 $aA$a 封裝成了一個按鍵操作。
  • 然後輸入分號,按 Esc
  • 之後就可以使用 j. 來重複操作了。

一箭雙鵰

複合命令 等效的長命令 作用
C c$ 刪除到行尾並進入插入模式
s cl 刪除當前字元並進入插入模式
S ^C 刪除當前行內容並進入插入模式

3. 以退為進

需求:把 JavaScript 的字串拼接的加號前後都加上空格。

var foo = "method("+argument1+","+argument2+")";

要改成:

var foo = "method(" + argument1 + "," + argument2 + ")";
  • f+ 查詢加號
    注:f{char} 查詢下一處指定字元出現的位置
  • s空格+空格<Esc> 進行修改
  • ; 重複查詢上次 f 查詢的字元
  • . 重複上次修改
  • ;.
  • ;.

注意:不用輸入 4f+,用 ; 重複查詢即可。

;. 重複查詢 + 重複修改


4. 執行、重複、回退

重複很有用,但有時候多次按 . 或者 ; 的時候,容易出現多按的錯誤。

  • 如果多按了 . 可以使用 u 撤銷上次修改。
  • 如果多按了 ; 可以使用 , 跳轉回去,因為 , 會反向查詢上次 f{char} 所查詢的字元
目的 操作 重複 回退
做出一個修改 {修改} . u
在行內查詢下一指定字元 f{字元} / t{字元} ; ,
在行內查詢上一指定字元 F{字元} / T{字元} ; ,
在文件中查詢下一處匹配項 /pattern回車 n N
在文件中查詢上一處匹配項 ?pattern回車 n N
執行替換 :s/target/replacement & u
執行一系列修改 qx{修改}q @x u

注意:t{字元} 的在查詢的字元前面停下來,而 T{字元} 在查詢的字元後面停下來。


5. 查詢並手動替換

需求
把文字中的 content 替換成 copy

...We're waiting for content before the site can go live...
...If you are content with this, let's go ahead with it...
...We'll launch as soon as we have the content...

:substitute 命令專門用於查詢替換任務。

偷懶的辦法:無需輸入就可以進行查詢
作者雲:. 命令是我最喜愛的 Vim 單鍵命令,排在第二的是 * 命令,此命令 可以查詢當前游標下的單詞

  1. /content:查詢到 content 單詞
    或者直接把游標移動到這個單詞上
  2. *:查詢該單詞
  3. cwcopy<Esc>:修改 contentcopy
  4. n:找到下一個
  5. .:重複修改
  6. n.n.n.:完成所有修改
  7. 如果不想修改,不按 . 直接按 n 跳轉到下一個即可

移動游標到 content 上,然後按 *,會產生兩個結果:

  • 游標跳到下一個匹配項上
  • 所有出現這個詞的地方都被高亮顯示
    如果沒有高亮,試著執行 :set hls

6. 認識 . 正規化

. 正規化是最理想的編輯模式,用一鍵移動,另一鍵執行。

  • 只需要按一次鍵就能把游標移到下一個目標上
  • 都利用 . 命令重複上次修改

普通模式 normal modeVim 的預設狀態。

7. 停頓時請移開畫筆

畫家在休息時不會把畫筆放在畫布上。
普通模式就是 Vim 的自然放鬆狀態,其名字已經寓示了這一點。


8. 把撤銷單元切成塊

u 鍵會觸發撤銷命令,它會撤銷最新的修改。
Vim 中,我們自己可以控制撤銷命令的粒度。
從進入插入模式開始,直到返回普通模式為止,在此期間輸入或刪除的任何內容都被當成一次修改。
因此,只要控制好 <Esc> 鍵的使用,就可使撤銷命令作用於單詞、句子或段落。

多久離開一次插入模式?
作者喜歡讓每個 “可撤銷塊” 對應一次思考過程。
不管停頓的時間有多短,每次停頓都是一個自然的中斷點,提示作者該退出插入模式了。

當處於插入模式中,另起一行最快的方式是按 <CR>
但是有時作者更喜歡按 <Esc>o,這是因為作者有預感,也許在撤銷時作者想擁有更細的粒度。

一般來講,如果你停頓的時間長到足以問 “我應該退出插入模式嗎?” 這個問題,就退出吧。

在插入模式中使用方向鍵移動游標會重置修改狀態
如果在插入模式中使用了 <Up><Down><Left><Right> 這些游標鍵,將會產生一個新的撤銷快。
你可以把這想象為先切換回普通模式,然後用 hjkl 命令對游標進行了移動,但是沒有退出插入模式。
這會對 . 命令的操作產生影響。


9. 構造可重複的修改

Vim 中,評估哪種方式最好時,最顯而易見的指標是效率,即哪種手段需要的按鍵次數最少(又名 VimGolf)。
VimGolf http://vimgolf.com/

然而在平局時如何選擇勝者呢?

需求
The end is nigh
游標位於 h,現在要刪除單詞 nigh

反向刪除Vim 高爾夫得分 3

  • db 刪除從游標起始位置到單詞開頭的內容
  • x 刪除 h

正向刪除Vim 高爾夫得分 3

  • b 移動到單詞開頭
  • dw 刪除整個單詞

刪除整個單詞Vim 高爾夫得分 3
使用 aw 文字物件 text object

  • daw 刪除一個單詞(可以解讀為 delete a word

決勝局:哪種方式最具重複性?
看哪種方式可以發揮 . 命令的最大威力。
反向刪除 . == x
正向刪除 . == dw
刪除整個單詞 . == daw
所以 daw 勝出!