說明
紀錄 Vim 一些好用的移動指令。
備註
- 實際行:文件中存在的行數。
- 螢幕行:螢幕上顯示的行數,一個螢幕行可以對應到多個實際行,如果一行內容太長被自動分割的話。
CTRL-]
:組合鍵 CTRL
+ ]
。
[count]
:帶入自訂的數字。
<CR>
:Enter 鍵。
普通模式移動
hjkl 上下左右移動
命令 |
動作 |
h |
左移一個字元 |
j |
向下移動一個實際行 |
k |
向上移動一個實際行 |
l |
右移一個字元 |
方向鍵上下左右移動
命令 |
動作 |
<Left> |
左移一個字元 |
<Down> |
向下移動一個實際行 |
<Up> |
向上移動一個實際行 |
<Right> |
右移一個字元 |
加減上下移動
命令 |
動作 |
+ |
向下移動一個實際行 |
- |
向上移動一個實際行 |
命令 |
動作 |
0 |
移動到實際行行首。 |
g0 |
移動到螢幕行行首。 |
_ |
移動到所在行第一個非空白字元處。 |
^ |
移動到實際行第一個非空白的字元。 |
g^ |
移動到螢幕行第一個非空白的字元。 |
| |
到當前行的 [count] 螢幕列。 |
$ |
移動到實際行行尾。 |
g$ |
移動到螢幕行行尾。 |
gj |
向下移動一個螢幕行。 |
gk |
向上移動一個螢幕行。 |
命令 |
動作 |
% |
移動到對稱括號相對位置。 |
{count}% |
到檔案的 {count} 總行的百分比處並停在行的首個非空白字元上。 |
( / ) |
跳轉到上一句/下一句的開頭。 |
{ / } |
跳轉到上一段/下一段的開頭。 |
[[ |
跳轉到上一個首行為 ‘{‘。 |
[] |
跳轉到上一個首行為 ‘}’。 |
]] |
跳轉到下一個首行為 ‘{‘。 |
][ |
跳轉到下一個首行為 ‘}’。 |
gf |
跳轉到游標下的文件名。 |
Ctrl-] |
跳轉到游標所在的關鍵字的定義。 |
命令 |
動作 |
gd |
移動到游標上的變數的區域宣告 |
gD |
移動到游標上的變數的全域宣告 |
[count]gg |
移動到第 [count] 行,缺省是第一行 |
[count]go |
到緩衝區的第 [count] 個位元 |
[count]G |
移動到第 [count] 行,缺省是最後一行 |
web
命令 |
動作 |
w |
正向移動到下一個單詞的開頭 |
e |
正向移動到當前或下一個單詞的結尾 |
b |
反向移動到當前或上一個單詞的開頭 |
ge |
反向移動到上一個單詞的結尾 |
命令 |
動作 |
W |
移動到下一個字串的字首 |
E |
移動到下一個字串的字尾 |
B |
移動到上一個字串的字首 |
gE |
移動到上一個字串的字尾 |
CTRL 系列
上下移動
命令 |
動作 |
CTRL-N |
向下移動一個實際行。 |
CTRL-P |
向上移動一個實際行。 |
命令 |
動作 |
CTRL-E |
下移一行,游標位置不動,除非超出視窗。 |
CTRL-Y |
上移一行,游標位置不動,除非超出視窗。 |
CTRL-U |
上移半頁。 |
CTRL-D |
下移半頁。 |
CTRL-B |
上移一頁。 |
CTRL-F |
下移一頁。 |
HML
命令 |
動作 |
H |
跳轉到螢幕最上方。 |
M |
跳轉到螢幕正中間。 |
L |
跳轉到螢幕最下方。 |
命令 |
動作 |
[count]H |
跳轉到螢幕最上方,往下數第 [count] 行。 |
[count]L |
跳轉到螢幕最下方,往上數第 [count] 行。 |
- 注意!
[count]H
和 [count]L
的 [count]
計算不會加上 scrolloff
設定的值,假設 scrolloff=2
,輸入 2H
會在螢幕的第3行,因為螢幕上下要保留2行。
z 系列移動
命令 |
動作 |
z<CR> |
游標位置移動到畫面上面。 |
z. |
游標位置移動到畫面中間。 |
z- |
游標位置移動到畫面下面。 |
z+ |
游標位置移動到下一頁的第一行。 |
下列替代指令應該會比較順手。
命令 |
動作 |
zt |
同 z<CR> 。 |
zz |
同 z. 。 |
zb |
同 z- 。 |
Ex 命令模式移動
命令 |
用途 |
:[range]go[to] [count] |
到緩衝區的第 [count] 個位元 |
:N |
移動到第 N 行 |
:[range]go[to] [count]
文件說明有點複雜,一般我都是這樣用,都是到緩衝區的第 [count]
個位元。
:go [count]
:[count] go
範例
:go 5
:5 go
{motion}
有時候在 Vim 說明文件中,會看到有些指令會搭配 {motion}
,例如:d{motion}
。
在 Vim 輸入 :help {motion}
可以看到 {motion}
的解釋:移動游標的命令,或動作。
文本對象選擇
查看幫助文件 :help text-objects
a
選擇一個包含空白
i
選擇內含對象不包含空白
指令 |
動作 |
a( 或 a) 或 ab |
一對圓括號 ( ) |
a{ 或 a} 或 aB |
一對花括號 { } |
a[ 或 a] |
一對方括號 [ ] |
a< 或 a> |
一對尖括號 < > |
a' |
一對單引號 ' ' |
a" |
一對雙引號 " " |
a` |
一對反引號 ` ` |
at |
一對 XML 標籤 <tag> </tag> |
指令 |
動作 |
aW |
一個字串 |
ap |
一個段落 |
as |
一個句子 |
aw |
一個單字 |
指令 |
動作 |
i( 或 i) 或 ib |
圓括號內部 ( ) |
i{ 或 i} 或 iB |
花括號內部 { } |
i[ 或 i] |
方括號內部 [ ] |
i< 或 i> |
尖括號內部 < > |
i' |
單引號內部 ' ' |
i" |
雙引號內部 " " |
i` |
反引號內部 ` ` |
it |
XML 標籤內部 <tag> </tag> |
指令 |
動作 |
iW |
內含字串 |
ip |
內含段落 |
is |
內含句子 |
iw |
內含單字 |
移動
移動命令,像是游標移動 h
j
k
l
或是單詞移動 w
e
b
或者是 0
$
G
等等的都可以當作 {motion}
,例如 diw
是刪除一個單字,d2w
表示要刪除兩個單字,de
是刪除到單字結尾。
搜尋
/
、?
搜尋也算是一種動作,所以可以使用像 d?var
就是從當前游標位置(不刪除游標位置)往回刪除到第一次搜尋 var 的位置(包含刪除 var)。
不使用文本對象選擇
並不是每個移動都可以加上文本對象選擇,例如沒有 dib
這種指令。
如果沒加文本對象選擇,w
移動會從當前游標到單字結尾。
我以 ciw
和 cw
舉例:
ciw
和 cw
都是修改一個單字並進入編輯模式,但 ciw
和 cw
是有差異的,例如:要將 public 改成 private,如果將游標放在 u 上,輸入 ciw
會如預期一樣,整個單字刪除並進入編輯模式,但 cw
會從游標處開始刪除單字,並進入編輯模式,也就是刪除 ublic ,結果會少刪除一個字元 p。
需注意 dw
會連單字後面的空格也一起被刪除,直到下一個單字之前。
b
比較特殊的是如果游標在單字開頭,代表要處理上一個單字,但如果在單字開頭之後,代表要處理游標到單字開頭。例如:db
指令,如果游標在單字開頭就會刪除上一個單字,如果在單字開頭之後就會刪除游標位置到單字開頭。
重複操作元
如果重複輸入指令,{motion}
會當作游標行,例如:dd
刪除游標行。
範例
指令 |
動作 |
y$ |
複製到游標行的結尾 |
yiw |
複製1個內含單字 |
y2w |
複製2個單字 |
yl |
複製右側字元 |
yy |
複製1行 |
跳轉列表
Vim 跳轉列表(Jump List)是一種特殊的清單,用於記錄在 Vim 編輯器中跳轉過的位置,包括游標位置、文件位置、搜索位置等。跳轉列表可以讓用戶更輕鬆地在文件之間跳轉,而無需手動輸入文件路徑或搜索字串。
舉例
:e <filename>
命令打開另一個文件
- 當使用 / 命令進行搜索時
普通模式
命令 |
動作 |
[count]CTRL-O |
轉到跳轉列表裡第 [count] 個較舊的游標位置 |
[count]Ctrl-I |
轉到跳轉列表裡第 [count] 個較新的游標位置 |
命令模式
命令 |
用途 |
:jumps |
查看當前的跳轉列表 |
:clearjumps |
清除跳轉列表 |
改變列表
Vim 改變列表(Change List)是一種特殊的列表,用於記錄在 Vim 編輯器中執行的更改操作。這些更改可以是插入、刪除、替換或移動文本等。
普通模式
命令 |
動作 |
[count]g; |
轉到改變列表裡第 [count] 個較舊的位置 |
[count]g, |
轉到改變列表裡第 [count] 個較新的位置 |
命令模式
標記
在 Vim 中,標記 (mark) 是一種標示特定位置的方式。使用標記可以幫助您快速定位和跳轉到文件中的不同位置,而無需使用行號等其他參考點。
普通命令
命令 |
動作 |
m{a-zA-Z} |
把位置標記 {a-zA-Z} 設在當前游標位置 |
{a-zA-Z}
:a~z 或 A~Z 任意字元
- 小寫在每個緩衝區局部可見
- 大寫在全域範圍可見
命令 |
動作 |
'{mark} |
游標放在標記的位置所在行的第一個非空字元上 |
`{mark} |
游標放在標記的位置 |
Ex 命令
:[range]ma[rk] {a-zA-Z'}
把位置標記 {a-zA-Z'}
設在 [range]
的末列第 0 行。預設的 [range]
是目前行。
自動標記位置
Vim 會自動標記一些位置,可參考如下表格快速移動
命令 |
動作 |
`` |
當前文件中上次跳轉動作之前的位置 |
`. |
上次修改的位置 |
`^ |
上次插入的位置 |
`[ |
上次修改或複製的起始位置 |
`] |
上次修改或複製的結束位置 |
`< |
上次高亮選區的起始位置 |
`> |
上次高亮選區的結束位置 |
以上命令也適用於 '
,差異在於 ` 移動到標記位置,'
移動到所在行的第一個非空字元上。
舉例如下:
命令 |
動作 |
'' |
當前文件中上次跳轉動作之前的位置 |
其他移動方式
相關文章另有一些專屬的移動方式。