移动

Nvim :help 页面,生成 使用 tree-sitter-vimdoc 解析器。


光标移动 导航
这些命令移动光标位置。如果新位置超出屏幕,屏幕将滚动以显示光标(另请参见 'scrolljump''scrolloff' 选项)。
一般说明
如果您想知道自己在文件中的位置,请使用“CTRL-G”命令 CTRL-G 或“g CTRL-G”命令 g_CTRL-G。如果设置了 'ruler' 选项,则光标位置会不断显示在状态栏中(这会稍微减慢 Vim 的速度)。
有经验的用户更喜欢 hjkl 键,因为它们始终位于手指下方。初学者通常更喜欢箭头键,因为他们不知道 hjkl 键的作用。hjkl 的助记符值从键盘上看就很清楚。将 j 想象成一个指向下方的箭头。
可以设置 'virtualedit' 选项以使光标可以移动到没有字符的位置或多列字符(例如制表符)中。

1. 移动和操作符 操作符

移动命令可以在操作符命令之后使用,使命令作用于移动到的文本。也就是说,操作符通常用于删除或更改文本。以下操作符可用
c c 更改 d d 删除 y y 粘贴到寄存器(不更改文本) ~ ~ 交换大小写(仅当 'tildeop' 设置时) g~ g~ 交换大小写 gu gu 转为小写 gU gU 转为大写 ! ! 通过外部程序过滤 = = 通过 'equalprg' 过滤或 C 缩进(如果为空) gq gq 文本格式化 gw gw 文本格式化,无光标移动 g? g? ROT13 编码 > > 右移 < < 左移 zf zf 定义折叠 g@ g@ 使用 'operatorfunc' 选项调用函数集 移动计数乘积
如果移动包含计数,并且操作符之前也有计数,则这两个计数相乘。例如:“2d3w”删除六个单词。 操作符加倍
对操作符加倍时,它作用于一行。在使用计数时,在第一个字符之前或之后,将作用于这么多行。因此 3dd 删除三行。第一个字符之前和之后的计数相乘,因此 2y3y 粘贴六行。 操作符最终位置
应用操作符后,光标大多保留在操作文本的开头。例如,“yfe”不会移动光标,但“yFe”会将光标向左移动到“e”,即粘贴的开始位置。 'startofline' 选项仅适用于“d”、“<<”,“==”和“>>”行操作。
行操作 字符操作 字符操作 操作符要么影响整行,要么影响起始位置和结束位置之间的字符。通常,在行之间移动的移动影响行(是行操作),而在一行内移动的移动影响字符(是字符操作)。但是,有一些例外。
独占 包含 字符移动要么包含,要么独占。包含时,移动的起始位置和结束位置都包含在操作中。独占时,不包含缓冲区末端的最后一个字符。行操作始终包含起始位置和结束位置。插件可以检查 TextYankPost 事件的 v:event.inclusive 标志。
哪些移动是行操作、包含或独占,将在命令中提及。但是,有两个一般例外:1. 如果移动是独占的,并且移动的结束位置在第 1 列,则移动的结束位置将移动到前一行的末尾,并且移动将变为包含。例如:“}”移动到段落后的第一行,但“d}”将不包括该行。 独占行操作
2. 如果移动是独占的,并且移动的结束位置在第 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 在操作符之后、移动命令之前使用时:强制操作符块操作。这就像可视块模式选择,角落由移动之前和之后的鼠标位置定义。

2. 左右移动 左右移动

