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>
命令打開另一個文件- 當使用 / 命令進行搜索時
其他移動方式
相關文章另有一些專屬的移動方式。
相關文章:
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!