[Vim] 操作模式
TL;DR
參考資料
本篇有些圖片取自高見龍老師在IT幫的鐵人賽文章中。
僅供紀錄學習用途,如有不妥麻煩告知。
相關連結
模式介紹
操作方式主要分為normal模式
,insert模式
,visual模式
。
我們一般在移動都是使用normal模式。
insert模式顧名思義就是插入(即在輸入文字時會使用的模式。
而visual模式則是需要選取複製貼上時會使用的模式。
可以在不同模式之間切換,如果要回到normal模式的時候可以使用esc
按鍵,或是使用ctrl+[
。
normal
:一般模式insert
:插入(輸入)模式visual
:選取模式
esc
( orctrl+[
):退回一般模式
在windows系統上,如果是使用注音輸入法則無法使用ctrl+[
必須切換成純英文輸入法才可以使用ctrl+[
跳脫不同模式。
移動
基本上不推薦在insert模式下移動,如果要移動或是選取的話要先回到normal模式之下再移動。 以下沒有特別說明模式皆為normal模式移動。
在vim裡面有很多種方法,所以可以根據自己的需求選擇最適合自己的指令
基礎上下左右
我們移動可以使用上下左右
按鍵,但是因為使用上下左右
時,右手需要離開鍵盤主要打字區域,所以不建議使用,可以使用hjkl
來移動。
上
,下
,左
,右
分別對應k
,j
,h
,l
折行上下控制
有時候在同一行的時候,只是礙於寬度的關係導致明明是同一行,卻折到第二行。這時候Vim仍然會將其視為同一行,所以j
,k
的上下切換會無效,但是如果這時候仍想切換的時候,可以使用g+j
、g+k
來上下切換。
- 折行時可以使用
g+j
、g+k
來在同一行內上下切換
跳往指定行號
可以直接使用行號+G去前往該行,例如輸入15G
可以直接前往15行
行號+G
前往該行號第一個文字的位置(等同前往該行+^)
切換文章頂端/底部
可以使用gg
回到文字頂端,G
回到文字底部
gg
回到文字頂端,G
回到文字底端
切換下(上)一段落(paragraph)
}
跳到下一個段落(利用空白行來區分段落),{
回到上一個段落。
}
跳到下一個段落,{
回到上一個段落
切換下(上)文字(word)
使用w
可以前往下一個Word,b
前往上一個Word
但是使用小寫時,如果像是Andy’s
或是有“
、‘
等等含標點符號時,就會沒辦法跳到下一個字
這時候可以使用大寫W
,忽略標點符號並跳到下個Word,大寫B
跳到前一個Word
另外還有一個比較少使用的,可以使用e
跳到字尾(如果已在該字字尾會跳到下一個文字字尾),E
忽略標點跳到字尾。
w
前往下一個Word、W
忽略標點前往下一個Wordb
前往上一個Word、B
忽略標點前往上一個Worde
跳到字尾、E
忽略標點跳到字尾
同行指定文字跳躍
如果想要在該行快速跳到下一個指定的字時,可以使用f+key
,但是只能在同一行內使用
相對的可以使用F+key
回到上一個指定的字
f+key
可直接跳到該行的下一個指定keyF+key
跳到上一個指定的key
跳往行首(末)
行內可以使用0
來跳到行首,^
跳到該行第一個文字,$
跳到行末(包含空白)
0
跳到行首(包含空白)^
跳到該行第一個字$
跳到行末(包含空白)
調整所在行視窗位置
可以使用zz
,zt
,zb
來調整目前所在行在整個視窗的位置,並且可以搭配設定檔來設置zt
,zb
的位置(會參考滾動時距離多少就會開始滾動的設定)
zz
可以將目前所在行設定在畫面中間區域
zt
(t代表top的意思)可以將目前所在行設定到畫面上方區域(如果下方已經沒有段落了,可能會出現~符號代表沒有資料的區域)
zb
可以將目前所在行設定到畫面下方區域
zz
調整目前所在行到畫面中間zt
調整目前所在行到畫面上方zb
調整目前所在行到畫面下方
輸入
插入編輯位置
在normal模式之下:
- 可以使用
a
在目前位置之後插入文字,A
可以在目前所在行的最後面插入文字。 - 使用
i
在目前位置之前插入文字,I
可以在目前所在行的最前面插入文字, - 使用
o
可以在目前所在行創造下一行,並直接進入編輯模式(大寫O
可以在目前所在行的前一行創造空行並進入insert模式)
a
在所在位置後插入文字、A
在目前所在行的最後插入文字i
在所在位置前插入文字、I
在目前所在行的最前面插入文字o
新增下一行並插入文字、O
新增上一行並插入文字
vim的基本模式切換圖
刪除文字及替代文字
如果需要刪除文字,有兩種方式可以使用,一種是使用x
,另一個是使用d
。使用x
的時候需要在normal模式之下或是visual模式之下皆可
使用d
的時候則一定要在visual模式之下(就算只是要刪除一個字,也要先使用v
選到該字之後再按d
)
如果想要刪除整行可以在該行任意位置使用dd
(會整行刪除不見,而0D
則是只有將內容清空,行本身還在)。可以先在visual模式之下選取之後按c
來刪除並直接進入insert模式。
如果想要替換文字可以在normal模式使用r
,可以替換單個文字。
如果使用visual模式先選取了,再使用r
,則會將所有所選的文字全部都替換成該文字(選了幾個就換幾個該文字)。
R
在normal模式之下,會從目前所在位置開始連續覆蓋掉所選的文字(如果在visual模式之下會將整行先刪除,同X
&D
)
x
刪除目前所選文字、X
刪除目前所選文字之前的文字d
刪除所選(in visual mode)的文字、D
刪除目前所在行所在位置之後的全部文字c
刪除所選文字並直接進入insert模式&C
刪除目前位置之後全部文字並進入insert模式dd
可以直接刪除目前所在整行 (同樣可使用量詞eg:2dd
)r
可以替代目前文字,R
進入Replace模式,替代目前位置之後所有文字直到退出Replace模式
刪除文字表格整理
指令 | x | X | d | D |
---|---|---|---|---|
Normal模式 | 可 | 可 | 不可 | 不可 |
Visual模式 | 可 | 可 | 可 | 可 |
在normal模式下功能 | 刪除目前所在位置的文字 | 刪除目前所在位置之前的文字 | NA | NA |
在visual模式下的功能 | 刪除目前所選文字 | 刪除目前所在整行 | 刪除目前所選文字 | 刪除目前所在整行 |
可否搭配其他指令 | 不可 | 不可 | 可 | 不可 |
搜尋
搜尋在vim裡面有兩組,僅需記得其中一組即可:
使用/+欲搜尋的字(or regex)
可以在文件內搜尋,當使用的是/
的時候,n
可以跳到下一個搜尋字串,N
跳到上一個搜尋字串
也可以利用*
來搜尋目前所在位置的文字(測試過後發現?
可以視為一個文字,但是.
,
等等不可視為文字,會直接搜尋下一個文字)
如果要關閉掉目前已經設定好搜尋的字串時,可以使用:noh
來關閉
:noh
取消搜尋模式/+欲搜尋的字
搜尋字串n
前往下一個字串N
前往上一個字串*
搜尋目前所在位置字串
使用?+欲搜尋的字(or regex)
可以在文件內搜尋,因為使用的是?
,所以基本上會與/
相反,n
在使用?
搜尋時會跳到上一個字串,N
則會前往下一個字串,對應的快速搜尋所在位置文字的按鍵為#
:noh
取消搜尋模式?+欲搜尋的字
搜尋字串n
前往上一個字串N
前往下一個字串#
搜尋目前所在位置字串
複製/貼上
首先要先進入visual模式,進入方式有兩種,可以一個字一個字選取的v
,以及一行一行選取的V
,如果使用的是選取整行的V
,則在上下選取時也會選取一整行。
選取整行範例

vim的基本模式切換圖
在選取到文字的狀態下,可以使用y
(yank)來複製,複製完之後會直接回到normal模式。
接著在normal模式之下使用p
來貼上剛剛複製的文字(預設是貼在目前游標的後面)。如果需要貼在目前游標之前則需使用P
。
需要注意這邊yank如果沒有設定,並不會與在vim編輯器以外的地方使用的ctrl+c剪貼簿內的內容共用。vim的yank會將文字儲存在暫存器中,而不是剪貼簿。
因為目前棄用terminal下的vim,只有使用vsc上的vim plugin
所以使用yank只能儲存在暫存器中,無法儲存到剪貼簿
使用
command+c
會儲存到剪貼簿中,可以在不同應用程式中貼上(如codepen貼到vsc)
也可以使用yy
來複製目前所在的行(效果同Vy
)
v
選取文字、V
選取行- 在visual模式下
y
可以複製、在normal模式下p
可以貼上 yy
可以一次複製所在行
復原&重做
就像在word或是任何常用的軟體一樣,如果輸入錯誤或不小心誤刪某個文字,可以使用u
指令(undo)來回復,ctrl+r
來重做(redo)
u
復原ctrl+r
重做
縮排
在寫程式的時候很常會需要使用到縮排。
如果在normal模式之下可以使用>>
來縮到下一階,<<
回到上一階。
但是如果已經在visual模式之下,則只要輸入一次>
就會縮到下一排。
相同的,在visual模式之下使用<
可以退回上一階。
- normal:
>>
縮排、<<
退回縮排。也可以搭配量詞來使用(eg:3>>
) - visual:
>
縮排、<
退回縮排 - 全選之後使用
=
可以自動根據偵測到的程式語言來進行自動縮排
如果有開啟syntax
的話
可以在全選(ggVG
)之後使用=
來自動排版(類似VS Code的alt+shift+F
)
這部分因為棄用terminal下的vim,所以沒有研究。都使用vsc上提供的功能了
進階visual模式
visual block
visual模式除了V
整行選取(Visual Line模式)以外,還有另一種模式。可以使用ctrl+v
進入visual block模式,來選取一個方塊範圍的內容(如下圖)
可以使用x
或是d
來刪除所選取的方塊區域:

visual block mode
利用visual block同時編輯多行
可以在行首ctrl+v
進入block visual mode,接著往下選取下面幾行的行首。
接著使用I
在前方插入文字。編輯完想要插入的文字(例如插入//來更改成備註)
使用esc
or ctrl+[
回到normal mode,就會發現每一行都插入一樣的文字了!(如下)

使用ctrl+v
搭配I
來在多行前方插入//