这些命令将光标移动到当前行的指定列。它们在第一列和行尾停止,除了“$”,它可能移动到下一行之一。参见 'whichwrap' 选项以调整一些命令跨行边界移动的行为。
h 或 h
<Left><Left>
CTRL-H 或 CTRL-H <BS> <BS> 向左移动 [计数] 个字符。 独占 移动。 注意:如果您更喜欢使用 <BS> 删除字符,请使用以下映射
:map CTRL-V<BS>                X
(要输入“CTRL-V<BS>”,请键入 CTRL-V 键,然后键入 <BS> 键)
l 或 l
<Right><Right> <Space> <Space> 向右移动 [计数] 个字符。 独占 移动。参见 'whichwrap' 选项,了解如何在行尾调整行为
0
0 移动到该行的第一个字符。 独占 移动。
<Home> <kHome> <Home> 移动到该行的第一个字符。 独占 移动。向上或向下移动时,保持在相同的 TEXT 列中(如果可能)。大多数其他命令保持在相同的 SCREEN 列中。 <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' 打开):移动到屏幕行的最后一个字符,向下移动 [计数 - 1] 个屏幕行 包含。当一行宽度超过屏幕时,与“$”不同。当行不换行时('wrap' 关闭):移动到屏幕上当前行最右边的字符。当该行的最后一个字符不在屏幕上或使用计数时,与“$”不同。此外,垂直移动会保留列,而不是移动到行尾。当 'virtualedit' 启用时,会移动到屏幕行的末尾。
g<End> g<kEnd> g<End> 类似于 g$,但移动到最后一个非空白字符,而不是最后一个字符。
bar
| 移动到当前行中的 [count] 列。 排他性 移动。Ceci n'est pas une pipe.
f
f{char} 移动到右侧第 [count] 个出现的 {char}。光标被放置在 {char} 上, 包含{char} 可以作为二元字形 digraph-arg 输入。当 'encoding' 设置为 Unicode 时,可以使用组合字符,参见 utf-8-char-arg:lmap 映射应用于 {char}。插入模式下的 CTRL-^ 命令可用于切换此功能的启用/禁用状态 i_CTRL-^
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-;

3. 上下移动 up-down-motions

k 或 k
<Up><Up> CTRL-P CTRL-P [count] 行向上移动, 按行
j 或 j
<Down><Down>
CTRL-J 或 CTRL-J
<NL><NL> CTRL-N CTRL-N [count] 行向下移动, 按行
gk 或 gk g<Up> g<Up> [count] 行向上移动,显示在屏幕上。 排他性 移动。当行换行时,以及与运算符一起使用时,与 'k' 不同,因为它不是按行移动的。
gj 或 gj g<Down> g<Down> [count] 行向下移动,显示在屏幕上。 排他性 移动。当行换行时,以及与运算符一起使用时,与 'j' 不同,因为它不是按行移动的。
-
- <minus> [count] 行向上移动,在第一个非空白字符上, 按行
++
CTRL-M 或 CTRL-M <CR> <CR> [count] 行向下移动,在第一个非空白字符上, 按行
_
_ <underscore> [count] - 1 行向下移动,在第一个非空白字符上, 按行
G
G 移动到第 [count] 行,默认是最后一行,在第一个非空白字符上, 按行。如果 'startofline' 未设置,则保持相同的列。G 是 跳转动作 之一。
<C-End>
<C-End> 移动到第 [count] 行,默认是最后一行,在最后一个字符上, 包含
<C-Home>gg <C-Home> gg 移动到第 [count] 行,默认是第一行,在第一个非空白字符上, 按行。如果 'startofline' 未设置,则保持相同的列。
:[range]
:[range] 将光标设置在 [range] 中的最后一个行号上。在 Ex 模式下,打印 [range] 中的行。[range] 也可以只是一个行号,例如 “:1” 或 “:'m”。与 G 相反,此命令不会修改 跳转列表N%
{count}% 移动到文件中的 {count} 百分比,在该行中的第一个非空白字符上, 按行。为了计算新的行号,使用以下公式: ({count} * 行数 + 99) / 100 另见 'startofline' 选项。
:[range]go[to] [count] :go :goto go [count]go 移动到缓冲区中的第 [count] 个字节。 排他性 移动。默认情况下 [count] 为 1,即文件开头。当给出 [range] 时,使用其中的最后一个数字作为字节计数。行尾字符的计数取决于当前的 'fileformat' 设置。另见 line2byte() 函数,以及 'statusline' 中的 'o' 选项。
这些命令移动到指定行。它们在到达第一行或最后一行时停止。前两个命令将光标放置在与最后一个更改列的命令相同的列中(如果可能),除了在 “$” 命令之后,此时光标将被放置在该行的最后一个字符上。

4. 单词移动 word-motions

