Vim 移動篇
分類
說明
紀錄 Vim 一些好用的移動指令。
備註
- 實際行:文件中存在的行數。
 - 螢幕行:螢幕上顯示的行數,一個螢幕行可以對應到多個實際行,如果一行內容太長被自動分割的話。
 CTRL-H:組合鍵CTRL+H。[count]:帶入自訂的數字。<CR>:Enter 鍵。<BS>:Backspace 鍵。
游標移動
左右動作
備註
f是 find 的意思t是 to 的意思
h
<Left>
CTRL-H
<BS>
向左 [count] 個字元。
l
<Right>
<Space>
向右 [count] 個字元。
0
到列的首個字元。
^
到列的首個非空白字元。
$
到列尾。如果給出 [count],則先往下走 [count-1] 列或盡可能遠。
g0
到螢幕列的首個字元。
g^
到螢幕列的首個非空白字元。
gm
和 g0 類似,但 (盡可能) 向右移到螢幕顯示寬度的中間位置。
g$
往下 [count-1] 螢幕列,並到該螢幕列的列尾。
|
到目前列的 [count] 螢幕欄。
f{char}
到右側第 [count] 次出現的字元 {char}。遊標放在 {char} 上。
F{char}
到左側第 [count] 次出現的字元 {char}。遊標放在 {char} 上。
t{char}
直到右側第 [count] 次出現的字元 {char} 之前。遊標放在 {char} 左邊的位置。
T{char}
直到左側第 [count] 次出現的字元 {char} 之後。遊標放在 {char} 右側的位置。
;
重複上次的 f、t、F 或 T 命令 [count] 次。
,
反方向重複上次的 f、t、F 或 T 命令 [count] 次。
上下動作
k
<Up>
CTRL-P
向上 [count] 列。
j
<Down>
CTRL-J
CTRL-N
向下 [count] 列。
gk
g<Up>
向上 [count] 顯示列。
gj
g<Down>
向下 [count] 顯示列。
-
向上 [count] 列,停在首個非空白字元上。
+
CTRL-M
<CR>
向下 [count] 列,停在首個非空白字元上。
_
向下 [count] - 1 列,停在首個非空白字元上。
G
到第 [count] 行,預設是末行。
gg
到第 [count] 行,預設是首行。
:[range]
把遊標移到 [range] 的末行。[range] 也可以是單獨一個行號。
查看幫助: :help :[range]
範例
:1
把遊標移到第1行。
:'m
把遊標移到標記 m 處。
{count}%
到檔案的 {count} 總行的百分比處並停在行的首個非空白字元上。
:[range]go[to] [count]
[count]go
到緩衝區的第 [count] 個位元組。預設的 [count] 是 1,即文件開始處。如果給定 [range],則最後的數字用作位元組的序號。
範例
:go 5
:5 go
到緩衝區的第5個位元組。
單字動作
<S-Right>
w
正向 [count] 個單字。
<C-Right>
W
正向 [count] 個字串。
e
正向到第 [count] 個單字的尾部。
E
正向到第 [count] 個字串的尾部。
<S-Left>
b
反向 [count] 個單字。
<C-Left>
B
反向 [count] 個字串。
ge
反向到第 [count] 個單字的尾部。
gE
反向到第 [count] 個字串的尾部。
文本對象動作
(
反向 [count] 個句子。
)
正向 [count] 個句子。
{
反向 [count] 個段落。
}
正向 [count] 個段落。
]]
正向 [count] 個小節或到後一個出現在首列的 ‘{‘。
][
正向 [count] 個小節或到後一個出現在首列的 ‘}’。
[[
反向 [count] 個小節或到前一個出現在首列的 ‘{‘。
[]
反向 [count] 個小節或到前一個出現在首列的 ‘}’。
其他動作
- 注意!
[count]H和[count]L的[count]計算不會加上scrolloff設定的值,假設scrolloff=2,輸入2H會在螢幕的第3行,因為螢幕上下要保留2行。 
%
找到本行的遊標所在或其後的下一個項目,並跳到它的匹配。
項目可以是:
( ) 小括號
[ ] 方括號
{ } 花括號
/* */ C-風格的註解的開始或結尾
H
到視窗從頂部 (Home) 算第 [count] 列 (預設: 視窗的首列),並停在首個非空白字元上。
M
到視窗的中間 (Middle) 一列並停在首個非空白字元。
L
到視窗從底部 (Last) 算第 [count] 列 (預設: 視窗的末列),並停在首個非空白字元上。
捲動螢幕
向下捲動螢幕
CTRL-E
使視窗在緩衝區中向下捲動 [count] 行。
文字朝螢幕上方移動。
游標位置不動,除非超出視窗。
CTRL-D
使視窗在緩衝區中向下捲動。捲動的行數由 scroll 選項指定 (預設為半個螢幕)。
CTRL-F
使視窗在緩衝區中向下捲動 [count] 頁。
z+
不指定 [count]: 重繪,在視窗中顯示下一頁的內容 (使目前視窗之下的一行顯示在視窗最上方)。同時把遊標放在那一行第一個非空白字元上。
指定 [count]: 和 z<CR> 一樣。
向上捲動螢幕
CTRL-Y
使視窗在緩衝區中向上捲動 [count] 行。
文字朝螢幕下方移動。
游標位置不動,除非超出視窗。
CTRL-U
使視窗在緩衝區中向上捲動。捲動的行數由 scroll 選項指定 (預設為半個螢幕)。
CTRL-B
使視窗在緩衝區中向上捲動 [count] 頁。
相對於遊標捲動螢幕
z<CR>
重繪,使第 [count] 行顯示在視窗頂端 (預設為遊標所在的行)。遊標停留在那一行第一個非空白字元上。
zt
類似 z<CR>,不過遊標停留在相同的欄上。
z.
重繪,使第 [count] 行顯示在視窗中部 (預設為遊標所在的行)。遊標停留在那一行第一個非空白字元上。
zz
類似 z.,不過遊標停留在相同的欄上。
z-
重繪,使第 [count] 行顯示在視窗底部 (預設為遊標所在的行)。遊標停留在那一行第一個非空白字元上。
zb
類似 z-,不過遊標停留在相同的欄上。
{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 改變列表(Change List)是一種特殊的列表,用於記錄在 Vim 編輯器中執行的更改操作。這些更改可以是插入、刪除、替換或移動文本等。
普通模式
| 命令 | 動作 | 
|---|---|
[count]g; | 
轉到改變列表裡第 [count] 個較舊的位置 | 
[count]g, | 
轉到改變列表裡第 [count] 個較新的位置 | 
命令模式
| 命令 | 用途 | 
|---|---|
:changes | 
顯示改變列表 | 
位置標記
在 Vim 中,標記 (mark) 是一種標示特定位置的方式。使用標記可以幫助您快速定位和跳轉到文件中的不同位置,而無需使用行號等其他參考點。
跳轉方法
- 用 
`(反引號): 遊標放在指定的位置。 - 用 
'(單引號): 遊標放在指定位置所在行的首個非空字上。 
命令
m{a-zA-Z}
把位置標記 {a-zA-Z} 設在當前游標位置。
{a-zA-Z}:a~z 或 A~Z 任意字元
:[range]ma[rk] {a-zA-Z'}
把位置標記 {a-zA-Z'} 設在 [range] 的末列第 0 行。預設的 [range] 是目前行。
:[range]k{a-zA-Z'}
和 :mark 相同,但是標記名之前的空格可以省略。
'{a-z}
`{a-z}
跳到目前緩衝區的位置標記 {a-z}。
'{A-Z0-9}
`{A-Z0-9}
跳到設定位置標記 {A-Z0-9} 的檔案所在的標記位置。
:marks
列出所有的位置標記 (這不是動作命令),但不列出 '(,'),'{ 和 '} 標記。
首列的編號為零。
:marks {arg}
列出所有 {arg} 包含的位置標記 (這不是動作命令)。
範例
:marks aB
列出位置標記 ‘a’ 和 ‘B’。
'[
`[
到上次改變或抽出的文字的首個字元。
']
`]
到上次改變或抽出文字的末個字元。
'<
`<
到目前緩衝區前次選擇可視區域的首行或首個字元。
'>
`>
到目前緩衝區前次選擇可視區域的末行或末個字元。
''
``
到前次跳轉前或上次 m' 或 m` 命令給出的位置。
'"
`"
到前次離開本緩衝區時的遊標位置。預設是首行的首個字元。
'^
`^
到前次插入模式關閉的遊標位置。
'.
`.
到前次改變的位置。
'0
到退出 Vim 時所在的檔案和行號。
標記範圍
| 標記 | 說明 | 
|---|---|
'{a-z} | 
小寫位置標記,在每個文件內有效。 | 
'{A-Z} | 
大寫位置標記,也稱為檔案標記,在文件間都有效。 | 
'{0-9} | 
數字位置標記,在 .viminfo 檔案裡設定。 | 
跳轉
[count]CTRL-O
轉到跳轉列表裡第 [count] 個較舊的游標位置
[count]Ctrl-I
轉到跳轉列表裡第 [count] 個較新的游標位置
:jumps
輸出跳轉列表 (jumplist)
:clearjumps
清除當前視窗的跳轉列表
跳轉列表
查看幫助: :help jumplist
跳轉列表用來記住跳轉的位置。用 CTRL-O 和 CTRL-I 命令,你可以跳回較早前的跳轉位置,然後在跳回來。這樣,你就可以在這個列表上下移動。每個視窗有獨立的跳轉列表,每個列表最多能儲存 100 項。
舉例
:e <filename>命令打開另一個文件- 當使用 / 命令進行搜索時
 
其他移動方式
相關文章另有一些專屬的移動方式。
相關文章:
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!