移動
Nvim 的 :help
頁面,由 原始碼 使用 tree-sitter-vimdoc 解析器 生成。
一般說明
如果您想知道您在檔案中的位置,請使用 "CTRL-G" 命令
CTRL-G 或 "g
CTRL-G
" 命令
g_CTRL-G。如果您設定了
'ruler' 選項,游標位置會持續顯示在狀態列中(這會稍微減慢 Vim 的速度)。
經驗豐富的使用者偏好使用 hjkl 鍵,因為它們總是位於手指下方。初學者通常偏好使用方向鍵,因為他們不知道 hjkl 鍵的作用。從鍵盤上觀察即可清楚 hjkl 的助記價值。將 j 想成一個指向下方的箭頭。
移動命令可以在運算符命令之後使用,使該命令對移動過的文字進行操作。也就是移動之前和之後游標位置之間的文字。運算符通常用於刪除或變更文字。以下運算符可用:
指令中會提及哪些移動是逐行的、包含性的或排除性的。但是,有兩個一般例外情況:1. 如果移動是排除性的,且移動結束位於第 1 欄,則移動結束會移動到前一行的末尾,且移動會變成包含性的。範例:「}」會移動到段落後的第一行,但「d}」不會包含該行。
exclusive-linewise2. 如果移動是排除性的,移動結束位於第 1 欄,且移動的開始位置位於或在該行的第一個非空白字元之前,則移動會變成逐行的。範例:如果段落以一些空白開頭,且您在第一個非空白字元上執行「d}」,則會刪除該段落的所有行,包括空白。如果您現在執行貼上,則會將已刪除的行插入到游標位置下方。
請注意,當運算符處於擱置狀態(已輸入運算符命令,但尚未輸入移動)時,可以使用一組特殊的對應。請參閱
:omap。
您可以使用視覺模式,而不是先給出運算符,然後再給出移動:使用「v」標記文字的開始位置,將游標移動到要影響的文字的末尾,然後按下運算符。開始和游標位置之間的文字會被反白顯示,因此您可以查看將對哪些文字執行操作。這提供了更大的自由度,但需要更多的按鍵次數,且重新執行功能有限。請參閱有關視覺模式的章節
視覺模式。
您可以使用「:」命令來進行移動。例如,「d:call FindEnd()」。但是,如果命令不只一行,則無法使用「.」重複此操作。這可以重複
d:call search("f")<CR>
這無法重複
d:if 1<CR>
call search("f")<CR>
endif<CR>
請注意,當使用「:」時,任何移動都會變成逐字元的排除性移動。
當移動不是您想要使用的類型時,您可以使用運算符之後的「v」、「V」或
CTRL-V
來強制另一種類型。範例
dj
刪除兩行
dvj
從游標位置刪除到游標下方的字元
d<C-V>j
刪除游標下的字元和游標下方的字元。強制將逐行移動用於逐字元或區塊式時要小心,欄可能並非總是定義好的。
o_v v 在運算符之後,移動命令之前使用:強制運算符以逐字元方式運作,即使移動是逐行的也一樣。如果移動是逐行的,則會變成
排除性。如果移動已經是逐字元的,則會切換包含性/排除性。這可以用來使排除性移動變成包含性,並使包含性移動變成排除性。
o_V V 在運算符之後,移動命令之前使用:強制運算符以逐行方式運作,即使移動是逐字元的也一樣。
o_CTRL-V CTRL-V 在運算符之後,移動命令之前使用:強制運算符以區塊式方式運作。這與視覺區塊模式選擇類似,其角點由移動之前和之後的游標位置定義。
這些命令會將游標移動到目前行的指定欄位。它們會在第一欄和行尾停止,但「$」可能會移動到接下來的其中一行。請參閱
'whichwrap' 選項,使一些命令能夠跨行移動。
h 或
h
<Left>
或
<Left>CTRL-H 或
CTRL-H <BS> <BS>
向左移動 [計數] 個字元。
排除性 移動。
注意:如果您偏好使用
<BS>
來刪除字元,請使用對應
:map CTRL-V<BS> X
(輸入「CTRL-V<BS>」,請按 CTRL-V
鍵,然後按 <BS>
鍵)
<Home> <kHome> <Home>
移動到該行的第一個字元。
排除性 移動。接下來向上或向下移動時,保持在相同的文字欄位(如果可以)。大多數其他命令會保持在相同的螢幕欄位。
<Home>
的作用類似於「1|」,當行以
<Tab>
開頭時,與「0」不同。
^ ^ 移動到該行的第一個非空白字元。
排除性 移動。任何計數都會被忽略。
$ <End> <kEnd> $ 或
<End>
移動到該行的末尾。當給定計數時,也會向下移動 [計數 - 1] 行,或盡可能移動。
包含性 移動。如果給定的計數為 2 或更大,且游標位於最後一行,則會發生錯誤,且游標不會移動。在視覺模式中,游標會移至行中最後一個字元之後。當
'virtualedit' 啟用時,「$」可能會將游標從行尾後方移回行中的最後一個字元。
g_ g_ 移動到該行的最後一個非空白字元,並向下移動 [計數 - 1] 行
包含性。
g0 g<Home> g0 或 g<Home> 當行換行時(
'wrap' 開啟):移動到螢幕行的第一個字元。
排除性 移動。當行寬於螢幕時,與「0」不同。當行不換行時(
'wrap' 關閉):移動到螢幕上目前行最左邊的字元。當行的第一個字元不在螢幕上時,與「0」不同。
g^ g^ 當行換行時(
'wrap' 開啟):移動到螢幕行的第一個非空白字元。
排除性 移動。當行寬於螢幕時,與「^」不同。當行不換行時(
'wrap' 關閉):移動到螢幕上目前行最左邊的非空白字元。當行的第一個非空白字元不在螢幕上時,與「^」不同。
gm gm 類似於「g0」,但向右移動半個螢幕寬度(或盡可能多)。
gM gM 類似於「g0」,但移動到該行文字的一半位置。如果給定計數:移動到該行文字的百分比。因此,「10gM」接近文字的開頭,而「90gM」接近文字的結尾。
g$ g$ 當行換行時(
'wrap' 開啟):移動到螢幕行的最後一個字元,並向下 [count - 1] 個螢幕行(包含)。當行寬度超過螢幕時,與 "$" 不同。當行不換行時(
'wrap' 關閉):移動到螢幕上可見的目前行最右邊的字元。當行的最後一個字元不在螢幕上或使用了計數時,與 "$" 不同。此外,垂直移動會保持欄位,而不是移動到行的末尾。當
'virtualedit' 啟用時,會移動到螢幕行的末尾。
bar | 移動到目前行的螢幕欄位 [count]。
獨佔式移動。Ceci n'est pas une pipe.
F F{char} 移動到左邊第 [count] 個
{char}
。游標會放在
{char}
上(
獨佔式)。
{char}
可以像使用
f 命令一樣輸入。
t t{char} 移動到右邊第 [count] 個
{char}
之前。游標會放在
{char}
左邊的字元上(
包含)。
{char}
可以像使用
f 命令一樣輸入。
T T{char} 移動到左邊第 [count] 個
{char}
之後。游標會放在
{char}
右邊的字元上(
獨佔式)。
{char}
可以像使用
f 命令一樣輸入。
; ; 重複最近一次的 f、t、F 或 T 命令 [count] 次。請參閱
cpo-;
, , 重複最近一次的 f、t、F 或 T 命令,方向相反 [count] 次。另請參閱
cpo-;
gk 或
gk g<Up> g<Up> 向上移動 [count] 個顯示行。
獨佔式移動。當行換行時,以及與運算符一起使用時,與 'k' 不同,因為它不是行式的。
gj 或
gj g<Down> g<Down> 向下移動 [count] 個顯示行。
獨佔式移動。當行換行時,以及與運算符一起使用時,與 'j' 不同,因為它不是行式的。
-
-
<minus>
向上移動 [count] 行,移動到第一個非空白字元(
行式)。
_ _
<underscore>
向下移動 [count] - 1 行,移動到第一個非空白字元(
行式)。
<C-End>
<C-End>
跳到第 [count] 行,預設為最後一行,移動到最後一個字元(
包含)。
:[range] :[range] 將游標設定在 [range] 中的最後一個行號上。在 Ex 模式下,列印 [range] 中的行。[range] 也可以只是一個行號,例如:「:1」或:「:'m」。與
G 不同,此命令不會修改
跳躍列表。
N%
{count}
% 跳到檔案中的
{count}
百分比處,移動到該行的第一個非空白字元(
行式)。計算新行號會使用以下公式:(
{count}
* 行數 + 99) / 100。另請參閱
'startofline' 選項。
這些命令會移動到指定的行。當到達第一行或最後一行時,它們會停止。前兩個命令會將游標放在與上一個變更欄位的命令之後相同的欄位中(如果可能的話),但在 "$" 命令之後,游標會放在該行的最後一個字元上。
e e 向前移動到第 [count] 個字詞的結尾(
包含)。不會在空行中停止。
E E 向前移動到第 [count] 個 WORD 的結尾(
包含)。不會在空行中停止。
ge ge 向後移動到第 [count] 個字詞的結尾(
包含)。
gE gE 向後移動到第 [count] 個 WORD 的結尾(
包含)。
這些命令會在字詞或 WORD 上移動。
word一個字詞由一系列字母、數字和底線組成,或者由一系列其他非空白字元組成,並以空白字元(空格、定位點、
<EOL>
)分隔。可以使用
'iskeyword' 選項來變更此設定。空行也被視為一個字詞。
WORD一個 WORD 由一系列非空白字元組成,並以空白字元分隔。空行也被視為一個 WORD。
一連串摺疊的行會被視為一個單一字元的字詞。「w」和「W」、「e」和「E」會移動到一系列摺疊行之後的第一個字詞或 WORD 的開頭/結尾。「b」和「B」會移動到摺疊之前的第一個字詞或 WORD 的開頭。
特殊情況:如果游標位於非空白字元上,「cw」和「cW」會像「ce」和「cE」一樣處理。這是與 Vi 相容的,請參閱
cpo-_ 來變更行為。
另一個特殊情況:當將「w」移動與運算符組合使用,且移動過的最後一個字詞位於行尾時,該字詞的結尾會成為被操作文字的結尾,而不是下一行的第一個字詞。
原始 Vi 實作的「e」有錯誤。例如,如果前一行是空的,「e」命令會停在行的第一個字元上。但是,當您使用「2e」時,這不會發生。在 Vim 中,「ee」和「2e」是相同的,這更符合邏輯。但是,這會在 Vi 和 Vim 之間造成一些小的不相容。
]] ]] 向前移動 [count] 個
區塊,或移動到第一欄中的下一個「{」。在運算符之後使用時,也會停在第一欄中的「}」下方。
獨佔式請注意,通常會套用
獨佔行式。
][ ][ 向前移動 [count] 個
區塊,或移動到第一欄中的下一個「}」。
獨佔式請注意,通常會套用
獨佔行式。
[[ [[ 向後移動 [count] 個
區塊,或移動到第一欄中的上一個「{」。
獨佔式請注意,通常會套用
獨佔行式。
[] [] 向後移動 [count] 個
區塊,或移動到第一欄中的上一個「}」。
獨佔式請注意,通常會套用
獨佔行式。
這些命令會在三種文字物件上移動。
句子 句子的定義為以「.」、「!」或「?」結尾,後面接著行尾,或是一個空格或定位字元。在「.」、「!」或「?」之後,空格、定位字元或行尾之前,可以出現任意數量的結尾括號「)」、「]」、「"」和「'」字元。段落和章節邊界也是句子邊界。如果
'cpoptions' 中存在「J」旗標,則標點符號後必須至少跟隨兩個空格;
<Tab>
不會被視為空白。句子的定義無法變更。
段落 段落起始於每個空行之後,以及由
'paragraphs' 選項中指定的成對字元所構成的段落巨集。預設值為「IPLPPPQPP TPHPLIPpLpItpplpipbp」,對應於巨集「.IP」、「.LP」等(這些是 nroff 巨集,因此點必須在第一欄)。章節邊界也是段落邊界。請注意,空白行(僅包含空白字元)不是段落邊界。
注意:這不包括第一欄中的「{」或「}」。
章節 章節起始於第一欄中的換頁符號 (
<C-L>
),以及由
'sections' 選項中指定的成對字元所構成的章節巨集。預設值為「SHNHH HUnhsh」,定義章節從 nroff 巨集「.SH」、「.NH」、「.H」、「.HU」、「.nh」和「.sh」開始。
「]]」和「[[」命令會在第一欄的「{」處停止。這對於在 C 程式中尋找函式的開頭很有用。若要在第一欄中搜尋「}」(C 函式的結尾),請使用「][」(向前)或「[]」(向後)。請注意,命令的第一個字元決定搜尋方向。
如果你的「{」或「}」不在第一欄,但你仍想使用「[[」和「]]」,請嘗試以下對應
:map [[ ?{<CR>w99[{
:map ][ /}<CR>b99]}
:map ]] j0[[%/{<CR>
:map [] k$][%?}<CR>
[請逐字輸入,請參閱
<>]
這是一系列只能在可視模式或運算子之後使用的命令。以「a」開頭的命令會選取包含空白字元的「a」物件,以「i」開頭的命令會選取不包含空白字元的「inner」物件,或僅選取空白字元。因此,「inner」命令選取的文字總是比「a」命令少。
另請參閱 gn
和 gN
,它們會對最後一個搜尋模式進行操作。
v_aw aw aw「一個單字」,選取 [計數] 個單字(請參閱
word)。包含開頭或結尾的空白,但不計數。在可視行模式中使用時,「aw」會切換到可視字元模式。
v_iw iw iw「內部的單字」,選取 [計數] 個單字(請參閱
word)。也計算單字之間的空白。在可視行模式中使用時,「iw」會切換到可視字元模式。
v_aW aW aW「一個 WORD」,選取 [計數] 個 WORD(請參閱
WORD)。包含開頭或結尾的空白,但不計數。在可視行模式中使用時,「aW」會切換到可視字元模式。
v_iW iW iW「內部的 WORD」,選取 [計數] 個 WORD(請參閱
WORD)。也計算單字之間的空白。在可視行模式中使用時,「iW」會切換到可視字元模式。
v_ap ap ap「一個段落」,選取 [計數] 個段落(請參閱
paragraph)。例外:空白行(僅包含空白字元)也是段落邊界。在可視模式中使用時,會變成行模式。
v_ip ip ip「內部的段落」,選取 [計數] 個段落(請參閱
paragraph)。例外:空白行(僅包含空白字元)也是段落邊界。在可視模式中使用時,會變成行模式。
a]
v_a] v_a[ a] a[ a[「一個 [] 區塊」,選取 [計數] 個「[」「]」區塊。這會向後移動到 [計數] 個未封閉的「[」,並尋找匹配的「]」。選取封閉的文字,包括「[」和「]」。
cpo-M 選項旗標用於處理跳脫的括號。在可視模式中使用時,會變成字元模式。
i]
v_i] v_i[ i] i[ i[「內部的 [] 區塊」,選取 [計數] 個「[」「]」區塊。這會向後移動到 [計數] 個未封閉的「[」,並尋找匹配的「]」。選取封閉的文字,但不包括「[」和「]」。選取像「[]」這樣的空內部區塊會產生錯誤。
cpo-M 選項旗標用於處理跳脫的括號。在可視模式中使用時,會變成字元模式。
a)
v_a) a) a( a(
vab v_ab v_a( ab ab「一個區塊」,從 "[計數] [(" 到匹配的「)」,選取 [計數] 個區塊,包括「(」和「)」(請參閱
[()。不包含括號外的空白。
cpo-M 選項旗標用於處理跳脫的括號。在可視模式中使用時,會變成字元模式。
i)
v_i) i) i( i(
vib v_ib v_i( ib ib「內部的區塊」,從 "[計數] [(" 到匹配的「)」,選取 [計數] 個區塊,不包括「(」和「)」(請參閱
[()。如果游標不在 () 區塊內,則尋找下一個「(」。選取像「()」這樣的空內部區塊會產生錯誤。
cpo-M 選項旗標用於處理跳脫的括號。在可視模式中使用時,會變成字元模式。
a>
v_a> v_a< a> a< a<「一個 <> 區塊」,從第 [計數] 個不匹配的「<」向後移動到匹配的「>」,選取 [計數] 個 <> 區塊,包括「<」和「>」。
cpo-M 選項旗標用於處理跳脫的「<」和「>」。在可視模式中使用時,會變成字元模式。
i>
v_i> v_i< i> i< i<「內部的 <> 區塊」,從第 [計數] 個不匹配的「<」向後移動到匹配的「>」,選取 [計數] 個 <> 區塊,不包括「<」和「>」。選取像「<>」這樣的空內部區塊會產生錯誤。
cpo-M 選項旗標用於處理跳脫的「<」和「>」。在可視模式中使用時,會變成字元模式。
v_at at at「一個標籤區塊」,從第 [計數] 個不匹配的「<aaa>」向後移動到匹配的「</aaa>」,選取 [計數] 個標籤區塊,包括「<aaa>」和「</aaa>」。請參閱
tag-blocks以了解詳細資訊。在可視模式中使用時,會變成字元模式。
v_it it it「內部的標籤區塊」,從第 [計數] 個不匹配的「<aaa>」向後移動到匹配的「</aaa>」,選取 [計數] 個標籤區塊,不包括「<aaa>」和「</aaa>」。請參閱
tag-blocks以了解詳細資訊。在可視模式中使用時,會變成字元模式。
a}
v_a} a} a{ a{
v_aB v_a{ aB aB「一個區塊」,從
[計數] [{
到匹配的「}」,選取 [計數] 個區塊,包括「{」和「}」(請參閱
[{)。
cpo-M 選項旗標用於處理跳脫的大括號。在可視模式中使用時,會變成字元模式。
i}
v_i} i} i{ i{
v_iB v_i{ iB iB「內部的區塊」,從
[計數] [{
到匹配的「}」,選取 [計數] 個區塊,不包括「{」和「}」(請參閱
[{)。選取像「{}」這樣的空內部區塊會產生錯誤。
cpo-M 選項旗標用於處理跳脫的大括號。在可視模式中使用時,會變成字元模式。
a"
v_aquote aquote a'
v_a' a' a`
v_a` a` "一個引號字串"。選取從前一個引號到下一個引號之間的文字。
'quoteescape' 選項用於跳過跳脫引號。僅在同一行內有效。當游標起始於引號時,Vim 會從行首開始搜尋,以找出構成字串的引號對。會包含任何尾隨的空白字元,除非沒有,則會包含前導的空白字元。在可視模式中使用時,會設為字元方式。在可視模式中重複此物件,會包含另一個字串。目前不使用計數。
o_object-select 在運算子後使用時:對於非區塊物件:對於 "a" 指令:運算子會套用至物件以及物件後的空白字元。如果物件後沒有空白字元,或者當游標位於物件前的空白字元中時,則會包含物件前的空白字元。對於「內部」指令:如果游標位於物件上,則運算子會套用至物件。如果游標位於空白字元上,則運算子會套用至空白字元。對於區塊物件:運算子會套用至游標所在的區塊,或者游標位於其中一個大括號上的區塊。對於「內部」指令,會排除周圍的大括號。對於 "a" 指令,會包含大括號。
v_object-select 在可視模式中使用時:當可視區域的開始和結束相同時(剛輸入 "v" 之後):會選取一個物件,與使用運算子時相同。當可視區域的開始和結束不同時:對於非區塊物件,區域會擴展一個物件或空白字元,直到下一個物件,或者對於 "a" 物件,則兩者都會擴展。這種擴展發生的方向取決於游標位於可視區域的哪一側。對於區塊物件,區塊會向外擴展一層。
為了說明,以下列出刪除命令,並按從小到大的物件分組。請注意,對於單一字元和整行,會使用現有的 vi 移動命令。"dl" 刪除字元(別名:"x")
dl "diw" 刪除內部單字
diw"daw" 刪除一個單字
daw"diW" 刪除內部 WORD(請參閱
WORD)
diW"daW" 刪除一個 WORD(請參閱
WORD)
daW"dgn" 刪除下一個搜尋模式匹配項
dgn "dd" 刪除一行
dd "dis" 刪除內部句子
dis"das" 刪除一個句子
das"dib" 刪除內部 '(' ')' 區塊
dib"dab" 刪除一個 '(' ')' 區塊
dab"dip" 刪除內部段落
dip"dap" 刪除一個段落
dap"diB" 刪除內部 '{' '}' 區塊
diB"daB" 刪除一個 '{' '}' 區塊
daB
請注意使用移動命令和物件之間的區別。移動命令從這裡(游標位置)操作到移動帶我們去的位置。當使用物件時,會對整個物件執行操作,無論游標位於物件的哪個位置。例如,比較 "dw" 和 "daw":"dw" 從游標位置刪除到下一個單字的開頭,"daw" 刪除游標下的單字以及它之後或之前的空格。
對於 "it" 和 "at" 文字物件,會嘗試選取 HTML 和 XML 的匹配標籤之間的區塊。但由於它們並非完全相容,因此有一些限制。
正常的方法是選取 <tag>
直到匹配的 </tag>。對於 "at",會包含標籤,對於 "it",則會排除標籤。但當重複 "it" 時,會包含標籤(否則不會有任何變更)。此外,在沒有內容的標籤區塊上使用 "it" 會選取前導標籤。
會跳過 "<aaa/>" 項。會忽略大小寫,對於大小寫很重要的 XML 也是如此。
在 HTML 中,可以有像 <br>
或 <meta ...> 這樣沒有匹配結束標籤的標籤。這些標籤會被忽略。
文字物件對於錯誤具有容錯性。多餘的結束標籤會被忽略。
跳到標記可以透過兩種方式完成:1. 使用 ` (反引號):游標會定位在指定位置,且移動是
獨佔的。2. 使用 ' (單引號):游標會定位在指定位置的行中的第一個非空白字元,且移動是行方式的。
mark-view3. 除了上述情況外,如果
'jumpoptions' 包含 "view",它們也會嘗試還原標記檢視。這是當設定標記時,游標位置和視窗頂線(視窗中顯示的第一個緩衝區行)之間的行數。
m mark Mark m{a-zA-Z} 在游標位置設定標記
{a-zA-Z}
(不會移動游標,這不是移動指令)。
m' m` m' 或 m` 設定上一個內容標記。可以使用 "''" 或 "``" 命令跳至此標記(不會移動游標,這不是移動指令)。
m[ m] m[ 或 m] 設定
'[ 或
'] 標記。當要透過多個命令模擬運算子時很有用。(不會移動游標,這不是移動指令)。
m< m> m< 或 m> 設定
'< 或
'> 標記。對於更改
gv
命令選取的內容很有用。(不會移動游標,這不是移動指令)。請注意,無法設定可視模式,只能設定開始和結束位置。
:ma :mark E191 :[range]ma[rk]
{a-zA-Z'}
在 [range] 中最後一行的行號,第 0 欄設定標記
{a-zA-Z'}
。預設為游標行。
:k :[range]k{a-zA-Z'} 與 :mark 相同,但可以省略標記名稱前的空格。
' 'a ` `a '{a-z}{a-z} 跳到目前緩衝區中的標記 {a-z}。
'A '0 `A `0 '
{A-Z0-9}
{A-Z0-9} 跳到設定標記 {A-Z0-9} 的檔案中(當位於另一個檔案時,不是移動命令)。
g' g'a g` g`a g'{mark} g`{mark} 跳到
{mark}
,但在目前緩衝區中跳轉時,不會變更跳躍清單。範例
g`"
:marks :marks 列出所有目前標記(不是移動命令)。不列出
'(、
')、
'{ 和
'} 標記。第一欄的數字為零。
E283:marks
{arg}
列出
{arg}
中提到的標記(不是移動命令)。例如
:marks aB
列出標記 'a' 和 'B'。
:delm :delmarks :delm[arks]
{marks}
刪除指定的標記。可以刪除的標記包括 A-Z 和 0-9。您無法刪除 ' 標記。可以透過提供標記名稱清單,或使用以破折號分隔的範圍來指定它們。會忽略空格。範例
:delmarks a deletes mark a
:delmarks a b 1 deletes marks a, b and 1
:delmarks Aa deletes marks A and a
:delmarks p-z deletes marks in the range p to z
:delmarks ^.[] deletes marks ^ . [ ]
:delmarks \" deletes mark "
:delm[arks]! 刪除目前緩衝區的所有標記,但不包括標記 A-Z 或 0-9。也會清除
變更清單。
標記在任何方式都不可見。它只是記住的檔案中的一個位置。不要將標記與具名暫存器混淆,它們完全不相關。
'a - 'z 小寫標記,在一個檔案內有效 'A - 'Z 大寫標記,也稱為檔案標記,在檔案之間有效 '0 - '9 數字標記,從 .shada 檔案設定
只要檔案保留在緩衝區清單中,就會記住小寫標記 'a' 到 'z'。如果您從緩衝區清單中移除檔案,則其所有標記都會遺失。如果您刪除包含標記的行,則會刪除該標記。
小寫標記可以與運算子組合使用。例如:"d't" 會刪除從游標位置到標記 't' 的行。提示:使用標記 't' 代表頂部,'b' 代表底部等。在使用復原和重做時,會還原小寫標記。
大寫標記 'A' 到 'Z' 包含檔案名稱。您可以使用它們在檔案之間跳轉。只有當標記位於目前檔案中時,才能將大寫標記與運算子一起使用。即使您插入/刪除行或暫時編輯另一個檔案,標記的行號仍然正確。當
'shada' 選項不為空時,會將大寫標記保留在 .shada 檔案中。請參閱
shada-file-marks。
'[ `[ '[[ 跳到先前變更或複製文字的第一個字元。
'] `] ']] 到先前變更或複製文字的最後一個字元。
執行運算子後,游標會置於操作文字的開頭。執行貼上命令("p" 或 "P")後,游標有時會置於第一個插入的行,有時則置於最後一個插入的字元。上述四個命令會將游標置於任一端。範例:複製 10 行後,您想要跳到最後一行,則輸入 "10Y']"。使用 "p" 命令插入數行後,您想要跳到最後插入的行,則輸入 "p']"。這也適用於已插入的文字。
注意:刪除文字後,起始和結束位置相同,除非使用區塊式可視模式。如果目前檔案尚未進行任何變更,則這些命令無效。
'< `< '<< 到目前緩衝區中最後選取的可視區域的第一行或字元。對於區塊模式,它也可能是第一行中的最後一個字元(以便定義區塊)。
'> `> '>> 到目前緩衝區中最後選取的可視區域的最後一行或字元。對於區塊模式,它也可能是最後一行的第一個字元(以便定義區塊)。請注意,
'selection' 會生效,該位置可能剛好在可視區域之後。
'. `. '.. 到上次變更的位置。該位置位於或靠近變更開始的位置。有時一個命令會以數個變更執行,則該位置可能靠近命令變更內容的結尾。例如,當插入一個單字時,該位置將位於最後一個字元上。要跳到較舊的變更,請使用
g;。
'( `( '(( 到目前句子的開頭,如同 |(| 命令。
') `) ')) 到目前句子的結尾,如同 |)| 命令。
'{ `{ '{{ 到目前段落的開頭,如同 |{| 命令。
'} `} '}} 到目前段落的結尾,如同 |}| 命令。
這些命令本身不是標記,而是跳到標記
]' ]' [count] 次到游標下方具有小寫標記的下一行,位於該行的第一個非空白字元。
]` ]` [count] 次到游標後面的小寫標記。
[' [' [count] 次到游標前面具有小寫標記的前一行,位於該行的第一個非空白字元。
[` [` [count] 次到游標前面的小寫標記。
:loc[kmarks]
{command}
:loc :lock :lockmarks 執行
{command}
而不調整標記。當以變更文字的方式完成變更後,行數將相同時,此功能很有用。
警告:當行數確實變更時,變更下方的標記將保留其行號,因此會移動到另一行文字。這些項目不會針對刪除/插入的行進行調整
小寫字母標記 'a - 'z
大寫字母標記 'A - 'Z
編號標記 '0 - '9
上次插入位置 '^
上次變更位置 '.
上次受影響的文字區域 '[ 和 ']
可視區域 '< 和 '
- line numbers in placed signs
- line numbers in quickfix positions
- positions in the |jumplist|
- positions in the |tagstack|
These items will still be adjusted:
- previous context mark ''
- the cursor position
- the view of a window on a buffer
- folds
- diffs
:kee[pmarks]
{command}
:kee :keep :keepmarks 目前僅對篩選命令
:range! 有效
當篩選後的行數等於或大於篩選前時,所有標記都會保留在相同的行號上。
當行數減少時,已消失的行中的標記會被刪除。在任何情況下,篩選文字下方的標記都會調整其行號,因此會像平常一樣貼在文字上。當
'cpoptions' 中缺少 'R' 旗標時,其效果與使用 ":keepmarks" 相同。
:keepj :keepjumps :keepj[umps]
{command}
在
{command}
中移動不會變更
''、
'. 和
'^ 標記、
jumplist 或
changelist。當自動進行變更或插入文字,而使用者不想要前往此位置時很有用。例如,在第一行更新「上次變更」時間戳記時
:let lnum = line(".")
:keepjumps normal gg
:call SetLastChange()
:keepjumps exe "normal " .. lnum .. "G"
請注意,":keepjumps" 必須用於每個命令。當調用函式時,該函式中的命令仍會變更 jumplist。此外,對於 :keepjumps exe 'command '
,"command" 不會保留跳躍。請改用::exe 'keepjumps command'
「跳躍」是一個通常會將游標移動數行的命令。如果您讓游標「跳躍」,則會記住跳躍前游標的位置。您可以使用 "''" 和 "``" 命令返回該位置,除非包含該位置的行已變更或刪除。以下命令是「跳躍」命令:"'"、"`"、"G"、"/"、"?"、"n"、"N"、"%"、"("、")"、"[["、"]]"、"{"、"}"、":s"、":tag"、"L"、"M"、"H" 以及開始編輯新檔案的命令。
CTRL-O CTRL-O 跳至跳躍清單中較舊的 [count] 個游標位置(不是移動命令)。
<Tab>
或
CTRL-I <Tab> CTRL-I 跳至跳躍清單中較新的 [count] 個游標位置(不是移動命令)。
jumplist 跳躍會記錄在跳躍清單中。使用
CTRL-O
和
CTRL-I
命令,您可以前往較舊跳躍之前的游標位置,然後再返回。因此,您可以在清單中向上和向下移動。每個視窗都有一個單獨的跳躍清單。最大項目數固定為 100。
例如,在三個跳躍命令之後,您有這個跳躍清單
jump line col file/text
3 1 0 some text
2 70 0 another line
1 1154 23 end.
>
「檔案/文字」欄會顯示檔案名稱,或如果跳躍位於目前檔案中,則顯示跳躍處的文字(會移除縮排,並且會截斷長行以符合視窗)。
您目前位於第 1167 行。如果您然後使用
CTRL-O
命令,則游標會置於第 1154 行。這會導致
jump line col file/text
2 1 0 some text
1 70 0 another line
> 0 1154 23 end.
1 1167 0 foo bar
指標將設定在最後使用的跳躍位置。下一個 CTRL-O
命令將使用它上面的項目,下一個 CTRL-I
命令將使用它下面的項目。如果指標在最後一個項目下方,則表示您之前未使用 CTRL-I
或 CTRL-O
。在這種情況下,CTRL-O
命令會導致游標位置新增至跳躍清單,因此您可以返回 CTRL-O
之前的位置。在這種情況下,這是第 1167 行。
使用更多 CTRL-O
命令,您將前往第 70 行和第 1 行。如果您使用 CTRL-I
,您可以再次返回到第 1154 行和第 1167 行。請注意,「跳躍」欄中的數字表示 CTRL-O
或 CTRL-I
命令將您帶到此位置的次數。
如果您使用跳躍命令,則目前的行號會插入到跳躍清單的結尾。如果相同的行已經在跳躍清單中,則會將其移除。結果是當重複 CTRL-O
時,您只會返回舊位置一次。
當使用
:keepjumps 命令修飾符時,跳躍點不會儲存在跳躍列表中。在其他情況下,例如在
:global 命令中,跳躍點也不會儲存。您可以透過使用 "m'" 設定 ' 標記來明確地加入跳躍點。請注意,呼叫 setpos() 並不會執行此操作。
在執行
CTRL-O
命令進入第 1154 行後,您可以發出另一個跳躍命令(例如 "G")。跳躍列表會變成:
jump line col file/text
4 1 0 some text
3 70 0 another line
2 1167 0 foo bar
1 1154 23 end.
>
行號會根據刪除和插入的行進行調整。如果您在沒有寫入的情況下停止編輯檔案,例如使用 ":n!",則此調整會失敗。
當您分割視窗時,跳躍列表將會複製到新的視窗。
如果您在
'shada' 選項中包含了 ' 項目,跳躍列表將會儲存在 ShaDa 檔案中,並在啟動 Vim 時還原。
跳躍列表堆疊 當
'jumpoptions' 選項包含 "stack" 時,跳躍列表的行為會像標籤堆疊。當從跳躍列表的中間跳到新的位置時,目前位置之後的位置將會被捨棄。設定此選項後,您可以在跳躍位置的樹狀結構中移動。當向上移動到一個分支,然後向下移動到另一個分支時,
CTRL-O
仍然會將您帶到樹狀結構中更上方的位置。
假設跳躍列表如下,其中
CTRL-O
已被使用三次以移回位置 X
jump line col file/text
2 1260 8 mark.c <-- location X-2
1 685 0 eval.c <-- location X-1
> 0 462 36 eval.c <-- location X
1 479 39 eval.c
2 213 2 mark.c
3 181 0 mark.c
跳到(新的)位置 Y 會導致目前位置之後的位置被移除
jump line col file/text
3 1260 8 mark.c <-- location X-2
2 685 0 eval.c <-- location X-1
1 462 36 eval.c <-- location X
>
然後,當跳到另一個位置 Z 時,新的位置 Y 會直接出現在跳躍列表中的位置 X 之後,而位置 X 相對於在從 X 跳到 Y 之前的位置(X-1、X-2 等等)保持在相同的位置。
jump line col file/text
4 1260 8 mark.c <-- location X-2
3 685 0 eval.c <-- location X-1
2 462 36 eval.c <-- location X
1 100 0 buffer.c <-- location Y
>
當進行變更時,會記住游標位置。每個可以復原的變更都會記住一個位置,除非它靠近先前的變更。有兩個命令可以用來跳到變更的位置,包括那些已經復原的變更。
g; E662 g; 跳到變更列表中較舊的 [count] 個位置。如果 [count] 大於較舊變更位置的數量,則跳到最舊的變更。如果沒有較舊的變更,則會顯示錯誤訊息。(不是移動命令)
g, E663 g, 跳到變更列表中較新的 [count] 個位置。就像
g; 一樣,但方向相反。(不是移動命令)
當使用計數時,您會盡可能往回或往前跳躍。因此,您可以使用 "999g;" 跳到第一個仍然記住位置的變更。變更列表中條目的數量是固定的,與
跳躍列表 的數量相同。
當兩個可復原的變更在同一行且欄位位置之間的距離小於
'textwidth' 時,只會記住最後一個。這樣可以避免在一行中進行的一系列小變更(例如 "xxxxx")向變更列表添加許多位置。當
'textwidth' 為零時,會使用
'wrapmargin'。如果該選項也未設定,則會使用固定的數字 79。詳細資訊:為了計算速度,會使用位元組而非字元,以避免速度損失(這僅對於多位元組編碼很重要)。
請注意,當文字已被插入或刪除時,游標位置可能與變更的位置略有不同。特別是當行已被刪除時。
當使用 :keepjumps
命令修飾符時,不會記住變更的位置。
:changes :changes 列印變更列表。">" 字元表示目前位置。剛進行變更後,它會在最新條目下方,表示
g;
會將您帶到最新條目的位置。第一欄表示將您帶到此位置所需的計數。範例
變更 行 欄 文字
3 9 8 bla bla bla 2 11 57 foo is a bar 1 14 54 the latest changed line
The `3g;` command takes you to line 9. Then the
output of `:changes` is:
change line col text ~
> 0 9 8 bla bla bla
1 11 57 foo is a bar
2 14 54 the latest changed line
Now you can use "g," to go to line 11 and "2g," to go
to line 14.
% % 在此行中尋找游標之後或下方的下一個項目,並跳到其匹配項。
包含 移動。項目可以是:([{}]) 括號或(大/方)括號(可以使用
'matchpairs' 選項變更)
/* */
C 風格註解的開始或結束 #if、#ifdef、#else、#elif、#endif C 預處理器條件(當游標在 # 上或後面沒有 ([{ 時)對於其他項目,可以使用 matchit 外掛程式,請參閱 matchit。此外掛程式也有助於跳過註解中的匹配項。
當
'cpoptions' 包含 "M"
cpo-M 時,會忽略括號和大括號之前的反斜線。沒有 "M" 時,反斜線的數量很重要:偶數個與奇數個不匹配。因此,在 "( \) )" 和 "\( ( \)" 中,第一個和最後一個括號匹配。
當 '%' 字元不存在於
'cpoptions' cpo-% 時,會忽略雙引號內的括號和大括號,除非一行中的括號/大括號數量不平均,且此行和前一行未以反斜線結尾。也會忽略 '('、'{'、'['、']'、'}' 和 ')'(單引號內的括號和大括號)。請注意,這對於 C 來說運作良好,但不適用於 Perl,其中單引號用於字串。
不會對註解中的匹配項進行特殊處理。您可以使用 thematchit 外掛程式,或在匹配項周圍加上引號。
不允許計數,
{count}
% 會跳到檔案中
{count}
百分比的行
N%。在 #if/#else/#endif 上使用 '%' 會使移動變成行方式。
[( [( 跳到 [count] 個先前未匹配的 '('。
獨佔 移動。
[{ [{ 跳到 [count] 個先前未匹配的 '{'。
獨佔 移動。
]) ]) 跳到 [count] 個下一個未匹配的 ')'。
獨佔 移動。
]} ]} 跳到 [count] 個下一個未匹配的 '}'。
獨佔 移動。
以上四個命令可用於跳到目前程式碼區塊的開始或結束。這就像在程式碼區塊另一端的 "("、")"、"{" 或 "}" 上執行 "%" 一樣,但您可以從程式碼區塊中的任何位置執行此操作。對於 C 程式非常有用。範例:當停在 "case x:" 上時,[{
會將您帶回 switch 敘述。
]m ]m 跳到 [count] 個下一個方法的開始(對於 Java 或類似的結構化語言)。當不在方法開始之前時,跳到類別的開始或結束。
獨佔 移動。
]M]M 跳到 [count] 個下一個方法的結束(對於 Java 或類似的結構化語言)。當不在方法結束之前時,跳到類別的開始或結束。
獨佔 移動。
[m[m 跳到 [count] 個先前方法的開始(對於 Java 或類似的結構化語言)。當不在方法開始之後時,跳到類別的開始或結束。如果在游標之前找不到 '{',則會發生錯誤。
獨佔 移動。
[M[M 跳到 [count] 個先前方法的結束(對於 Java 或類似的結構化語言)。當不在方法結束之後時,跳到類別的開始或結束。如果在游標之前找不到 '}',則會發生錯誤。
獨佔 移動。
以上兩個命令假設檔案包含帶有方法的類別。類別定義以 '{' 和 '}' 包圍。類別中的每個方法也以 '{' 和 '}' 包圍。這適用於 Java 語言。檔案如下所示
// comment
class foo {
int method_one() {
body_one();
}
int method_two() {
body_two();
}
}
[要嘗試此操作,請複製文字並將其放入新的緩衝區,上面的說明文字會混淆跳躍命令]
從游標位於 "body_two()" 開始,使用 "[m" 會跳到 "method_two()" 開始的 '{'(顯然,當方法很長時,這會更有用!)。使用 "2[m" 會跳到 "method_one()" 的開始。使用 "3[m" 會跳到類別的開始。
[# [# 跳到 [count] 個先前未匹配的 "#if" 或 "#else"。
獨佔 移動。
]# ]# 跳到 [count] 個下一個未匹配的 "#else" 或 "#endif"。
獨佔 移動。
這兩個命令適用於包含 #if/#else/#endif 結構的 C 程式。它會將您帶到目前行包含的 #if/#else/#endif 的開始或結束。然後,您可以使用 "%" 跳到匹配的行。
[star [/ [* 或 [/ 跳到 [count] 個先前 C 註解 "/*" 的開始。
獨佔 移動。
]star ]/ ]* 或 ]/ 跳到 [count] 個下一個 C 註解 "*/" 的結束。
獨佔 移動。
H H 跳到視窗頂部(首頁)的 [count] 行(預設值:視窗中的第一行)的第一個非空白字元
行方式。另請參閱
'startofline' 選項。游標會根據
'scrolloff' 選項進行調整,除非有操作符正在等待,在這種情況下,文字可能會捲動。例如,"yH" 會從第一個可見行複製到游標行(包含)。
L L 跳到視窗底部的 [count] 行(預設值:視窗中的最後一行),位於第一個非空白字元
行方式。另請參閱
'startofline' 選項。游標會根據
'scrolloff' 選項進行調整,除非有操作符正在等待,在這種情況下,文字可能會捲動。例如,"yL" 會從游標複製到最後一個可見行。
<LeftMouse>
移動到螢幕上滑鼠點擊的位置
獨佔。另請參閱
<LeftMouse>。如果位置位於狀態列中,則該視窗會成為活動視窗,且游標不會移動。