跳轉到

常用 Vim 指令清單

原文在 2024-04-17 完成

以下為「Vim 實用技巧」的筆記。Vim 指令實在很多,所以寫份清單方便查詢

標示說明

標示 說明
<C-A> Ctrl + A
<S-A> Shift + A
<CR> ReturnEnter
<BS> Backspace <--

operator 運算子

operator 運算子或指令 說明
x 刪除一個字元
d / D 刪除或剪下。d 後面接 motion,D 則是直到改行結尾
yY 複製。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
`` (連續兩個鍵盤上方 ~ 下方的 ` ) 回到上一個跳轉的游標位置:是指 %ggG、`a 、0$、或搜尋之類的跳轉,所以上下左右移動不算,用 wb 跳轉也不算
## 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 增減建議字典檔:增加 / 刪除 / 取消之前的 zgzw 命令
## 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

留言