可视模式使用时分为三步:
1. 按 v 、 V 或 CTRL-V 标记文本起点。
将光标所在字符标记为文本起点。
2. 移动光标到文本终点。
从可视模式起点到光标所在字符间的文本 (含) 会被高亮。
3. 键入操作符命令。
高亮文本会执行对应操作。
'highlight' 选项可设置可视模式高亮的显示风格。
'virtualedit' 选项允许将光标定位到不存在字符的位置。
高亮文本缺省包含光标所在字符。但 'selection' 选项设为 "exclusive" 且光标刚好位
于选区之后时,则不包含光标所在字符。
使用 v 命令时,起点前、终点后的文本不会被高亮。但除 ~ 和 U 外, 所有的
大写和非字母操作符仍会作用于整行。参见下方操作符列表。
visual-block
使用 CTRL-V (列块可视模式) 时,高亮区域为起点到光标之间的一个矩形选区。部分
操作符仍会作用于整行 (见下方列表)。修改 ( c ) 和替代 ( s ) 操作会先删除高亮文
本,然后从选区左上角进入插入模式。
v characterwise-visual
[count]v 进入字符可视模式。
带 [count] 时,重用上次可视操作的模式,也重用上次的字
符数或行数但乘以 [count],起点为当前光标位置。
上次为列块可视模式时,列块宽度与高度同时乘以 [count]。
无历史可视操作时,选中 [count] 个字符,等价光标右移
[count] 个字符。'selection' 不是 "exclusive" 时,右移
次数减一。
V linewise-visual
V 进入行可视模式。
[count] 规则同上述 v 。
无历史可视操作时,选中 [count] 行。
CTRL-V blockwise-visual
[count]CTRL-V 进入列块可视模式。备注: 在 Windows 环境中,CTRL-V 可能
被映射为粘贴操作,而不会进入列块可视模式。参见
CTRL-V-alternative 。
[count] 规则同上述 v 。
无历史可视操作时,选中一行、[count] 列的列块。
在可视模式下,按 <Esc>、点击鼠标左键、或执行切换到其他缓冲区的跳转命令都会取消
高亮,不修改文本。在字符可视模式按 v 、列块可视模式按 `CTRL-V`、行可视模式按
V ,同样会退出可视模式。按 CTRL-Z 键会取消高亮,然后挂起编辑器或启动新外
壳。
键入 "v"、"CTRL-V" 和 "V" 时,新模式列表: v_v v_CTRL-V v_V
原模式 "v" "CTRL-V" "V"
普通模式 字符可视模式 列块可视模式 行可视模式
字符可视模式 普通模式 列块可视模式 行可视模式
列块可视模式 字符可视模式 普通模式 行可视模式
行可视模式 字符可视模式 列块可视模式 普通模式
gv v_gv reselect-Visual
gv 重新进入可视模式,重用上次选区范围与模式。
已在可视模式下时,交换当前选区和上次选区。
在可视模式下执行 "p" 或 "P" 粘贴后,本命令会选中粘贴文
本。
gn v_gn
gn 类似 n ,正向搜索前次搜索模式,然后启动可视模式选中匹
配项。
光标已位于匹配项上时,直接可视选中该项。
有操作符等待时,对匹配项执行相应操作。例如, dgn 删除
下一处匹配文本。
可视模式激活时,将选区扩展到下一处匹配的末尾。
适用 'wrapscan' 选项。
注意: 和 n 不同,搜索方向不取决于前次搜索命令。
gN v_gN
gN 类似 gn 但反向搜索,类似 N 。
<LeftMouse>
<LeftMouse> 设置光标位置。可视模式激活时,同时退出可视模式。仅当
'mouse' 选项含 'n' 或 'a' 才生效。点击位置距离屏幕末
不足 'so' 选项指定行数时,文本会向上滚动。同样,点击位
置距离屏幕首行不足 'so' 行时,文本会向下滚动。
<RightMouse>
<RightMouse> 可视模式未激活时,启动可视模式。高亮光标位置至点击位置
的文本。可视模式已激活时,将高亮选区离点击位置更近的一
端移动到点击位置。仅当 'mouse' 选项含 'n' 或 'a' 时才
生效。
备注: 'mousemodel' 设为 "popup" 时,应改用
<S-LeftMouse>,替代 <RightMouse>。
<LeftRelease>
<LeftRelease> 释放鼠标位置与按下位置不同时,等同于 <LeftMouse>。旧版
xterm 中,如果无法访问 xterm 所在的 X 显示 (通过
DISPLAY 环境变量或 -display 参数),则需要等到释放鼠标
后才会显示选择区域。仅当 'mouse' 选项含 'n' 或 'a' 时
才生效。
<LeftMouseNM> 鼠标内部键码,表示在状态行上点击以聚焦窗口。NM 代表
<LeftReleaseNM> non-mappable (不可映射)。用户不可使用此类键码,但可能
在部分场景中出现。
<A-LeftMouse> 启动或扩展列块可视区域,见 <A-LeftMouse> 。
可视模式未激活且 v 、 V 或 CTRL-V 命令前面带计数时,会以上次高亮选区的大小
作为初始值。之后可移动选区终点,然后键入操作符。同时沿用上次的模式 (字符、行、
或列块)。
- 行可视模式: 行数与计数相乘。
- 列块可视模式: 行数与列数分别与计数相乘。
- 单行字符 (普通) 可视模式: 字符数与计数相乘。
- 多行字符可视模式: 行数与计数相乘,末行沿用上次选区末行的字符数。
选区文本起点为光标位置。如果上次选区最后使用过 "$" 命令扩展高亮文本,则选区同
样会扩展到最长行的最右侧列。
要选中与上次完全相同的区域,可用 "gv" gv v_gv 命令。
v_<Esc>
<Esc> 可视模式下: 退出可视模式。
v_CTRL-C
CTRL-C 可视模式下: 退出可视模式。如果插入模式处于待恢复状态时
(模式提示显示 "-- (插入) 可视 --"),同时退出插入模式。
MS-Windows 上可能要改为 CTRL-Break doc-CTRL-Break 。
v_o
o 跳转到高亮选区的另一端 (Other): 将当前光标位置设为高亮
文本起点,光标跳转到选区另一端。选区范围实际保持不变。
v_O
O 跳转到高亮选区的又一端。类似 "o" 命令,但列块模式下光
标会跳转到水平方向 (同一行) 的另一端。该端所在字符占用
多个屏幕位置 (如 <Tab>) 时,高亮选区可能发生变化。
v_$
列块模式下使用 "$" 命令时,高亮选区右边界由选区最长行决定。一旦执行非纯上下方
向的移动命令,则该特性失效。
众多命令可移动选区终点。但是不能使用 Ex 命令,修改文本或放弃文件的命令。以下命
令 (包含以其开头的命令): "."、"&"、CTRL-^、"Z"、CTRL-]、CTRL-T、CTRL-R、CTRL-I
和 CTRL-O 会响铃并保留可视模式。
切换到同一缓冲区的另一窗口时,目标窗口内光标位置会自动调整以选中相同高亮选区。
特别适合在一个窗口查看选区起点,另一个窗口查看选区终点。此时可用鼠标右键
<RightMouse> (当 'mousemodel' 选项为 "popup" 时,应改用 <S-LeftMouse>) 拖动选
区任意一端。
可视区域上可用的操作符包括:
~ 切换大小写 v_~
d 删除 v_d
c 修改 (4) v_c
y 抽出 v_y
> 右移 (4) v_>
< 左移 (4) v_<
! 通过外部命令过滤 (1) v_!
= 通过 'equalprg' 选项指定的命令排版 (1) v_=
gq 按照 'textwidth' 指定宽度排版文本行 (1) v_gq
可用文本对象包括:
aw 一个单词 (含空白) v_aw
iw 内含单词 v_iw
aW 一个字串 (含空白) v_aW
iW 内含字串 v_iW
as 一个句子 (含空白) v_as
is 内含句子 v_is
ap 一个段落 (含空白) v_ap
ip 内含段落 v_ip
ab 一个 () 块 (含小括号) v_ab
ib 内含 () 块 v_ib
aB 一个 {} 块 (含大括号) v_aB
iB 内含 {} 块 v_iB
at 一个 <tag> </tag> 块 (含标签) v_at
it 内含 <tag> </tag> 块 v_it
a< 一个 <> 块 (含 <>) v_a<
i< 内含 <> 块 v_i<
a[ 一个 [] 块 (含 []) v_a[
i[ 内含 [] 块 v_i[
a" 一个双引号字符串 (含引号) v_aquote
i" 内含双引号字符串 v_iquote
a' 一个单引号字符串 (含引号) v_a'
i' 内含单引号字符串 v_i'
a` 一个反引号字符串 (含反引号) v_a`
i` 内含反引号字符串 v_i`
其他可用命令包括:
: 对高亮行执行 Ex 命令 v_:
r 修改 (4) v_r
s 修改 v_s
C 修改 (2) (4) v_C
S 修改 (2) v_S
R 修改 (2) v_R
x 删除 v_x
D 删除 (3) v_D
X 删除 (2) v_X
Y 抽出 (2) v_Y
p 放置 v_p
P 放置而不覆盖寄存器 v_P
J 合并行 (1) v_J
U 转为大写 v_U
u 转为小写 v_u
^] 跳转标签 v_CTRL-]
I 列块插入 v_b_I
A 列块追加 v_b_A
(1): 总是作用于整行,见 :visual_example 。
(2): 不使用 CTRL-V 列块模式时,作用于整行。
(3): 不使用 CTRL-V 列块模式时,作用于整行。使用 CTRL-V 时删除到行尾。
(4): 使用 CTRL-V 列块模式时,作用于列块。
注意 可用 :vmap 提供可视模式专用按键映射。示例,要使 "/" 命令不扩展选区,而
是搜索高亮文本:
:vmap / y/<C-R>"<CR>
(按本义键入 <> 记法 <> ,同时需要从 'cpoptions' 选项中移除 'B' 和 '<' 标志位)
要用 " 命令指定寄存器,可在操作符前加上该前缀,示例: v{move-around}"xd
要为命令加上计数,可在操作符前加上计数,示例: v{move-around}3> (将选中行向右
缩进 3 次)。
{move-around}
{move-around} 指任意一串移动命令。注意 和 {motion} 区分,后者仅代表 单个 移动
命令。
另一种操作可视选区的方法是在模式中使用 /\%V 项。例如,要将可视选区中所有 '('
替代为 '#':
:'<,'>s/\%V(/#/g
备注 可视模式下按 ":" 时,"'<,'>" 部分会自动填充。
提示: 开启 'virtualedit' 选项后,可在行尾之后或制表符中间位置设置列块的起点或
终点。
列块插入 v_b_I
对列块选区,执行 I{string}<ESC> 命令会在列块每行的块起始位置前插入 {string}。
仅对延伸至块范围内的行生效。过短的行不受影响。制表符会被拆分,保证视觉列对齐。
仅用于为文本行新增文本,不能删除文本。见 v_b_I_example 。
列块追加 v_b_A
对列块选区,执行 A{string}<ESC> 命令会在列块每行的块结束位置后追加 {string}。
当各行长短不一、导致块右边界不整齐时,存在以下几种不同行为:
1. 通过 <C-v>$ 创建的列块:
此时字符串追加到每行的行尾。
2. 通过 <C-v>{move-around} 创建的列块:
此时字符串追加到每行的列块末尾。必要时,自动填充空白字符补齐到块尾列。
见 v_b_A_example 。
备注: 对于未延伸至块范围的行,"I" 和 "A" 行为不同。这是有意的设计,满足不同编
辑需求。
仅用于为文本行新增文本,不能删除文本。见 v_b_I_example 。
列块修改 (c) v_b_c
列块内所有选中文本会被相同字符串替代。使用 "c" 命令时,先删除原有文本,然后进
入插入模式,此时键入文本 (不可换行)。按下 <Esc> 后,在所有原先选中行的相应位置
上会插入相同的键入文本。
列块修改 (C) v_b_C
类似 "c" 命令,但选区所有行上,会扩展选区到行尾。
v_b_<
列块平移 v_b_>
列块会按 'shiftwidth' 值平移。块右边界对平移量没有影响。右移操作会以块左边界决
定右移起始位置,空白填充会根据 'ts' 和 'et' 选项自动优化使用制表符。左移操作同
样会以块左边界作为左移终止位置。
见 v_b_>_example 。
见 v_b_<_example 。
列块替换 v_b_r
高亮选区内每个屏幕字符会被相同字符替换。制表符会被拆分,虚拟空白也会被替换,保
持屏幕布局不变。
见 v_b_r_example 。
重复执行可视模式操作符时,操作符作用的文本长度与上次操作保持一致:
- 行可视模式: 相同行数。
- 列块可视模式: 相同行数与列数。
- 单行字符 (普通) 可视模式: 相同字符数。
- 多行字符可视模式: 相同行数,末行沿用上次操作末行的字符数。
重复操作文本起点为光标位置。如果上次选区最后使用过 "$" 命令扩展高亮文本,则重
复操作同样会扩展到最长行的最右侧列。传入 . 命令的计数不生效。
:visual_example
目前 : 命令仅作用于整行。只选中一行中的部分文本时,执行 ":!date" 这类命令会
替换整行。
如果只想替换行内部分文本,需要自行编写映射。未来版本中 ":" 或许会支持部分行文
本操作。
下例会将选中文本替换为 "date" 命令输出: >vim
:vmap _a <Esc> >a<CR><Esc> <i<CR><Esc>!!date<CR>kgJgJ
(按本义键入 <> 记法 <> ,同时需要从 'cpoptions' 选项中移除 'B' 和 '<' 标志位)
映射拆解如下:
<Esc> 退出可视模式
`> 跳转到选区终点
a<CR><Esc> 在选区终点后断行
`< 跳转到选区起点
i<CR><Esc> 在选区起点前断行
!!date<CR> 通过 date 命令过滤选中文本
kJJ 合并各行,恢复原状
visual-search
以下映射可搜索选中文本: >vim
:vmap X y/<C-R>"<CR>
(按本义键入 <> 记法 <> ,同时需要从 'cpoptions' 选项中移除 'B' 和 '<' 标志位)
注意 文本中的特殊字符 (如 '.' 和 '*') 可能会引发问题。
列块可视模式示例 blockwise-examples
以下测试文本用于展示列块操作的具体命令及结果。所有示例假定光标初始于测试文本首
行的 'a' 字符处。
假定已使用模式行: ":ts=8:sw=4:"。
建议开启以下设置,高亮制表符: >vim
:set hls
/<TAB>
其中 <TAB> 为真实制表符。便于直观查看操作效果:
测试文本为:
abcdefghijklmnopqrstuvwxyz
abc defghijklmnopqrstuvwxyz
abcdef ghi jklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
1. fo<C-v>3jISTRING<ESC> v_b_I_example
abcdefghijklmnSTRINGopqrstuvwxyz
abc STRING defghijklmnopqrstuvwxyz
abcdef ghi STRING jklmnopqrstuvwxyz
abcdefghijklmnSTRINGopqrstuvwxyz
2. fo<C-v>3j$ASTRING<ESC> v_b_A_example
abcdefghijklmnopqrstuvwxyzSTRING
abc defghijklmnopqrstuvwxyzSTRING
abcdef ghi jklmnopqrstuvwxyzSTRING
abcdefghijklmnopqrstuvwxyzSTRING
3. fo<C-v>3j3l<.. v_b_<_example
abcdefghijklmnopqrstuvwxyz
abc defghijklmnopqrstuvwxyz
abcdef ghi jklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
4. fo<C-v>3j>.. v_b_>_example
abcdefghijklmn opqrstuvwxyz
abc defghijklmnopqrstuvwxyz
abcdef ghi jklmnopqrstuvwxyz
abcdefghijklmn opqrstuvwxyz
5. fo<C-v>5l3jrX v_b_r_example
abcdefghijklmnXXXXXXuvwxyz
abc XXXXXXhijklmnopqrstuvwxyz
abcdef ghi XXXXXX jklmnopqrstuvwxyz
abcdefghijklmnXXXXXXuvwxyz
选择模式外观类似可视模式,但可执行的命令差异很大,风格类似 Microsoft Windows
上的选区模式。开启 'showmode' 选项时,屏幕末行会显示 "-- 选择 --"。
进入选择模式的几种方法:
- 鼠标选中区域,且 'selectmode' 选项含 "mouse"。'mouse' 必须包含当前模式对应的
标志位。
- 按下 Shift 键并同时键入非可显示光标移动命令,且 'selectmode' 选项含 "key"。
例如: <S-Left> 和 <S-End>。'keymodel' 选项也必须包含 "startsel"。
- 键入 v 、 V 或 CTRL-V 命令,且 'selectmode' 选项含 "cmd"。
- 在普通模式下,键入 gh 、 gH 或 g_CTRL-H 命令。
- 在可视模式下,键入 CTRL-G。 v_CTRL-G
选择模式下的命令如下:
- 可显示字符、<NL> 和 <CR> 都会先删除选区文本并进入插入模式,然后插入该字符。
- 按下 Shift 键并同时键入非可显示移动命令,会扩展选区。'keymodel' 选项必须包含
"startsel"。
- 不 按 Shift 键并键入非可显示移动命令,会退出选择模式。'keymodel' 选项必须包
含 "stopsel"。
- ESC 会退出选择模式。
- CTRL-O 会临时切换到可视模式,执行单条命令。 v_CTRL-O
- CTRL-G 切换到可视模式。
- CTRL-R {register} 指定键入文本时,存放被删除文本的寄存器。 v_CTRL-R
除非指定 "_" (黑洞) 寄存器,否则同时会覆盖无名寄存器。
其余按键逻辑同可视模式。
在选择模式下使用操作符时,如果使用行选区,虽然选中整行作为操作对象,但操作行为
等同于字符选区。例如删除整行后,粘贴时可在一行中间插入。
选择模式专用键盘映射和菜单 Select-mode-mapping
使用 :vmap 或 :vmenu 命令定义的映射和菜单,在可视模式和选择模式下都生效。
在选择模式下触发时,Vim 会自动切换到可视模式,确保行为与可视模式保持一致。如果
不希望如此,可用 :xmap (专用于可视模式) 或 :smap (专用于选择模式),以及用
于菜单的 :xmenu 或 :smenu 。
一个特殊案例是:
:vnoremap <C-K> <Esc>
该映射在可视模式下会结束可视模式,但在选择模式无效,因为执行完映射后,会自动恢
复选择模式。正确写法是:
:snoremap <C-K> <Esc>
用户一般预期可显示字符会直接替换选区文本。因此应避免在选择模式下映射可显示字
符。或在执行 :map 和 :vmap 后,用 :sunmap 单独撤销选择模式下的映射。
映射或菜单执行完毕后,Vim 会自动重新激活选区并回到选择模式。但以下情况除外: 选
区被删除,缓冲区切换,或窗口布局发生变更。
键入字符触发删除选区并进入插入模式时,该键入字符会应用插入模式映射。这容易引起
混淆,因为选择模式输入的字符触发了插入模式映射。语言映射同样也会被应用。
gV v_gV
gV 选择模式映射或菜单执行完毕后,不再自动选中选区。本命令
应放在映射或菜单命令末尾,或至少在所有选区操作之后。
gh
gh 启动字符选择模式。类似 v 命令,但进入选择模式而非可
视模式。
助记: "get highlighted"。
gH
gH 启动行选择模式。类似 V 命令,但进入选择模式而非可视
模式。
助记: "get Highlighted"。
g_CTRL-H
g CTRL-H 启动列块选择模式。类似 CTRL-V 命令,但进入选择模式而
非可视模式。
助记: "get Highlighted"。
vim:tw=78:ts=8:noet:ft=help:norl: