VIM 参考手册 by Bram Moolenaar
译者: Willis
光标移动 cursor-motions navigation
以下命令用于移动光标。如果新位置离开了当前显示范围,屏幕将自动滚动,确保光标可
见 (参见 'scrolljump' 和 'scrolloff' 选项)。
1. 动作和操作符 operator
2. 左右动作 left-right-motions
3. 上下动作 up-down-motions
4. 单词动作 word-motions
5. 文本对象动作 object-motions
6. 文本对象选择 object-select
7. 位置标记 mark-motions
8. 跳跃 jump-motions
9. 杂项动作 various-motions
通用说明:
要了解当前文件位置,可用 "CTRL-G" CTRL-G 或 "g CTRL-G" g_CTRL-G 。
也可置位 'ruler' 选项,状态行会持续显示光标位置 (会略微影响 Vim 效能)。
熟练用户偏爱 hjkl 键,因为手指无需移位。新手更习惯光标移动键,因为对 hjkl 键还
不熟悉。要帮助记忆,不妨将 j 想像成向下箭头。
可设置 'virtualedit' 选项开启虚拟编辑模式。光标可移动到无字符空白处,也能定位
到制表符等占据多列字符的内部。
1. 动作和操作符 operator
动作命令出现在操作符命令之后,从而使操作符作用于被该动作覆盖的文本上,即动作前 后光标位置之间的文本。操作符主要用于删除或修改文本。可用操作符如下: c c 修改 (change) (删除并插入) d d 删除 (delete) y y 抽出 (yank) 到寄存器 (不改变文本) ~ ~ 切换大小写 (仅当 'tildeop' 置位时有效) g~ g~ 切换大小写 gu gu 转为小写 gU gU 转为大写 ! ! 通过外部程序过滤 = = 通过 'equalprg' (为空时使用 'cindent' 缩进) 过滤 gq gq 文本排版 gw gw 文本排版,不移动光标 g? g? ROT13 编码 > > 右移 < < 左移 zf zf 创建折叠 g@ g@ 自定义操作,调用 'operatorfunc' 选项定义的函数 motion-count-multiplied 动作和操作符都带有计数前缀时,两者相乘。因此,"2d3w" 删除六个单词。 operator-doubled 连续按两次操作符,相当于指定作用范围为整行。搭配计数则操作对应行数。计数可出现 在首字符前或后。如3dd 删除三行。前后都带计数则两者相乘,如 2y3y 抽出六行。
operator-resulting-pos
操作结束后,光标通常会停在操作文本的起始处。如 yfe 抽出后光标不移动,而
yFe 光标会左移到字符 "e" 上,那里是抽出起始位置。
'startofline' 选项可改为停在该行首个非空白字符,仅对带行动作的 d 、 < 、 =
和 > 有效。
linewise characterwise
操作符作用范围可以影响整行,也可以影响字符区间。一般而言,跨行间移动的动作属于
行级动作,而在一行内部移动的动作属于字符级动作。但有少数例外。
exclusive inclusive
字符级动作可进一步细分为闭动作和开动作。闭动作的操作区间同时包含起末字符。而开
动作的操作区间只包含起始字符,不包含结束 (即更靠近缓冲区末尾一端的) 字符。
行级动作则永远同时包含起末字符,无开闭之分。
每条动作命令会标注自身是行级动作、开动作、还是闭动作。但有两条通用特例:
1. 结束位置在首列的开动作会自动转换为结束位置移到上行末尾的闭动作。
例如, } 移动到当前段落之后的首行。但 d} 删除时不会包含该行。
exclusive-linewise
2. 结束位置在首列的开动作、且起始位置位于一行首个非空白字符之上或之前时,会自
动转换为行级动作。
例如,假定段落以若干空白开始,在首个非空白字符上执行 d} 时会删除整段所有
行,包含前置空白。放置 ( put ) 时会将删除行插入光标下方。
注意 操作符处于等待状态 (即按下操作符但尚未按下动作命令) 时,可应用专属映射命
令组 :omap 。
除了先给出操作符再给出动作的传统方式外,也可用可视模式操作: 先用 v 选中起始
位置,移动光标到所需的结束位置,然后按下操作符执行。起始位置到光标位置间的选中
区域被高亮,可直观看到操作范围。可视方式的优势是灵活,但缺点是需要更多键击,且
重做功能受限。详见可视模式相关章节 Visual-mode (译者注: 可视模式添加了第三种
作用范围,列块级动作,见 blockwise-operators )。
可将 : 命令用作动作,执行 Ex 命令移动光标。例如,`d:call FindEnd()`。
可用 . 重复单行命令,但多行命令无法重复。例如,可以重复:
d:call search("f")<CR>
但无法重复 (即使逻辑上等价):
d:if 1<CR>
call search("f")<CR>
endif<CR>
注意 : 命令动作总是视作字符级开动作。
inclusive-motion-selection-exclusive
'selection' 设为 "exclusive" 时, Visual 模式下的闭动作会自动右移光标一个字符
位并转换为开动作。这样既保证可视选区包含正确文本,又符合设置要求。
forced-motion
强 制 动 作 作 用 范 围 为 行 级 、 字 符 级 或 列 块 级
如果动作缺省类型不符预期,可在操作符后输入 "v"、"V" 或 CTRL-V 强制转换类型。
示例:
dj
会删除两行 (缺省为行级动作),而
dvj
会删除光标到下一行对应字符之间内容 (字符级开动作),最后
d<C-V>j
会删除光标与下一行对应字符组成的列块 (仅包含两个字符)。
注意 强制将行级动作转换为字符级或列块级时,目标列未必存在。
o_v
v 放在操作符和动作之间: 强制本次操作为字符级。如果原动作是行级,
则变为开动作。如果原动作已是字符级,则切换开闭性。即将原来的开
动作变成闭动作,反之亦然。
o_V
V 放在操作符和动作之间: 强制本次操作为行级。
o_CTRL-V
CTRL-V 放在操作符和动作之间: 强制本次操作为列块级。相当于可视列块模式
的选择方式,动作的起止光标位置定义列块对角。
2. 左右动作 left-right-motions
此类命令仅在当前行内移动光标到不同列。光标缺省不会越过行首或行尾, $ (可能跨 行) 除外。但可通过 'whichwrap' 选项允许部分命令跨行。 h 或 h<Left> 或 <Left>
CTRL-H 或 CTRL-H <BS>
<BS> 左移 [count] 个字符。 exclusive 开动作。
注意: 要使 <BS> 删除字符,可用如下映射:
:map CTRL-V<BS> X
("CTRL-V<BS>" 指先按 CTRL-V 键再按 <BS> 键)
如果 <BS> 行为异常,查阅 :fixdel 。
l 或 l
<Right> 或 <Right> <Space>
<Space> 右移 [count] 个字符。 exclusive 开动作。
要调整此按键在行尾时的行为,参见 'whichwrap' 选项。
0
0 跳到本行首字符。 exclusive 开动作。
<Home> <kHome>
<Home> 跳到本行首字符。 exclusive 开动作。其后进行上下移动
时,会尽量保持文本列不变 (保持首列)。与之对照,多数其
他命令会保持 屏幕 列不变。<Home> 等价于 "1|"。在以
<Tab> 开头的行上,和 0 有细微区别 (译者注: 虽然两者
都会停留在屏幕第 8 列,但其后上下移动时,<Home> 会尽量
回到屏幕首列,而 0 会留在屏幕第 8 列)。
^
^ 跳到本行首个非空白字符。 exclusive 开动作。忽略计数。
$ <End> <kEnd>
$ 或 <End> 跳到本行 (给出 [count] 时,则额外往下移动 [count-1] 行
(但不超过缓冲区末尾)) 的行尾。 inclusive 闭动作。如果
计数为 2 或更高但光标位于末行,报错而光标不移动。
可视模式下,光标会停在行末字符之后的位置。
激活 'virtualedit' 时,如果光标位于行尾空白虚拟位置,
"$" 可回退 (到真实行尾字符)。
(译者注: 其后进行上下移动时,会自动跳到行尾)
g_
g_ 跳到本行 (给出 [count] 时则额外往下移动 [count-1] 行)
的末个非空白字符。 inclusive 闭动作。
g0 g<Home>
g0 或 g<Home> 'wrap' 打开行回绕时: 跳到当前屏幕行首个字符。行宽超出
屏幕时,和 0 有区别。
'nowrap' 关闭行回绕时: 跳到本行可视区域最左侧字符。行
首字符不在屏幕内时,和 0 有区别。
exclusive 开动作。
g^
g^ 'wrap' 打开行回绕时: 跳到当前屏幕行首个非空白字符。行
宽超出屏幕时,和 ^ 有区别。
exclusive 开动作。
gm
gm 类似 g0 ,但跳到屏幕宽度中间位置 (以不过行尾为限)。
gM
gM 类似 g0 ,但跳到本行文本中点。
给出 [count] 时: 跳到指定百分比位置。 10gM 靠近行首,
而 90gM 靠近行尾。
g$
g$ 'wrap' 打开行回绕时: 跳到当前屏幕行 (给出 [count] 时额
外往下移动 [count-1] 屏幕行) 的行尾。行宽超出屏幕时,
和 $ 有区别。
'nowrap' 关闭行回绕时: 跳到本行可视区域最右侧字符。行
尾字符不在屏幕内或使用计数时,和 $ 有区别。
其后进行上下移动时,会尽量保持屏幕列不变,不会自动跳到
行尾。
激活 'virtualedit' 时,总跳到屏幕行尾 (可为虚拟位置)。
inclusive 闭动作。
g<End> g<kEnd>
g<End> 类似 g$ ,但跳到末个非空白字符而非末尾任意字符。
bar
| 跳到当前行第 [count] 个屏幕列。 exclusive 开动作。
Ceci n'est pas une pipe (译者注: 法语 这不是一只烟斗,
这是名句,pipe 也做管道讲,有双关义)。
f
f{char} 向右查找第 [count] 次出现的字符 {char}。光标停在该字符
上。 inclusive 闭动作。
{char} 支持二合字母输入 digraph-arg 。
'encoding' 为 Unicode 编码时,可使用组合字符,参见
utf-8-char-arg 。
{char} 应用 :lmap 映射。插入模式下可用 CTRL-^ 命令开
关该映射 i_CTRL-^ 。
F
F{char} 向左查找第 [count] 次出现的字符 {char}。光标停在该字符
上。 exclusive 开动作。
{char} 输入规则同 f 。
t
t{char} 向右查找第 [count] 次出现的字符 {char}。光标停在该字符。
左侧位置。 inclusive 闭动作。
{char} 输入规则同 f 。
T
T{char} 向左查找第 [count] 次出现的字符 {char}。光标停在该字符
右侧位置。 exclusive 开动作。
{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] 行。 linewise 行级动作。
j 或 j
<Down> 或 <Down>
CTRL-J 或 CTRL-J
<NL> 或 <NL> CTRL-N
CTRL-N 下移 [count] 行。 linewise 行级动作。
gk 或 gk g<Up>
g<Up> 上移 [count] 屏幕行。 exclusive 开动作。
开启行回绕时,与 k 有区别。用于操作符之后也是如此,
因为两者范围类型不同 (后者为行级动作)。
gj 或 gj g<Down>
g<Down> 下移 [count] 屏幕行。 exclusive 开动作。
开启行回绕时,与 j 有区别。用于操作符之后也是如此,
因为两者范围类型不同 (后者为行级动作)。
-
- <minus> 上移 [count] 行,光标停在目标行首个非空白字符。
linewise 行级动作。
+ 或 +
CTRL-M 或 CTRL-M <CR>
<CR> 下移 [count] 行,光标停在目标行首个非空白字符。
linewise 行级动作。
_
_ <underscore> 下移 [count] - 1 行,光标停在目标行首个非空白字符。
linewise 行级动作。
G
G 跳到第 [count] 行,缺省跳到末行, linewise 行级动作。
未置位 'startofline' 时,保持原有列不变,否则光标停在
目标行首个非空白字符。
G 属于跳跃 ( jump-motions ) 命令之一,会写入跳跃表。
<C-End>
<C-End> 跳到第 [count] 行,缺省跳到末行,光标停在行尾。
inclusive 闭动作。
<C-Home> 或 gg <C-Home>
gg 跳到第 [count] 行,缺省跳到首行, linewise 行级动作。
未置位 'startofline' 时,保持原有列不变,否则光标停在
目标行首个非空白字符。
:[range]
:[range] 跳到 [range] 范围的末行。
Ex 模式下则会显示 [range] 范围里的所有行。
[range] 可仅单行,如 :1 或 :'m 。
和 G 不同,不会更改跳跃表 ( jumplist )。
N%
{count}% 跳到文件 {count} 百分比位置。 linewise 行级动作。目标
行号计算公式为:
({count} * 总行数 + 99) / 100
未置位 'startofline' 时,保持原有列不变,否则光标停在
目标行首个非空白字符。
:[range]go[to] [count] :go :goto go
[count]go 跳到缓冲区的第 [count] 个字节。 exclusive 开动作。
[count] 缺省为 1,即文件开头。[range] 给出时,其末数值
用作字节偏移。'fileformat' 的当前设置决定如何计算行尾
结束符的字节个数。
另见 line2byte() 函数和 'statusline' 的 'o' 标志位。
{仅当编译时加入 +byte_offset 特性才有效}
以上命令在行间移动,但不会越过缓冲区首末行。起先两个命令 ( k 和 j ) 会尽量保
持上次横向移动后的屏幕列位置。唯一例外是则执行过 $ 命令,则上下移动会固定停
在行尾。
如果使用 "k"、"-" 或 CTRL-P 时给出 [count] 但光标上方行数不足,且 'cpo' 选项包
含了 "-" 标志位 ( cpo-- ),命令会报错。
4. 单词动作 word-motions
<S-Right> 或 <S-Right> w
w 正向移动 [count] 个单词。 exclusive 开动作。
<C-Right> 或 <C-Right> W
W 正向移动 [count] 个字串。 exclusive 开动作。
如果 <C-Right> 不可用,请检查 arrow_modifiers 。
e
e 正向移动到第 [count] 个单词的尾部。 inclusive 闭动
作。空行上不停留。
E
E 正向移动到第 [count] 个字串的尾部。 inclusive 闭动
作。空行上不停留。
<S-Left> 或 <S-Left> b
b 反向移动 [count] 个单词。 exclusive 开动作。
<C-Left> 或 <C-Left> B
B 反向移动 [count] 个字串。 exclusive 开动作。
如果 <C-Left> 不可用,请检查 arrow_modifiers 。
ge
ge 反向移动到第 [count] 个单词的尾部。 inclusive 闭动
作。
gE
gE 反向移动到第 [count] 个字串的尾部。 inclusive 闭动
作。
以上命令在单词或字串间移动。
word
一个单词通常由字符、数位和下划线序列组成,但也可由其他非空白字符序列组成,通过
'iskeyword' 选项可调整单词字符判定规则。单词间以空白 (空格、制表、换行) 分隔。
对于数值大于 255 的字符,由 Unicode 字符类别切换的位置定义单词边界 (如在字母、
下标、表情符号等之间切换时)。空行也被认作一个特殊单词。
WORD
一个字串由任意空白字符序列组成。字串间以空白分隔。空行也被认作一个特殊字串。
已折叠的多行被认作由单个字符组成的单词。 w 和 W 、 e 和 E 会跳到折叠行后
首个单词或字串的开头/尾部。 b 和 B 则移动到折叠行前首个单词或字串的开头。
特例一: 光标在非空白字符上时, cw 和 cW 等价于 ce 和 cE 。这是因为 "cw"
被诠释为 修改-单词 (change-word),而单词并不包括其后方空白 (另见 cw )。
特例二: w 动作与操作符搭配且最近到达的单词已在行尾,则操作范围结束于该单词尾
部,不会延伸到下一行首个单词。
原版 Vi 的 e 实现有问题。例如, e 会停在空行下一行的首个字符,但 2e 的行
为正常 (移到下一行第二个单词的尾部)。Vim 里则统一逻辑, ee 和 2e 行为一致,
这更合乎逻辑。该改动少量与 Vi 的不兼容。
5. 文本对象动作 object-motions
( ( 反向跳转[count] 个 sentence 。 exclusive 开动作。
)
) 正向跳转 [count] 个 sentence 。 exclusive 开动作。
{
{ 反向跳转 [count] 个 paragraph 。 exclusive 开动作。
}
} 正向跳转 [count] 个 paragraph 。 exclusive 开动作。
]]
]] 正向跳转 [count] 个 section 或首列出现的 '{'。搭配操
作符时,也会停留在首列出现的 '}' 的下一行。
exclusive 开动作,但遵循 exclusive-linewise 特例。
][
][ 正向跳转 [count] 个 section 或首列出现的 '}'。
exclusive 开动作,但遵循 exclusive-linewise 特例。
[[
[[ 反向跳转 [count] 个 section 或首列出现的 '{'。
exclusive 开动作,但遵循 exclusive-linewise 特例。
[]
[] 反向跳转 [count] 个 section 或首列出现的 '}'。
exclusive 开动作,但遵循 exclusive-linewise 特例。
以上命令在三类文本对象上跳转,见下。
sentence
句子是以结束标点 ('.'、'!' 或 '?') 结尾,后接可选任意数量的闭括号和引号 (')'、
']'、'"' 和 ''')、后接必需的空白字符 (换行、空格或制表) 的文本。段落和小节边界
也视为句子边界。
如果 'cpoptions' 包含 'J' 标志位 ( cpo-J ),那么标点之后的空格至少要出现两个,
制表符也不被视为分隔句子的空白。
句子规则不可自定义修改。
paragraph
段落是以空行或由 'paragraphs' 选项定义的 nroff 段落宏 (选项值里每组字符对分别
对应一个宏名,如缺省值 "IPLPPPQPP TPHPLIPpLpItpplpipbp" 对应宏名 ".IP"、".LP"
等,句号必须在行首) 开始的文本块。小节边界也视为段落边界。
注意 空白行 (只包含空白的行) 不算 段落边界。首列出现的 '{' 或 '}' 也不算。但
'cpoptions' 里包含 '{' 标志位 ( cpo-{ ) 时,首列 '{' 会成为段落边界 ( posix
标准)。
section
小节是以首列出现的换页符 (<C-L>) 或由 'sections' 选项定义的 nroff 小节宏 (选项
里每组字符对分别对应一个宏名,如缺省值 "SHNHH HUnhsh" 对应宏名 ".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 以下命令仅能在可视模式下、或操作符后使用。这些命令分两类。以 "a" 打头表示选中 一个 ("a"n) 完整对象,包含外围的空白字符;以 "i" 带头表示选中内含 ("i"nner) 对 象: 不含外围空白。纯空白本身也算作内含对象。因此同一种文本对象下,"内含" 对象 选区严格小于 "一个" 对象选区。 另见 gn 和 gN ,它们也是文本对象,选中前次搜索模式的下一个或上一个匹配项。 v_aw aw aw "一个单词",选择[count] 个单词 (见 word )。
包含引导或拖尾空白,空白本身不单独计算为一个对象。
在行可视模式下,"aw" 切换到字符可视模式。
v_iw iw
iw "内含单词",选择 [count] 个单词 (见 word )。
单词之间的空白也被算作一个对象。
在行可视模式下,"iw" 切换到字符可视模式。
v_aW aW
aW "一个字串",选择 [count] 个字串 (见 WORD )。
包含引导或拖尾空白,空白本身不单独计算为一个对象。
在行可视模式下,"aW" 切换到字符可视模式。
v_iW iW
iW "内含字串",选择 [count] 个字串 (见 WORD )。
字串之间的空白也被算作一个字串。
在行可视模式下,"iW" 切换到字符可视模式。
v_as as
as "一个句子",选择 [count] 个句子 (见 sentence )。
可视模式下切换到字符可视模式。
v_is is
is "内含句子",选择 [count] 个句子 (见 sentence )。
可视模式下切换到字符可视模式。
v_ap ap
ap "一个段落",选择 [count] 个段落 (见 paragraph )。
特例: 空白行 (只包含空白的行) 也被视为段落边界。
可视模式下切换到行可视模式。
v_ip ip
ip "内含段落",选择 [count] 个段落 (见 paragraph )。
特例: 空白行 (只包含空白的行) 也被视为段落边界。
可视模式下切换到行可视模式。
a] v_a] v_a[ a] a[
a[ "一个 [] 块",选择 [count] 层 '[' ']' 块。为此,先反向
查找第 [count] 个未匹配的 '[',然后查找其对应的 ']'。
选择两者之间的文本,含 '[' 和 ']' 本身。
cpo-M 选项标志位用于处理转义后的方括号。
可视模式下切换到字符可视模式。
i] v_i] v_i[ i] i[
i[ "内含 [] 块",选择 [count] 层 '[' ']' 块。为此,先反向
查找第 [count] 个未匹配的 '[',然后查找其对应的 ']'。
选择两者之间的文本,但不含 '[' 和 ']' 本身。
选择空内含块 "[]" 会报错。
cpo-M 选项标志位用于处理转义后的方括号。
可视模式下切换到字符可视模式。
a) v_a) a) a(
a( vab v_ab v_a( ab
ab "一个块",选择 [count] 层 '(' 块,为此,先反向查找第
[count] 个未匹配的 '(' (见 [( ),然后查找其对应的
')'。选择两者之间的文本,含 '(' 和 ')' 本身,但不含括
号外的空白。
cpo-M 选项标志位用于处理转义后的小括号。
可视模式下切换到字符可视模式。
i) v_i) i) i(
i( vib v_ib v_i( ib
ib "内含块",选择 [count] 层 '(' 块,为此,先反向查找第
[count] 个未匹配的 '(' (见 [( ),然后查找其对应的
')'。选择两者之间的文本,但不含 '(' 和 ')' 本身。如果
光标不在任何 () 块内,则继续寻找下一个 "("。
选择空内含块 "()" 会报错。
cpo-M 选项标志位用于处理转义后的小括号。
可视模式下切换到字符可视模式。
a> v_a> v_a< a> a<
a< "一个 <> 块",选择 [count] 层 <> 块,选择从反向第
[count] 个未匹配的 '<' 到其对应的 '>' 之间的文本,含
'<' 和 '>' 本身。
cpo-M 选项标志位用于处理转义后的 '<' 和 '>'。
可视模式下切换到字符可视模式。
i> v_i> v_i< i> i<
i< "内含 <> 块",选择 [count] 层 <> 块,选择从反向第
[count] 个未匹配的 '<' 到其对应的 '>' 之间的文本,但不
含 '<' 和 '>' 本身。
选择空内含块 "<>" 会报错。
cpo-M 选项标志位用于处理转义后的 '<' 和 '>'。
可视模式下切换到字符可视模式。
v_at at
at "一个标签块",选择 [count] 层标签块。选择从反向第
[count] 个未匹配的 "<aaa>" 到其对应的 "</aaa>" 之间的
文本,含 "<aaa>" 和 "</aaa>" 本身。
详情见 tag-blocks 。
可视模式下切换到字符可视模式。
{仅当编译时加入 +eval 特性时才可用}
v_it it
it "内含标签块",选择 [count] 层标签块。选择从反向第
[count] 个未匹配的 "<aaa>" 到其对应的 "</aaa>" 之间的
文本,但不含 "<aaa>" 和 "</aaa>" 本身。
详情见 tag-blocks 。
可视模式下切换到字符可视模式。
a} v_a} a} a{
a{ v_aB v_a{ aB
aB "一个大块",选择 [count] 层 '{' 块,为此,先反向查找第
[count] 个未匹配的 '{' (见 [{ ),然后查找其对应的
'}'。选择两者之间的文本,含 '{' 和 '}' 本身。
cpo-M 选项标志位用于处理转义后的花括号。
可视模式下切换到字符可视模式。
i} v_i} i} i{
i{ v_iB v_i{ iB
iB "内含大块",选择 [count] 层 '{' 块,为此,先反向查找第
[count] 个未匹配的 '{' (见 [{ ),然后查找其对应的
'}'。选择两者之间的文本,但不含 '{' 和 '}' 本身。
选择空内含块 "{}" 会报错。
cpo-M 选项标志位用于处理转义后的花括号。
可视模式下切换到字符可视模式。
a" v_aquote aquote
a' v_a' a'
a` v_a` a`
"一个引号字符串"。选择从光标前一处引号到光村后一处引号
之间的文本,包含引号本身。'quoteescape' 选项用于跳过转
义后的引号。仅在同一行内有效。
光标已在引号上时,Vim 会从行首开始搜索,寻找构成字符串
的引号对。
选中范围包含拖尾空白,如果没有拖尾空白,则包含引导空
白。
可视模式下切换到字符可视模式。
在可视模式下重复此对象会额外选中下一个字符串。目前该操
作暂不支持计数。
i" v_iquote iquote
i' v_i' i'
i` v_i` i`
和 a"、a' 和 a` 类似,但选中范围不含引号本身,而重复此
对象也不会扩展可视选区。
特例: 计数为 2 时会包含引号,但与 a"/a'/a` 不同,不会
包含外围的空白。
o_object-select
在操作符之后:
非块对象:
对于 "一个" 命令: 操作符作用于对象及拖尾空白。如果没有拖尾空白或者光标
位于对象前的空白上,则包含对象前的空白。
对于 "内含" 命令: 光标在对象之上时,操作符作用于该对象。光标在空白上
时,操作符仅作用于空白。
块对象:
操作符作用于光标所在块,包括光标在括号上的特殊情况。对于 "内含" 命令,
不包含两侧括号。而对于 "一个" 命令,则包含两侧括号。
v_object-select
在可视模式下:
可视选区的起止位置相同时 (刚输入 "v" 进入可视模式):
选中单个文本对象覆盖区域,效果和配合操作符时一致。
可视选区的起止位置不同时:
对非块对象,选区向外扩展一个对象,或延伸到下一个对象前的空白,使用
"一个" ("a" 类) 对象时,同时包含对象及其外围空白。扩展的方向由光标位于
选区的哪一侧决定。对块对象,选区向外扩展一层指定块。
下文以删除命令说明,按选取范围从小到大罗列文本对象。注意 单个字符及整行操作直
接沿用 Vi 原有光标移动命令。
"dl" 删除一个字符 (简写: "x") dl
"diw" 删除内含单词 diw
"daw" 删除一个单词 daw
"diW" 删除内含字串 (见 WORD ) diW
"daW" 删除一个字串 (见 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" 则删除光标所在整个单词及前后空白。
标签块 tag-blocks
it 和 at 文本对象用于选中 HTML 和 XML 文本匹配标签之间的内容。但因为这两者
并不完全兼容,存在部分使用限制。
常规用法是选中 <tag> 到对应的 </tag> 之间的内容。 at 含标签本身, it 不含。
重复 it 时,会一并选中标签 (否则选区无变化)。此外,在内含内容为空的标签块上
使用 it 时,会单独选中起始标签。
忽略自闭合标签 ("<aaa/>")。标签匹配时忽略大小写,即使 XML 本身区分大小写。
HTML 里,<br> 或 <meta ...> 等没有对应结束标签的悬空标签会被忽略。
这两种文本对象容错性较强。除以上介绍的情况外,多余的结束标签也会被忽略。
7. 位置标记 mark-motions E20 E78
(译者注: 位置标记总结
- 文件内位置 'a - 'z
- 文件位置 'A - 'Z
- 前次及更早 Vim 退出位置 '0 - '9
- 前次插入位置 '^
- 前次修改位置 '.
- 前次跳转位置 (上下文) ''
- 前次缓冲区关闭位置 'quote
- 前次操作范围 '[ 和 ']
- 前次可视选区 '< 和 '>
- 当前句子 '( 和 ')
- 当前段落 '{ 和 '}
)
位置标记跳转的两种方式:
1. 用 ` (反引号): 光标停在标记指定字符位置, exclusive 开动作。
2. 用 ' (单引号): 光标停在标记所在行的首个非空白字符, linewise 行级动
作。
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'}。
省略 [range] 时,默认为当前行。
:k
:[range]k{a-zA-Z'} 同 :mark ,标记名前可省略空格。
Vim9 脚本里不支持本命令,因为容易和变量名混淆。
' '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`"
跳转到文件上次关闭位置。参见
$VIMRUNTIME/vimrc_example.vim。另见 :keepjumps 。
:marks
:marks 列出全部位置标记 (不属于动作命令),但不包括 '( ,
') , '{ 和 '} 标记。显示行、列、及文件/文本信息。
首列显示的列号为零。
E283
:marks {arg} 仅列出 {arg} 指定的位置标记 (不属于动作命令)。例如:
:marks aB
会列出位置标记 'a 和 'B。
:delm :delmarks
:delm[arks] {marks} 删除指定位置标记。也可删除跨文件标记 A-Z 或 0-9。无法
删除 '' 标记。
标记名可以逐个列出,也可通过连字符分隔的范围表示。忽略
空格。例如:
:delmarks a 删除位置标记 'a
:delmarks a b 1 删除位置标记 'a、'b 和 '1
:delmarks Aa 删除位置标记 'A 和 'a
:delmarks p-z 删除位置标记 'p 到 'z
:delmarks ^.[] 删除位置标记 '^、'.、'[、']
:delmarks \" 删除位置标记 '"
:delm[arks]! 清空当前缓冲区所有位置标记,保留 A-Z 和 0-9 跨文件标
记 (译者注: 包括 'a-'z、 '[ 、 '] 、 'quote 、 '^ 、
'. )。
位置标记在屏幕上并不可见。仅用于记录文件中特定位置。不要和命名寄存器混淆,两者
毫不相干。
'a - 'z 小写位置标记,仅在每个文件内局部有效。
'A - 'Z 大写位置标记,又称文件标记,支持跨文件跳转。
'0 - '9 编号位置标记,仅在 .viminfo 文件里设置。
只要文件还留在缓冲区列表里,小写位置标记 'a 到 'z 就会保留。一旦将该文件从缓冲
区列表移除,其相应位置标记都会丢失。删除带标记的一行时,对应的标记也会被清除。
小写位置标记可和操作符搭配使用。例如, d't 会删除从光标所在行到 't 标记所在的
所有行。小提示: 可用 't 标记顶部 (Top),'b 标记底部 (Bottom) 等,用于助记。执
行撤销/重做时,会同步复原小写位置标记。
大写位置标记 'A 到 'Z 会记录所在文件名。可用于在文件间跳转。只有位于当前文件的
大写位置标记才可与操作符搭配使用。增删文件内容或临时切换到其他文件编辑时,大写
位置标记记录的行号会保持准确。'viminfo' 选项非空时,viminfo 文件会保存大写位置
标记。参见 viminfo-file-marks 。
编号位置标记 '0 到 '9 和前两类差异很大。不能直接设置,只能从 viminfo 文件
viminfo-file 中获取。基本规则是,'0 代表上次退出 Vim 前的光标位置。'1 是上上
次退出前的位置,依次类推。'viminfo' 的 'r' 标志位可指定特定文件路径,不记录其
中的编号位置标记。参见 viminfo-file-marks 。
'[ `[
'[ `[ 跳转到上次修改或抽出文本的首个字符。缓冲区写入时也会更
新本标记。
'] `]
'] `] 跳转到上次修改或抽出文本的末个字符。缓冲区写入时也会更
新本标记。
操作结束后,光标默认会停在操作文本的起始处。执行放置命令 ( p 或 P ) 后,光标
有时停在放置内容首行,有时停在放置内容末行。上面这两组标记可分别定位操作范围的
起止两端。例如,抽出 10 行文本后,跳转到抽出文本末行: 10Y'] 。用 p 插入多行
后,跳转到放置内容末行: p'] 。插入文本的操作此处也适用。
备注: 删除文本后 (列块可视模式除外), '[ 和 '] 标记重合。除了修改、抽出、保
存、删除、插入等操作外,当前文件尚未做任何修改或抽出时,以上命令无效。
'< `<
'< `< 跳转到当前缓冲区最近一次可视选区的首行或起始字符。对于
列块模式,也可能是首行的末尾字符 (用于确定列块边界)。
'> `>
'> `> 跳转到当前缓冲区最近一次可视选区的末行或末尾字符。对于
列块模式,也可能是末行的首字符 (用于确定列块边界)。
注意 'selection' 选项为 'exclusive' 时,该位置可能是可
视选区后方一个字符位置。
'' ``
'' `` 跳转到最近一次跳转操作之前的光标位置。该位置也可通过
m' 或 m` 命令手动设置。用 :keepjumps 命令修饰符
时,不更新本前次上下文标记。另见 restore-position 。
'quote `quote
'" `" 跳转到上次关闭本缓冲区时的光标位置。从未打开过本缓冲区
时默认为首行首字符。要每次打开文件时自动执行本命令,可
见 last-position-jump 。
本标记与缓冲区而非窗口绑定。只要缓冲区在任意窗口保持可
见,不会更新本标记。
'^ `^
'^ `^ 跳转到上次退出插入模式时的光标位置。 gi 命令依赖本标
记。用 :keepjumps 命令修饰符时,不更新本标记。
'. `.
'. `. 跳转到上次文本修改的发生位置。通常停在修改起始处或其附
近。有些命令会拆分为多处修改,此时标记会停在该命令修改
内容的末尾附近。例如,插入单词后,标记停在单词最后一个
字符。
要跳转到更早的修改位置,可用 g; 。
'( `(
'( `( 跳转到当前句子开头,类似 ( 命令。
') `)
') `) 跳转到当前句子末尾,类似 ) 命令。
'{ `{
'{ `{ 跳转到当前段落开头,类似 { 命令。
'} `}
'} `} 跳转到当前段落末尾,类似 } 命令。
以下命令本身不创建标记,仅用于遍历跳转已存在的小写位置标记:
]'
]' 正向跳转 [count] 次光标下方带有小写位置标记的行,停在
首个非空白字符。
]`
]` 正向跳转 [count] 次光标之后的小写位置标记。
['
[' 反向跳转 [count] 次光标上方带有小写位置标记的行,停在
首个非空白字符。
[`
[` 反向跳转 [count] 次光标之前的小写位置标记。
:loc[kmarks] {command} :loc :lock :lockmarks
执行命令 {command} 时,不自动修正位置标记。可用于修改
后文本总行数保持不变的操作。
警告: 如果行数发生变化,修改区域下方所有标记会保留原有
行号,从而在实际上错位到其他文本行。
执行期间不会随行的增删自动修正的项目有:
- 小写位置标记 'a - 'z
- 大写位置标记 'A - 'Z
- 编号位置标记 '0 - '9
- 前次插入位置 '^
- 前次修改位置 '.
- 前次操作范围 '[ 和 ']
- 可视选择区域 '< 和 '>
- 已放置标号 signs 行号
- quickfix 位置行号
- 跳跃表 jumplist 包含位置
- 标签堆栈 tagstack 包含位置
仍会正常随文本偏移修正的项目有:
- 前次上下文标记 ''
- 当前光标位置
- 缓冲区窗口视图
- 折叠 folding
- 差异视图 diff
:kee[pmarks] {command} :kee :keep :keepmarks
目前仅对过滤命令 :range! 有效:
- 过滤后总行数不少于原行数时,过滤行上的所有标记保持原
有行号不变。
- 总行数减少时,被删除行上的标记会直接清除。
无论行数增减,过滤文本下方的标记都会跟随文本移动,正常
修正行号。
'cpoptions' 中未包含 'R' 标志位时 ( cpo-R ),过滤命令
默认总是使用本修饰符。
:keepj :keepjumps
:keepj[umps] {command}
执行命令 {command} 内的光标移动时,不更新 '' 、 '. 、
'^ 标记,跳跃表 jumplist 和改变表 changelist 。适
用于脚本自动修改或插入文本但不希望干扰用户跳转记录的场
景。例如,自动更新文件首行 "最近更新" 时间戳:
:let lnum = line(".")
:keepjumps normal gg
:call SetLastChange()
:keepjumps exe "normal " .. lnum .. "G"
注意 每条需要屏蔽跳转记录的命令都必须单独加本修饰符。
调用函数时,要注意该函数内部的命令仍可能修改跳转记录。
另外,`:keepjumps exe 'command'` 是错误写法,因为其中
的 "command" 仍会修改跳转记录。正确写法是:
`:exe 'keepjumps command'`。
8. 跳跃 jump-motions
"跳跃" 指会让光标一次性跳过多行的命令。执行光标 "跳跃" 时,会记录跳跃前的光标 位置。除非包含该位置所在行被修改或删除,否则可用 '' 或 `` 命令返回该位置。 以下命令均属于 "跳跃" 命令: ' 、 ` 、 G 、 / 、 ? 、 n 、 N 、 % 、 ( 、 ) 、 [[ 、 ]] 、 { 、 } 、 :s 、 :tag 、 L 、 M 、 H 以及所有打开新文件的命令。 CTRL-OCTRL-O 在跳跃表里回溯到第 [count] 个更早的光标位置 (不属于动
作命令)。
<Tab> 或 CTRL-I <Tab>
CTRL-I 在跳跃表里前进到第 [count] 个更新的光标位置 (不属于动
作命令)。
备注: 在 GUI 和支持 modifyOtherKeys 的终端里,CTRL-I
可与 <Tab> 分开映射,条件是先映射 CTRL-I,再映射
<Tab>,否则映射会同时作用于两者。
:ju :jumps
:ju[mps] 显示当前窗口的完整跳跃表 (不属于动作命令)。
:cle :clearjumps
:cle[arjumps] 清空当前窗口的跳跃表。
jumplist
跳跃表保存所有的跳跃记录。通过 CTRL-O 和 CTRL-I 命令,可在跳跃表上来回穿梭历史
位置。每个窗口拥有独立跳跃表,列表最大容量固定为 100 条记录。
例如,假定连续三个跳跃命令后,跳跃表展示如下:
跳转 行 列 文件/文本
3 1 0 一些文字
2 70 0 另外一行
1 1154 23 结束。
"文件/文本" 列显示文件名,位于当前文件时,则改为显示该位置所在文本 (自动去除缩
进并截断超长内容,以适配窗口宽度)。
">" 标记指示当前在跳跃表中的游标位置。使用 :filter 过滤 :jumps 输出时该标
记可能不显示。
假设现在位于第 1167 行。按下 CTRL-O 命令会跳到第 1154 行。列表更新为:
跳转 行 列 文件/文本
2 1 0 一些文字
1 70 0 另外一行
> 0 1154 23 结束。
1 1167 0 foo bar
此时游标指向上一次跳跃位置。再次按 CTRL-O 命令会跳到游标上方更早的记录。而按
CTRL-I 命令则会跳到游标下方更新的记录。如果游标在列表末尾下方,代表此前尚未使
用过 CTRL-I 或 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 ) 时,
跳跃表会更新为:
跳转 行 列 文件/文本
4 1 0 一些文字
3 70 0 另外一行
2 1167 0 foo bar
1 1154 23 结束。
增删文本行时,跳跃表里的行号会自动修正。不过,如果未保存文件就放弃编辑 (如
:n! ),行号调整机制会失效。
分割窗口时,跳跃表会完整复制到新窗口。
'viminfo' 选项里包含 ' 字符时,跳跃表会存入 viminfo 文件。下次启动 Vim 会自动
恢复。
jumplist-stack
'jumpoptions' 选项包含 "stack" 时,跳跃表行为类似标签栈。从跳跃表中间位置跳转
到新位置后,会清空当前游标后方所有记录。用此方式可像树状分支一样浏览跳转路径。
退回某一分支再跳去其他分支时。CTRL-O 仍会沿树向上回溯。
示例初始跳跃表,连续按三次 CTRL-O 回到位置 X:
跳转 行 列 文件/文本
2 1260 8 mark.c <-- 位置 X-2
1 685 0 eval.c <-- 位置 X-1
> 0 462 36 eval.c <-- 位置 X
1 479 39 eval.c
2 213 2 mark.c
3 181 0 mark.c
此时跳转到 (新) 位置 Y 后,游标后方全部旧记录被清除:
跳转 行 列 文件/文本
3 1260 8 mark.c <-- 位置 X-2
2 685 0 eval.c <-- 位置 X-1
1 462 36 eval.c <-- 位置 X
此时再跳转到另一个新位置 Z 后,新位置 Y 追加到位置 X 后方,X 与跳转到 Y 之前原
有的 X-1、X-2 等位置相对顺序保持不变:
跳转 行 列 文件/文本
4 1260 8 mark.c <-- 位置 X-2
3 685 0 eval.c <-- 位置 X-1
2 462 36 eval.c <-- 位置 X
1 100 0 buffer.c <-- 位置 Y
改 变 表 跳 转 changelist change-list-jumps E664
每次修改文本时,都会记录光标位置。每一条可撤销的修改都会保存位置,但和前次修改
位置过于接近时,不会重复记录。以下两条命令可跳转到所有修改记录 (包含已撤销的修
改):
g; E662
g; 在改变表中跳转到第 [count] 个更早的历史修改位置。
如果 [count] 超过可用历史记录数,停在最旧的修改位置。
但如果没有任何更早的修改,报错。
(不属于动作命令)
g, E663
g, 在改变表中跳转到第 [count] 个更新的修改位置。
功能和 g; 相反。
(不属于动作命令)
带计数时,可一次性前后跳转任意次数。例如 999g; 可直接跳到最旧仍留存的修改记
录。改变表条目容量和跳跃表一致,见 jumplist 。
两条可撤销的修改位于同一行且所在列差小于 'textwidth' 时,仅保留后一次修改的位
置。避免单行连续小幅修改 (如按 "xxxxx") 大量挤占改变表。'textwidth' 为 0 时,
改用 'wrapmargin'。后者也未设置时,默认为固定值 79。细节: 为避免影响执行速度,
底层计算基于字节数而非字符数 (仅对多字节编码有影响)。
请 注意 增删文本后 (尤其删除多行时),光标记录位置可能与实际修改处略有偏差。
使用 :keepjumps 修饰符的修改命令不会存入改变表。
:changes
:changes 显示完整改变表。">" 标记指示当前在改变表中的游标位置。
完成一次修改后,游标位于最新条目下方,此时 g; 会跳到
最新修改。
首列指示要到达该位置所需的 g; 或 g, 次数。例如:
改变 行 列 文本
3 9 8 bla bla bla
2 11 57 foo is a bar
1 14 54 最新改变的行
执行 `3g;` 命令跳到第 9 行。`:changes` 此时更新为:
改变 行 列 文本 ~
> 0 9 8 bla bla bla
1 11 57 foo is a bar
2 14 54 最新改变的行
此时,|g,| 跳到第 11 行,|2g,| 跳到第 14 行。
9. 杂项动作 various-motions
% % 在当前行光标所在或之后查找可用项目,并跳转到其匹配项。 inclusive 闭动作。 可用项目是: ([{}]) 小/中/大括号 (可通过 'matchpairs' 选项
自定义配对字符)
/* */ C-风格的注释的起止标记
#if、#ifdef、#else、#elif、#endif
C 预处理条件宏 (仅当光标位于 # 上,或
后方无 ([{ 时生效)
如需支持更多匹配项目,可安装 matchit 插件,参见
matchit-install 。该插件还能自动跳过注释内的配对符号。
'cpoptions' 包含 'M' ( cpo-M ) 时,忽略各种括号前的所
有反斜杠。否则,反斜杠个数影响匹配。带偶数个反斜杠的括
号与带奇数个反斜杠的括号不互相匹配。例如,在 "( \) )"
和 "\( ( \)" 里,首个小括号都和最后一个小括号互相匹配。
'cpoptions' 不包含 '%' ( cpo-% ) 时,忽略双引号内部的
各种括号。但有例外: 该行内括号 (译者注: 应为引号) 数目
不对称,且该行及前一行都不以反斜杠结尾时,不忽略。也忽
略单引号括起的单个括号字符,即 '('、'{'、'['、']'、'}'
和 ')'。备注: 该规则适配 C 语言,但不适用于以单引号括
起字符串的 Perl 语言。
不会自动跳过注释内的配对符号。为此,可安装 matchit 插件
matchit-install ,另一解决办法是用引号括起配对符号。
本命令不支持计数,因为带计数的 {count}% 的功能是跳到文
件 {count} 百分比位置 N% 。
用于 #if/#else/#endif 间跳转时,为 linewise 行级动作。
[(
[( 反向搜索第 [count] 个未匹配的 '('。
exclusive 开动作。
[{
[{ 反向搜索第 [count] 个未匹配的 '{'。
exclusive 开动作。
])
]) 正向搜索第 [count] 个未匹配的 ')'。
exclusive 开动作。
]}
]} 正向搜索第 [count] 个未匹配的 '}'。
exclusive 开动作。
以上四条命令可快速定位当前代码块的首尾。和在代码块另一端的括号上按 "%" 等效,
但无需移动光标,在块内任意位置均可调用,对 C 程序开发很实用。
示例: 光标在 "case x:" 处,执行 [{ 可直接跳转到外层的 switch 代码块开头。
]m
]m 正向搜索第 [count] 个方法 (method) 的开始处 (适用于
Java 及同类结构化语言)。如果该方向无法找到方法起始,则
跳转到当前类的开始或结束处。
exclusive 开动作。
]M
]M 正向搜索第 [count] 个方法的结束处 (适用于 Java 及同类
结构化语言)。如果该方向无法找到方法结束,则跳转到当前
类的开始或结束处。
exclusive 开动作。
[m
[m 反向搜索第 [count] 个方法的开始处 (适用于 Java 及同类
结构化语言)。如果该方向无法找到方法起始,则跳转到当前
类的开始或结束处。如果该方向也无法找到 '{',报错。
exclusive 开动作。
[M
[M 反向搜索第 [count] 个方法的结束处 (适用于 Java 及同类
结构化语言)。如果该方向无法找到方法结束,则跳转到当前
类的开始或结束处。如果该方向也无法找到 '}',报错。
exclusive 开动作。
以上四条命令适配包含类与方法的代码结构。规则匹配 Java。假定类定义和类内方法都
由一对 '{' 和 '}' 包围。示例源文件结构如下:
// 注释
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"。
exclusive 开动作。
]#
]# 正向搜索第 [count] 个未匹配的 "#else" 或 "#endif"。
exclusive 开动作。
这两条命令用于处理 C 语言的 #if/#else/#endif 预处理分支。可直接跳转到当前代码
所属条件块的起始或结束行 (#if/#else/#endif)。跳转后可用 % 跳到配对分支行。
[star [/
[* 或 [/ 反向搜索第 [count] 个 C 注释的起始标记 "/*"。
exclusive 开动作。
]star ]/
]* 或 ]/ 正向搜索第 [count] 个 C 注释的结束标记 "*/"。
exclusive 开动作。
H
H 跳到窗口从顶部 (Home) 往下算第 [count] 行 (省略计数时
默认为窗口顶行)。 linewise 行级动作。
未置位 'startofline' 时,保持原有列不变,否则光标停在
目标行首个非空白字符。
也会根据 'scrolloff' 自动调整光标位置,但处于操作符等
待模式时不会。因此,操作完成后可能出现文本滚动。
示例: yH 会抽出从窗口顶行到光标行 (包含) 的所有文本。
M
M 跳到窗口中间 (Middle) 行。 linewise 行级动作。
未置位 'startofline' 时,保持原有列不变,否则光标停在
目标行首个非空白字符。
L
L 跳到窗口从底部 (Last) 往上算第 [count] 行 (省略计数时
默认为窗口底行)。 linewise 行级动作。
未置位 'startofline' 时,保持原有列不变,否则光标停在
目标行首个非空白字符。
也会根据 'scrolloff' 自动调整光标位置,但处于操作符等
待模式时不会。因此,操作完成后可能出现文本滚动。
示例: yL 会抽出从光标行到窗口底行 (包含) 的所有文本。
<LeftMouse> 光标跳转到鼠标点击的屏幕位置。 exclusive 开动作。参见
<LeftMouse> 。如果鼠标点击位置是状态行,仅激活所属窗
口,光标不移动。
vim:tw=78:ts=8:noet:ft=help:norl: