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
代替$a
。A
把$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
查詢的字元.
重複上次修改;.
;.
注意:不用輸入 4
次 f+
,用 ;
重複查詢即可。
;.
重複查詢 + 重複修改
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
單鍵命令,排在第二的是 *
命令,此命令 可以查詢當前游標下的單詞。
/content
:查詢到content
單詞
或者直接把游標移動到這個單詞上*
:查詢該單詞cw
copy<Esc>
:修改content
為copy
n
:找到下一個.
:重複修改n.n.n.
:完成所有修改- 如果不想修改,不按
.
直接按n
跳轉到下一個即可
移動游標到 content
上,然後按 *
,會產生兩個結果:
- 游標跳到下一個匹配項上
- 所有出現這個詞的地方都被高亮顯示
如果沒有高亮,試著執行:set hls
6. 認識 .
正規化
.
正規化是最理想的編輯模式,用一鍵移動,另一鍵執行。
- 只需要按一次鍵就能把游標移到下一個目標上
- 都利用
.
命令重複上次修改
普通模式 normal mode
是 Vim
的預設狀態。
7. 停頓時請移開畫筆
畫家在休息時不會把畫筆放在畫布上。
普通模式就是 Vim
的自然放鬆狀態,其名字已經寓示了這一點。
8. 把撤銷單元切成塊
u
鍵會觸發撤銷命令,它會撤銷最新的修改。
在 Vim
中,我們自己可以控制撤銷命令的粒度。
從進入插入模式開始,直到返回普通模式為止,在此期間輸入或刪除的任何內容都被當成一次修改。
因此,只要控制好 <Esc>
鍵的使用,就可使撤銷命令作用於單詞、句子或段落。
多久離開一次插入模式?
作者喜歡讓每個 “可撤銷塊” 對應一次思考過程。
不管停頓的時間有多短,每次停頓都是一個自然的中斷點,提示作者該退出插入模式了。
當處於插入模式中,另起一行最快的方式是按 <CR>
。
但是有時作者更喜歡按 <Esc>o
,這是因為作者有預感,也許在撤銷時作者想擁有更細的粒度。
一般來講,如果你停頓的時間長到足以問 “我應該退出插入模式嗎?” 這個問題,就退出吧。
在插入模式中使用方向鍵移動游標會重置修改狀態
如果在插入模式中使用了 <Up>
、<Down>
、<Left>
、<Right>
這些游標鍵,將會產生一個新的撤銷快。
你可以把這想象為先切換回普通模式,然後用 h
、j
、k
、l
命令對游標進行了移動,但是沒有退出插入模式。
這會對 .
命令的操作產生影響。
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
勝出!