Vim 移動篇


建立時間: 2023年3月12日 02:35
更新時間: 2024年11月15日 08:34

說明

紀錄 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} 右側的位置。


;

重複上次的 ftFT 命令 [count] 次。


,

反方向重複上次的 ftFT 命令 [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

  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 改變列表(Change List)是一種特殊的列表,用於記錄在 Vim 編輯器中執行的更改操作。這些更改可以是插入、刪除、替換或移動文本等。

普通模式

命令 動作
[count]g; 轉到改變列表裡第 [count] 個較舊的位置
[count]g, 轉到改變列表裡第 [count] 個較新的位置

命令模式

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

位置標記

在 Vim 中,標記 (mark) 是一種標示特定位置的方式。使用標記可以幫助您快速定位和跳轉到文件中的不同位置,而無需使用行號等其他參考點。

跳轉方法

  1. ` (反引號): 遊標放在指定的位置。
  2. ' (單引號): 遊標放在指定位置所在行的首個非空字上。

命令

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-OCTRL-I 命令,你可以跳回較早前的跳轉位置,然後在跳回來。這樣,你就可以在這個列表上下移動。每個視窗有獨立的跳轉列表,每個列表最多能儲存 100 項。

舉例

  • :e <filename> 命令打開另一個文件
  • 當使用 / 命令進行搜索時

其他移動方式

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

觀看次數: 1845
changelistmarkmotionvim移動標記
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

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

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