<S-Right><S-Right> w w [count] 个单词向前移动。 排他性 移动。
<C-Right><C-Right> W W [count] 个单词向前移动。 排他性 移动。
e
e 向前移动到第 [count] 个单词的结尾, 包含。它不会停留在空行中。
E
E 向前移动到第 [count] 个单词的结尾, 包含。它不会停留在空行中。
<S-Left><S-Left> b b [count] 个单词向后移动。 排他性 移动。
<C-Left><C-Left> B B [count] 个单词向后移动。 排他性 移动。
ge
ge 向后移动到第 [count] 个单词的结尾, 包含
gE
gE 向后移动到第 [count] 个单词的结尾, 包含
这些命令在单词或单词之间移动。 word
一个单词由字母、数字和下划线的序列组成,或者由其他非空白字符的序列组成,它们之间用空格(空格、制表符、<EOL>)隔开。这可以通过 'iskeyword' 选项来更改。空行也被视为一个单词。 WORD
一个单词由非空白字符的序列组成,它们之间用空格隔开。空行也被视为一个单词。
折叠行的序列被计为一个字符的单词。“w” 和 “W”,“e” 和 “E” 移动到折叠行范围后的第一个单词或单词的开头/结尾。“b” 和 “B” 移动到折叠前的第一个单词或单词的开头。
特殊情况:“cw” 和 “cW” 如果光标位于非空白字符上,则被视为 “ce” 和 “cE”。这是与 Vi 兼容的,参见 cpo-_ 以更改行为。
另一个特殊情况:当将 “w” 移动与运算符结合使用并且最后一个移动过的单词位于行的结尾时,该单词的结尾将成为操作文本的结尾,而不是下一行的第一个单词。
“e” 的原始 Vi 实现存在错误。例如,如果前一行为空,则 “e” 命令将在该行的第一个字符上停止。但是,当使用 “2e” 时,这种情况不会发生。在 Vim 中,“ee” 和 “2e” 是相同的,这更有逻辑性。但是,这会导致 Vi 和 Vim 之间的一点不兼容。

5. 文本对象移动 object-motions

