常用 Vim 指令清單
原文在 2024-04-17 完成
以下為「Vim 實用技巧」的筆記。Vim 指令實在很多,所以寫份清單方便查詢
標示說明
標示 |
說明 |
<C-A> |
Ctrl + A |
<S-A> |
Shift + A |
<CR> |
Return 或 Enter |
<BS> |
Backspace <-- |
operator 運算子
operator 運算子或指令 |
說明 |
x |
刪除一個字元 |
d / D |
刪除或剪下。d 後面接 motion,D 則是直到改行結尾 |
y 或 Y |
複製。y 後面接 motion,Y 則是直到改行結尾 |
p / P |
貼上:游標在貼上的文字第一行非空白字元開頭 |
gp / gP |
貼上:游標在貼上的文字最後一行開頭 / 留在原來那一行的開頭 |
:set paste |
貼上時取消縮排 |
> / >> / < / << |
向右縮排 / 向右縮排一行 / 向左縮排 / 向左縮排一行 |
= / == |
自動縮排 / 自動縮排一行 |
<C-A> / <C-X> |
數字遞增 / 遞減 |
gu / gU / g~ |
英文字母 轉小寫 / 轉大寫 / 切換大小寫 (後面要加 motion) |
~ |
切換大小 寫 |
(visual mode) u / U / ~ |
英文字母 轉小寫 / 轉大寫 / 切換大小寫 |
點 . |
重複上次修改(外掛 vim-repeat 透過 點 . 重複外掛操作) |
u |
取消上次修改 |
<C-R> |
重作被取消的修改 |
## motion 動作 |
|
motion 動作 |
說明 |
Practical Vim 頁碼 |
小寫 L |
游標所在的一個字元 |
|
h / j / k / l |
(實際行) 移動游標 左 / 下 / 上 / 右 |
|
gh / gj / gk / gl |
(螢幕行) 移動游標 左 / 下 / 上 / 右 |
|
w / b / W / B |
游標在單字開頭 下一個英文單字 / 上一個英文單字 / 下一個字串 / 上一個字串 |
107 |
e / ge / E / gE |
游標在單字結尾 下一個英文單字 / 上一個英文單字 / 下一個字串 / 上一個字串 |
107 |
數字 0 / ^ / $ |
(實際行) 此行 開頭 / 開頭(非空格) / 結尾 |
|
g數字 0 / g^ / g$ |
(螢幕行) 此行 開頭 / 開頭(非空格) / 結尾 |
|
f 字元 / F 字元 / t 字元 / T 字元 |
(尋找此行游標的) 右邊 字元 / 左邊 字元 / 右邊 字元 的左邊 / 左邊 字元 的右邊 |
|
分號 ; / 逗號 , |
(尋找此行) 下一個 / 上一個 |
|
gg / G |
緩衝區 第一行 / 最後一行 |
|
% |
成對括號的結尾或開頭 |
122 |
`` (連續兩個鍵盤上方 ~ 下方的 ` ) |
回到上一個跳轉的游標位置:是指 % 、gg 或 G 、`a 、0 或 $ 、或搜尋之類的跳轉,所以上下左右移動不算,用 w 或 b 跳轉也不算 |
|
## text object 文字物件 |
|
|
text object 文字物件 |
說明 |
Practical Vim 頁碼 |
iw / iW / aw / aW |
inside word / inside 字串 / a word / a 字串 |
|
i) / i] / i} / i> / i' / i" / i\ / it |
inside 括號、引號、html tag (不包含括號、引號、html tag 本身) |
117 |
a) / a] / a} / a> / a' / a" / a\ / at |
一個括號、引號、html tag (包含括號、引號、html tag 本身) |
117 |
is / as |
文章的一個句子,以一個點 . 表示到此為一句,中文也是 (注意,不是一行) |
119 |
ip / ap |
a paragraph (文章的一個段落) |
119 |
|
targets.vim 提供許多額外的 text object |
|
## register 暫存器 |
|
|
存取暫存器指令 |
例如貼上複製好的字串 |
(normal mode) "{register} |
(normal mode) "0 |
(insert mode) <C-R>{register} |
(insert mode) Ctrl + R 數字 0 |
(Ex mode) <C-R>{register} |
(Ex mode) Ctrl + R 數字 0 |
指令 |
說明 |
(Ex mode) @{register} |
執行暫存器內容 |
:reg a / :reg |
顯示 register a 的值 / 顯示所有 register 的值 |
暫存器代表符號 {register} |
說明 |
= |
expression 暫存器 (貼上簡單的數學計算結果,例如 (normal mode) "=2+3 會貼上 5) |
" |
無名暫存器 |
{a-z} |
有名暫存器,從 a 到 z |
0 |
複製專用暫存器 |
{1-9} |
delete 專用暫存器。1 是最近的,可紀錄到前9個 |
% |
目前檔案名稱 |
# |
輪流切換的檔案名稱 (使用 :bn 等命令時,上一個檔案的名稱) |
. |
上次插入的文字 |
: |
上次執行的 Ex 命令 |
/ |
上次搜尋的 pattern |
_ |
黑洞暫存器 (刪除而且不留副本) |
folding 折疊
指令 |
說明 |
:set foldmethod=摺疊方式 |
foldmethod 可縮寫成 fdm |
:set fdm=manual |
手動摺疊 |
:set fdm=indent |
依照縮排摺疊 |
:set fdm=syntax |
依照語法摺疊(似乎要另外設定一些東西才能運作) |
zf{motion} |
手動新增摺疊,例如 zf3j 摺疊目前游標到下面三行 |
用 visual mode 選好範圍,按 zf |
選取範圍手動新增摺疊 |
:[range] fold |
ex 命令手動新增摺疊,例如 :10, 25 fold 摺疊 10 到 25 行 |
zd /zE |
刪除游標所在摺疊 / 刪除所有摺疊 |
zo |
打開游標所在摺疊 |
zc |
關閉游標所在摺疊 |
zx |
打開游標所在摺疊,其餘關閉 |
za |
切換游標所在摺疊 |
zi |
切換啓用摺疊 |
zj / zk |
移動到下一個摺疊 / 上一個摺疊 |
zn / zN |
啓用摺疊 / 禁用摺疊 |
## 自動補齊 |
|
指令 |
說明 |
Practical Vim 頁碼 |
(insert mode) <C-N> |
普通關鍵字 (包含目前緩衝區、引入檔案和 ctags) |
265 |
(insert mode) <C-X><C-N> / <C-X><C-P> |
目前緩衝區關鍵字:下一個 / 上一個 |
|
(insert mode) <C-X><C-I> |
include, import 等引入的檔案關鍵字 |
|
(insert mode) <C-X><C-]> |
ctags 標籤檔案關鍵字 |
|
(insert mode) <C-X><C-K> |
拼字建議 (先啟用拼字檢查) |
|
(insert mode) <C-X><C-L> |
目前緩衝區整行補齊 |
|
(insert mode) <C-X><C-F> |
檔案名稱補齊 (依照目前工作目錄) |
|
(insert mode) <C-X><C-O> |
Omni 全能補齊(需要額外設定) |
|
(關鍵字清單) <C-N> / <C-P> |
填上選擇的關鍵字:下一個 / 上一個 |
266 |
(關鍵字清單) <Down> / <Up> / <C-Y> |
選擇關鍵字:下一個 / 上一個 / 確認填上選擇的關鍵字 |
|
(關鍵字清單) <C-E> |
取消自動補齊 |
|
(關鍵字清單) <C-H> 或 <BS> |
填上關鍵字並刪除一個字元 |
|
輸入任意字元 |
中止自動補齊並插入字元 |
|
## 插入字元符號 |
|
|
插入字元符號 |
說明 |
|
以下的 i, a, s, c, r 和 o 都是進入 Insert mode |
i / 大寫 I |
游標前面 / 游標所在該行的非空白開頭 |
a / 大寫 A |
游標後面 / 游標所在該行的結尾 |
s / 大寫 S |
刪除游標所在的字元後 / 刪除游標所在該行所有非字元後 |
c{motion} / 大寫 C |
刪除指定 motion 字元後 / 刪除游標到該行結尾後 |
r / 大寫 R |
修改一個字元後 / 進入 replace mode,直到按下 <ESC> 或 <C-[> ,回到 normal mode |
英文字母 o / O |
新增一行後:下面 / 上面 |
(insert mode) <C-H> |
刪除前一個字元 (等同 backspace) |
(insert mode) <C-W> |
刪除前一個單字 |
(insert mode) <C-U> |
刪除到此行開頭(非空格) |
<ESC> |
切換到 normal mode |
(insert mode) <C-[> |
切換到 normal mode |
(insert mode) <C-O> |
切換到 insert-normal mode (執行一個 normal mode 指令後回到 insert mode) |
(insert mode) <C-V> |
準備插入特殊字元 |
<C-V>{065} |
插入編碼為 000 到 999 的 ANSI Code 字元,<C-V>065 會輸入 A |
<C-V>u{1234} |
插入編碼為 16 進位 0000 到 ffff 的 Unicode 字元 |
<C-V>非數字 |
插入原來的字元 |
:h i_CTRL-V_digit |
上述功能的簡短說明 |
(insert mode) <C-K> |
準備插入 digraph 二合字母 |
<C-K>{字元}{字元} |
例如 <C-K>12 插入數學的二分之一 |
:h digraph-table |
二合字母列表 |
:h digraph-table-mbyte |
二合字母列表(包含日文假名和注音符號) |
## 拼字檢查 |
|
指令 |
說明 |
:set spell / :set nospell / :set spell! |
拼字檢查:啟用 / 停用 / 切換 |
]s / [s |
跳轉到拼寫錯誤的單字:下一個 / 上一個 |
數字z= |
顯示更正建議清單,可在前面加上數字,直接選取清單的第幾個單字 |
zg / zw / zug |
增減建議字典檔:增加 / 刪除 / 取消之前的 zg 或 zw 命令 |
## visual 模式 |
|
指令 |
說明 |
v / V / <C-V> |
使用 visual mode:字元 / 此行 / block 區塊 |
gv |
重新選擇上次的 highlight 選擇區 |
(visual mode) 英文字母 o |
切換 highlight 選擇區的調整端 |
## ex mode |
|
指令 |
說明 |
:選擇範圍 命令 {到達位置} |
先選擇範圍,再輸入命令(如果沒有選擇範圍,預設為目前這一行) |
選擇範圍 |
|
:n |
移動游標到第 n 行 |
:m, n |
第 m 行到第 n 行,游標停在第 n 行 |
:1, $ |
從第一行到最後一行 |
:1, . |
從第一行到游標所在這一行(數字 1 到一個點) |
數字 0 |
目前檔案第一行的上一行 (用 :put 貼到第一行時需要用到) |
:% |
整個檔案 (參考 :h cmdline-special 和 :h filename-modifiers ) |
使用 visual mode 之後按 : |
目前的 visual mode highlight 範圍 |
:'<, '> |
上一次的 visual mode highlight 範圍(開始和結束) |
:/pattern1/, /pattern2/ |
從 pattern1 這一行到 pattern2 那一行 |
:/pattern1/+m, /pattern2/-n |
從 pattern1 這一行往下 m 行到 pattern2 那一行向上 n 行 (注意加和減兩邊沒有空格) |
ex 命令 |
|
:print 或 :p |
顯示 |
:copy 或 :co / :t (copy To) |
複製(不會放到預設的暫存器中) |
:move 或 :m |
移動 |
:delete 或 :d |
刪除 |
:[line]put {register} |
貼上到指定行的下一行 |
:normal @{a-z} |
執行 normal mode 命令,@{a-z} 表示執行的是 macro |
@: |
重複之前的 ex 命令 |
@@ |
重複之前用 @: 執行過的 ex 命令 |
q: |
顯示 ex 命令歷史視窗。按下 enter 表示執行游標所在那一行的 ex 命令 |
q/ |
顯示搜尋歷史視窗 |
(ex mode) <C-F> |
從 ex mode 切換到 ex 命令歷史視窗 |
(ex mode) <C-D> |
顯示可用的 ex 命令 |
(ex mode) <TAB> |
自動補齊 |
(ex mode) <S-TAB> |
從最後一個開始,自動補齊 |
(ex mode) <C-R><C-W> |
複製游標所在的單字 |
(ex mode) <C-R><C-A> |
複製游標所在的字串(直到兩邊的空格) |
:shell / exit |
切換到互動式 shell / 切換回 Vim |
<C-Z> / fg |
暫停 Vim ,並移到背景 / 把 Vim 移回前景 |
:read !cmd |
執行 shell 指令(cmd),並把輸出貼到 Vim 游標所在下一行。read 可以縮寫為 r |
:[range]write !cmd |
把 Vim 選取範圍傳給 shell 指令(cmd) 做為其參數。write 可以縮寫為 w |
:[range] !{filter} |
使用外部 shell 指令過濾指令範圍 |
:source file.vim |
套用 file.vim 內的 ex 命令 |
(ex mode) cmd | cmd |
分隔兩個 cmd 命令 |
## 管理多個檔案 |
|
指令 |
說明 |
Practical Vim 頁碼 |
:q! |
指令後面加上驚嘆號表示強制執行,不確認 |
|
打開檔案 |
|
|
:edit / :edit! / :e |
打開檔案 / 重新打開檔案,覆蓋目前的緩衝區 / :edit 的縮寫 |
|
:find file |
在 path 中尋找檔案 file 並打開 (這樣就不用完整路徑了) |
91 |
:set path+=app/** |
新增 path 為 app/ 和子目錄 |
91 |
:edit . 或 :e. / :E[xplore] |
打開 Netrw 文件管理器: 目前檔案所在目錄 / 目前工作目錄 |
94 |
:lcd / :cd |
設定 working dictionary:目前視窗 / 所有的視窗 |
|
:pwd |
顯示目前視窗的 working dictionary (不是檔案位置) |
|
存檔 |
|
|
:w[rite] / :wa[ll] |
存檔 / 全部存檔 |
|
:write file |
Vim 存檔為 file。write 可以縮寫成 w |
|
:update |
存檔 (有修改的才儲存) |
|
:q[uit] / :q! / :qa[ll]! |
離開 Vim / 不存檔 / 全部不存檔 |
|
緩衝區 |
|
|
:ls |
顯示緩衝區清單 |
|
:bn[ext] / :bp[revious] / :bfirst / :blast |
切換緩衝區 下一個 / 上一個 / 第一個 / 最後一個 |
|
<C-^> |
切換到上一個顯示的緩衝區。酸然是 ^ ,但是不用按 <S> 所以實際上是 <C-6> |
|
:b[uffer] 數字或名稱 |
切換到 !ls 清單的指定緩衝區。可用<TAB> 自動補齊 |
|
:[range] bd[elete] / :bd[elete] 1 2 3 |
刪除緩衝區 指定範圍 / 指定哪幾個 |
|
args 命令 |
|
|
:args file1 file2 |
開啟指定檔案,緩衝區順序依照輸入順序 |
|
:args */*.* / :args **/*.* |
開啟檔案 不包含子目錄的檔案 / 包含子目錄內的檔案 |
79 |
:args `shell cmd` |
執行反引號 ` 包起來的 shell 指令,把輸出作為要開啟的檔案。沒有檔案的話就新增檔案 |
79 |
<C-G> |
顯示目前檔案名稱和狀態 |
|
## 分割視窗 / Tab 分頁 |
|
|
指令 |
說明 |
Practical Vim 頁碼 |
分割視窗 |
|
|
<C-W>s / <C-W>v |
分割視窗:水平 / 垂直 |
83 |
:sp[lit] file / :vsp[lit] file |
分割視窗,並在新視窗中打開檔案:水平 / 垂直 |
84 |
<C-W> 加上 w / h / j / k / l |
切換視窗:循環 / 左 / 下 / 上 / 右 |
84 |
:clo[se] / <C-W>c |
關閉 active window |
84 |
:on[ly] / <C-W>o |
關閉其他視窗 |
84 |
|
|
|
:windo 命令 |
目前 Tab 的所有視窗,執行命令 |
86 |
Tab 分頁 |
|
|
:tabe[dit] file / <C-W>t |
開新的 Tab,打開檔案。沒有檔案的話,開新的檔案 / 移動目前視窗到新的 Tab |
87 |
:tabc[lose] / :tabo[nly] |
關閉目前 Tab / 關閉其他 Tab |
87 |
:tabn[ext] n / :tabp[revious] |
切換 Tab:跳到編號 n 的,不指定編號則為下一個 / 上一個 |
87 |
編號gt / gT |
切換 Tab:跳到指定編號的 Tab,不指定編號則為下一個 / 上一個 |
87 |
:tabm[ove] 數字 |
移動 Tab 順序,數字 0 表示最左邊,然後是 1 。沒有數字則為最右邊 |
|
## 跳轉 |
|
|
指令 |
說明 |
Practical Vim 頁碼 |
:jumps / <C-O> / <C-I> |
跳轉:顯示歷史清單 / 上一個位置 / 下一個位置 (注意:只能用來跳轉,而且只能在目前的視窗中跳轉) |
125, 126 |
m{a-z} / m{A-Z} |
標示目前游標位置:小寫字母(目前顯示的緩衝區內可用) / 大寫字母 (所有緩衝區可用) |
120 |
`{字母} |
跳到位置標記:第幾行和第幾列 |
121 |
'{字母} |
跳到位置標記:第幾行的開頭 |
|
gf |
跳轉到目前游標下的檔案。用在 include('file') 之類 |
128, 129, 130 |
:set suffixesadd+=.php,..html,.htm,.js,.css |
指定 gf 時要嘗試加上的副檔名 |
|
<C-]> / g<C-]> / <C-T> |
跳轉到定義 / 跳轉到定義,並且顯示清單 / 回到原處 |
242 |
:tselect / :tnext / :tprev |
顯示 ctags 清單 |
243 |
## 搜尋 |
|
|
指令 |
說明 |
Practical Vim 頁碼 |
/{pattern}/[e] |
向下搜尋:沒有 {pattern} 則使用上一個 {pattern} ,e flag 表示游標在匹配的結尾 |
193 |
?{pattern}/[e] |
向上搜尋:沒有 {pattern} 則使用上一個 {pattern} ,e flag 表示游標在匹配的結尾 |
193 |
n / N |
下一個匹配 / 上一個匹配 |
|
gn / gN |
進入 visual mode,同時選取匹配:下一個匹配 / 上一個匹配 (此為 motion) |
195, 196 |
|
搜尋單引號內的文字 |
197, 198, 199 |
|
搜尋 visual mode 選取的文字 |
202, 203 |
取代
指令 |
說明 |
Practical Vim 頁碼 |
:[range]s[ubsititute]/{before}/{after}/[gcn] |
取代文字:搜尋 before,改成 after |
205 |
:%s//{pattern}/g |
使用上一個搜尋條件取代為 {pattern} (常用的取代命令格式) |
209 |
flag g / c / n |
全部取代 / 確認後取代 / 不取代,只計算符合的數量 |
|
|
flag c 的選擇 |
208 |
:&& |
執行上一個 substitute 取代命令和上一個 flag |
215 |
macro 巨集
指令 |
說明 |
Practical Vim 頁碼 |
q{a-z} / q |
錄製 macro / 停止錄製 macro |
|
數字@{a-z} |
執行 macro,可加上數字指定執行幾次 (出錯就會停止) |
|
(Ex mode) normal @{a-z} |
執行 macro (出錯不會停止) |
159 |
@@ |
執行上一個 macro |
|
q{A-Z} |
把命令加到舊的 macro 後面 |
|
|
macro 只是存在 register 的文字,只要編輯後放回去,就能修改 macro |
170 |