Vim 移動篇


建立時間: 2023年3月12日 02:35
更新時間: 2024年6月21日 08:51

說明

紀錄 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

  1. a 選擇一個包含空白
  2. 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 移動會從當前游標到單字結尾。

我以 ciwcw 舉例:
ciwcw 都是修改一個單字並進入編輯模式,但 ciwcw 是有差異的,例如:要將 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] 個較新的位置

命令模式

命令 用途
:changes 顯示改變列表

標記

在 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 會自動標記一些位置,可參考如下表格快速移動

命令 動作
`` 當前文件中上次跳轉動作之前的位置
`. 上次修改的位置
`^ 上次插入的位置
`[ 上次修改或複製的起始位置
`] 上次修改或複製的結束位置
`< 上次高亮選區的起始位置
`> 上次高亮選區的結束位置

以上命令也適用於 ',差異在於 ` 移動到標記位置,' 移動到所在行的第一個非空字元上。

舉例如下:

命令 動作
'' 當前文件中上次跳轉動作之前的位置

其他移動方式

相關文章另有一些專屬的移動方式。

觀看次數: 1122
changelistmarkmotionvim移動標記

相關文章:

按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!