以下為「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 |