(
( [count] 个 句子 向后移动。 排他性 移动。
)
) [count] 个 句子 向前移动。 排他性 移动。
{
{ [count] 个 段落 向后移动。 排他性 移动。
}
} [count] 个 段落 向前移动。 排他性 移动。
]]
]] [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>
[按字面意思输入,请参见 <>]

6. 文本对象选择 object-select text-objects

v_a v_i
这是一系列命令,只能在 Visual 模式下或操作符之后使用。以“a”开头的命令选择包括空格的“a”n 对象,以“i”开头的命令选择不包括空格的“inner”对象,或者只选择空格。因此,“inner”命令总是选择比“a”命令更少的文本。
另请参见 gngN,它们作用于最后一个搜索模式。
v_aw aw aw “a word”,选择 [count] 个词语(请参见 word)。开头或结尾的空格包含在内,但不计入。在 Visual 行模式下使用时,“aw”会切换到 Visual 字符模式。
v_iw iw iw “inner word”,选择 [count] 个词语(请参见 word)。词语之间的空格也会计入。在 Visual 行模式下使用时,“iw”会切换到 Visual 字符模式。
v_aW aW aW “a WORD”,选择 [count] 个 WORD(请参见 WORD)。开头或结尾的空格包含在内,但不计入。在 Visual 行模式下使用时,“aW”会切换到 Visual 字符模式。
v_iW iW iW “inner WORD”,选择 [count] 个 WORD(请参见 WORD)。词语之间的空格也会计入。在 Visual 行模式下使用时,“iW”会切换到 Visual 字符模式。
v_as as as “a sentence”,选择 [count] 个句子(请参见 sentence)。在 Visual 模式下使用时,它会变为字符模式。
v_is is is “inner sentence”,选择 [count] 个句子(请参见 sentence)。在 Visual 模式下使用时,它会变为字符模式。
v_ap ap ap “a paragraph”,选择 [count] 个段落(请参见 paragraph)。例外情况:空白行(只包含空格)也是段落边界。在 Visual 模式下使用时,它会变为行模式。
v_ip ip ip “inner paragraph”,选择 [count] 个段落(请参见 paragraph)。例外情况:空白行(只包含空格)也是段落边界。在 Visual 模式下使用时,它会变为行模式。
a] v_a] v_a[ a] a[ a[ “a [] block”,选择 [count] 个 '[' ']' 块。这会向后移动到 [count] 个未关闭的 '[',并找到匹配的 ']'。包含的文本会被选中,包括 '[' 和 ']'。 cpo-M 选项标志用于处理转义方括号。在 Visual 模式下使用时,它会变为字符模式。
i] v_i] v_i[ i] i[ i[ “inner [] block”,选择 [count] 个 '[' ']' 块。这会向后移动到 [count] 个未关闭的 '[',并找到匹配的 ']'。包含的文本会被选中,不包括 '[' 和 ']'。选择像“[]”这样的空内部块是错误的。 cpo-M 选项标志用于处理转义方括号。在 Visual 模式下使用时,它会变为字符模式。
a) v_a) a) a( a( vab v_ab v_a( ab ab “a block”,选择 [count] 个块,从“[count] [(" 到匹配的 ')’,包括 '(' 和 ')'(请参见 [()。不包括括号外部的空格。 cpo-M 选项标志用于处理转义括号。在 Visual 模式下使用时,它会变为字符模式。
i) v_i) i) i( i( vib v_ib v_i( ib ib “inner block”,选择 [count] 个块,从“[count] [(" 到匹配的 ')’,不包括 '(' 和 ')'(请参见 [()。如果光标不在 () 块中,则查找下一个“("。选择像“()”这样的空内部块是错误的。 cpo-M 选项标志用于处理转义括号。在 Visual 模式下使用时,它会变为字符模式。
a> v_a> v_a< a> a< a< “a <> block”,选择 [count] 个 <> 块,从第 [count] 个不匹配的 '<' 向后移动到匹配的 '>',包括 '<' 和 '>'。 cpo-M 选项标志用于处理转义 '<' 和 '>'。在 Visual 模式下使用时,它会变为字符模式。
i> v_i> v_i< i> i< i< “inner <> block”,选择 [count] 个 <> 块,从第 [count] 个不匹配的 '<' 向后移动到匹配的 '>',不包括 '<' 和 '>'。选择像 "<>" 这样的空内部块是错误的。 cpo-M 选项标志用于处理转义 '<' 和 '>'。在 Visual 模式下使用时,它会变为字符模式。
v_at at at “a tag block”,选择 [count] 个标记块,从第 [count] 个不匹配的 "<aaa>" 向后移动到匹配的 "</aaa>",包括 "<aaa>" 和 "</aaa>"。请参见 tag-blocks 以了解详细信息。在 Visual 模式下使用时,它会变为字符模式。
v_it it it “inner tag block”,选择 [count] 个标记块,从第 [count] 个不匹配的 "<aaa>" 向后移动到匹配的 "</aaa>",不包括 "<aaa>" 和 "</aaa>"。请参见 tag-blocks 以了解详细信息。在 Visual 模式下使用时,它会变为字符模式。
a} v_a} a} a{ a{ v_aB v_a{ aB aB “a Block”,选择 [count] 个块,从 [count] [{ 到匹配的 "}",包括 "{" 和 "}"(请参见 [{)。 cpo-M 选项标志用于处理转义大括号。在 Visual 模式下使用时,它会变为字符模式。
i} v_i} i} i{ i{ v_iB v_i{ iB iB “inner Block”,选择 [count] 个块,从 [count] [{ 到匹配的 "}",不包括 "{" 和 "}"(请参见 [{)。选择像 "{}" 这样的空内部块是错误的。 cpo-M 选项标志用于处理转义大括号。在 Visual 模式下使用时,它会变为字符模式。
a" v_aquote aquote a' v_a' a' a` v_a` a` “a quoted string”。从前一个引号选择文本,直到下一个引号。 'quoteescape' 选项用于跳过转义引号。仅在单行内有效。如果光标位于引号上,Vim 会通过从行首开始搜索来找出哪些引号对构成一个字符串。任何尾随空格都包含在内,除非没有尾随空格,则包含开头空格。在 Visual 模式下使用时,它会变为字符模式。在 Visual 模式下重复此对象将包括另一个字符串。目前不使用计数。
i" v_iquote iquote i' v_i' i' i` v_i` i` 与 a"、a' 和 a` 类似,但不包括引号,并且重复不会扩展 Visual 选择。特殊情况:计数为 2 时,将包含引号,但不会像 a"/a'/a` 那样包含额外的空格。
o_object-select
在操作符之后使用时:对于非块对象:对于“a”命令:操作符应用于对象和对象后面的空格。如果对象后面没有空格,或者光标之前位于对象的空格中,则包括对象前面的空格。对于“inner”命令:如果光标位于对象上,则操作符应用于对象。如果光标位于空格上,则操作符应用于空格。对于块对象:操作符应用于光标所在的块,或者光标位于其中一个大括号上的块。对于“inner”命令,会排除周围的大括号。对于“a”命令,会包括大括号。
v_object-select
在 Visual 模式下使用时:当 Visual 区域的开始和结束相同(在输入“v”之后)时:选择一个对象,与使用操作符相同。当 Visual 区域的开始和结束不同时:对于非块对象,该区域会扩展一个对象或直到下一个对象的空格,或者对于“a”对象,两者都会扩展。这发生的具体方向取决于光标位于 Visual 区域的哪一侧。对于块对象,块会向外扩展一个级别。
为了说明,这里列出了删除命令,按对象大小从小到大排列。请注意,对于单个字符和整行,使用现有的 vi 移动命令。“dl” 删除字符(别名:“x”) dl “diw” 删除内部词语 diw
"daw" 删除一个词语 daw
"diW" 删除内部 WORD(请参见 WORDdiW
"daW" 删除一个单词(参见 WORDdaW
"dgn" 删除下一个搜索模式匹配 dgn "dd" 删除一行 dd "dis" 删除内部句子 dis
"das" 删除一个句子 das
"dib" 删除内部 '(' ')' 块 dib
"dab" 删除一个 '(' ')' 块 dab
"dip" 删除内部段落 dip
"dap" 删除一个段落 dap
"diB" 删除内部 '{' '}' 块 diB
"daB" 删除一个 '{' '}' 块 daB
请注意使用移动命令和对象之间的区别。移动命令从这里(光标位置)到移动到的位置进行操作。使用对象时,无论光标在对象上的哪个位置,都会对整个对象进行操作。例如,比较 "dw" 和 "daw":"dw" 从光标位置删除到下一个单词的开头,"daw" 删除光标下的单词以及它之前或之后的空间。
标签块 tag-blocks
对于 "it" 和 "at" 文本对象,尝试选择 HTML 和 XML 中匹配标签之间的块。但由于它们并不完全兼容,所以有一些限制。
通常的方法是选择一个 <tag> 直到匹配的 </tag>。对于 "at",标签包含在内,对于 "it",标签被排除在外。但是,当 "it" 重复时,标签将被包含在内(否则什么也不会改变)。另外,"it" 用于没有内容的标签块将选择引导标签。
"<aaa/>" 项目被跳过。大小写被忽略,也适用于 XML,其中大小写很重要。
在 HTML 中,可以有一个标签,比如 <br> 或 <meta ...> 没有匹配的结束标签。这些会被忽略。
文本对象对错误很宽容。多余的结束标签会被忽略。

7. 标记 mark-motions E20 E78

跳到标记可以通过两种方式完成:1. 使用 (反引号):光标定位在指定位置,并且移动是 独占的。2. 使用 '(单引号):光标定位在指定位置行的第一个非空白字符上,并且移动是行式的。 mark-view
3. 除了以上,如果 '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 命令选择的内容。(不移动光标,这不是移动命令)。注意,不能设置 Visual 模式,只能设置开始和结束位置。
: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`"
跳到文件中的最后一个已知位置。另见 :keepjumps
: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
数字标记 '0 到 '9 非常不同。它们不能直接设置。它们只在使用 shada 文件 shada-file 时存在。基本上,'0 是你上次退出 Vim 时光标的位置,'1 是上上次,等等。在 'shada' 中使用 "r" 标志来指定不应存储任何数字标记的文件。见 shada-file-marks
'[ `[ '[[ 到之前更改或粘贴的文本的第一个字符。
'] `] ']] 到之前更改或粘贴的文本的最后一个字符。
执行操作符后,光标被放在所操作文本的开头。在执行粘贴命令("p" 或 "P")后,光标有时会被放在插入的第一行,有时会被放在插入的最后一个字符上。上面的四个命令将光标放在两端。示例:在粘贴 10 行后,你想去到它们中的最后一行:"10Y']"。在使用 "p" 命令插入几行后,你想跳到插入的最低一行:"p']"。这也适用于已经插入的文本。
注意:在删除文本后,开始和结束位置相同,除非使用块状 Visual 模式。当当前文件中还没有进行任何更改时,这些命令不起作用。
'< `< '<< 到当前缓冲区中最后一个选择的 Visual 区域的第一行或第一个字符。对于块模式,它也可能是第一行的最后一个字符(以便能够定义块)。
'> `> '>> 到当前缓冲区中最后一个选择的 Visual 区域的最后一行或最后一个字符。对于块模式,它也可能是最后行的第一个字符(以便能够定义块)。注意 'selection' 适用,位置可能就在 Visual 区域之后。
'' `` '' `` 到最新的跳跃之前的那个位置,或者上次给出 "m'" 或 "m`" 命令的位置。当使用 :keepjumps 命令修饰符时未设置。另见 restore-position
'quote `quote '"" 到上次退出当前缓冲区时的光标位置。默认值为第一行的第一个字符。见 last-position-jump,了解如何对每个打开的文件使用它。每个缓冲区只记住一个位置,而不是每个窗口一个。只要缓冲区在窗口中可见,位置就不会改变。当运行 :wshada 时,标记也会被重置。
'^ `^ '^^ 到上次停止插入模式时的光标位置。这由 gi 命令使用。当使用 :keepjumps 命令修饰符时未设置。
'. `. '.. 跳转到最后一次更改的位置。该位置位于或靠近更改开始的位置。有时命令会执行为多个更改,然后该位置可能位于命令更改内容的末尾附近。例如,在插入单词时,该位置将在最后一个字符上。要跳转到较旧的更改,请使用 g;
'( `( '(( 跳转到当前句子的开头,类似于 |(| 命令。
') `) ')) 跳转到当前句子的末尾,类似于 |)| 命令。
'{ `{ '{{ 跳转到当前段落的开头,类似于 |{| 命令。
'} `} '}} 跳转到当前段落的末尾,类似于 |}| 命令。
这些命令本身不是标记,而是跳转到一个标记
]'
]' [次数] 次跳转到光标下方下一行包含小写标记的行,该行位于该行的第一个非空白字符上。
]`
]` [次数] 次跳转到光标后包含小写标记的位置。
['
[' [次数] 次跳转到光标之前上一行包含小写标记的行,该行位于该行的第一个非空白字符上。
[`
[ [次数] 次跳转到光标之前包含小写标记的位置。
:loc[kmarks] {命令} :loc :lock :lockmarks 执行 {命令} 而不调整标记。这在以不会改变行数的方式更改文本时很有用。 警告:当行数发生变化时,更改下方的标记将保持其行号,因此将移动到另一行文本。这些项目不会针对删除/插入的行进行调整
小写字母标记 '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] {命令} :kee :keep :keepmarks 目前仅对 filter 命令 :range! 有效
当过滤后的行数等于或大于过滤前时的行数时,所有标记都将保留在相同的行号上。
当行数减少时,消失的行中的标记将被删除。无论如何,过滤文本下方的标记都会调整其行号,因此与文本保持一致,如往常一样。当 'cpoptions' 中缺少 'R' 标志时,这与使用 ":keepmarks" 的效果相同。
:keepj :keepjumps :keepj[umps] {命令}{命令} 中移动不会更改 '''.'^ 标记,跳转列表更改列表。在自动进行更改或插入文本时很有用,用户不想转到该位置。例如,在第一行更新“最后更改”时间戳时
:let lnum = line(".")
:keepjumps normal gg
:call SetLastChange()
:keepjumps exe "normal " .. lnum .. "G"
请注意,必须对每个命令使用 ":keepjumps"。在调用函数时,该函数中的命令仍然可以更改跳转列表。此外,对于 :keepjumps exe '命令 ',"命令" 不会保持跳转。相反,请使用::exe 'keepjumps 命令'

8. 跳转 jump-motions

“跳转”是一个通常将光标移动几行的命令。如果让光标“跳转”,则会记住跳转前光标的位置。您可以使用 "''" 和 "``" 命令返回该位置,除非包含该位置的行已更改或删除。以下命令是“跳转”命令:"'"、"`"、"G"、"/"、"?"、"n"、"N"、"%"、"("、")"、"[[ "、"]] "、"{ "、"}"、":s"、":tag"、"L"、"M"、"H" 以及开始编辑新文件的命令。
CTRL-O
CTRL-O 跳转到跳转列表中 [次数] 个较旧的光标位置(不是一个移动命令)。
<Tab>CTRL-I <Tab> CTRL-I 跳转到跳转列表中 [次数] 个较新的光标位置(不是一个移动命令)。
注意:在 GUI 和支持 tui-modifyOtherKeystui-csiu 的终端中,CTRL-I 可以与 <Tab> 分别映射,前提是两个键都被映射,否则映射适用于两者。除了 tmux:https://github.com/tmux/tmux/issues/2705
:ju :jumps :ju[mps] 打印跳转列表(不是一个移动命令)。
:cle :clearjumps :cle[arjumps] 清除当前窗口的跳转列表。
跳转列表
跳转存储在跳转列表中。使用 CTRL-OCTRL-I 命令,您可以跳转到较旧跳转之前的其他光标位置,并返回。因此,您可以上下移动列表。每个窗口都有一个单独的跳转列表。最大条目数固定为 100。
例如,在三个跳转命令后,您将拥有以下跳转列表
 jump line  col file/text
   3     1    0 some text
   2    70    0 another line
   1  1154   23 end.
>
“文件/文本”列显示文件名,或如果该跳转在当前文件中,则显示该跳转处的文本(将删除缩进,长行将被截断以适合窗口)。
标记“>”表示跳转列表中的当前位置。当使用 :filter 过滤 :jumps 命令时,它可能不会显示
您当前位于第 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-ICTRL-O。在这种情况下,CTRL-O 命令会导致将光标位置添加到跳转列表中,因此您可以返回到 CTRL-O 之前的那个位置。在这种情况下,这是第 1167 行。
使用更多 CTRL-O 命令,您将跳转到第 70 行和第 1 行。如果您使用 CTRL-I,您可以再次跳转到第 1154 行和第 1167 行。请注意,“跳转”列中的数字表示将您带到此位置的 CTRL-OCTRL-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-1、X-2 等,...)仍然保持相同位置,这些位置是在从 X 到 Y 的原始跳转之前。
 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
>

更改列表跳转 changelist change-list-jumps E664

进行更改时,会记住光标位置。每个可以撤销的更改都会记住一个位置,除非它与先前的更改非常接近。可以使用两个命令跳转到更改的位置,包括已被撤销的更改
g; E662 g; 跳转到更改列表中 [次数] 个较旧的位置。如果 [次数] 大于较旧更改位置的数目,则跳转到最旧的更改。如果没有较旧的更改,则会显示错误消息。(不是一个移动命令)
g, E663 g, 跳转到更改列表中 [次数] 个较新的位置。就像 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.

9. 各种移动 various-motions

%
% 查找光标后或光标下方的下一项,并跳转到其匹配项。 包含 运动。 项目可以是:([{}]) 括号或(花括号/方括号)括号(这可以通过 'matchpairs' 选项更改) /* */ C 样式注释的开头或结尾 #if、#ifdef、#else、#elif、#endif C 预处理器条件语句(当光标位于 # 上或后面没有 ([{ 时)对于其他项目,可以使用 matchit 插件,请参见 matchit。 此插件还有助于跳过注释中的匹配项。
'cpoptions' 包含 "M" cpo-M 时,括号和花括号之前的反斜杠将被忽略。 否则,反斜杠的数量很重要:偶数不会与奇数匹配。 因此,在 "( \) )" 和 "\( ( \)" 中,第一个和最后一个括号匹配。
'cpoptions' 中不存在 '%' 字符 cpo-% 时,双引号内的括号和花括号将被忽略,除非一行中括号/花括号的数量不均匀,并且此行和前一行不以反斜杠结尾。 '(', '{', '[', ']', '}' 和 ')' 也将被忽略(单引号内的括号和花括号)。 请注意,这对于 C 来说效果很好,但对于 Perl 来说效果不好,因为 Perl 使用单引号表示字符串。
注释中的匹配项没有特殊处理。 您可以使用 matchit 插件或在匹配项周围加上引号。
不允许计数,{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" 从第一行可见行到光标行(包含)进行 yank。
M
M 跳转到窗口的中间行,位于第一个非空白字符上 逐行。 另请参见 'startofline' 选项。
L
L 跳转到窗口底部(默认:窗口上的最后一行)的第 [count] 行,位于第一个非空白字符上 逐行。 另请参见 'startofline' 选项。 光标会根据 'scrolloff' 选项进行调整,除非操作符正在等待,在这种情况下,文本可能会滚动。 例如,"yL" 从光标到最后一行可见行进行 yank。
<LeftMouse> 移动到屏幕上鼠标点击的位置 排他。 另请参见 <LeftMouse>。 如果位置在状态行中,则该窗口将成为活动窗口,并且光标不会移动。
命令索引
快速参考