visual

visual.txt 适用于 Vim 9.2 版本。 最近更新: 2026年7月 VIM 参考手册 by Bram Moolenaar 译者: quhongjun 可视模式 Visual Visual-mode visual-mode 可视模式是一种灵活易用方式,可以为操作符选中一段文本。它也是选中文本列块的唯一 方式。 相关介绍请参考用户手册 04.4 一节。 1. 使用可视模式 visual-use 2. 进入和退出可视模式 visual-start 3. 改变可视区域 visual-change 4. 对可视区域执行操作 visual-operators 5. 列块操作 blockwise-operators 6. 重复 visual-repeat 7. 示例 visual-examples 8. 选择模式 Select-mode {自 Vim 7.4.200 起, +visual 特性始终启用}

1. 使用可视模式 visual-use

可视模式使用时分为三步: 1. 按 v 、 V 或 CTRL-V 标记文本起点。 将光标所在字符标记为文本起点。 2. 移动光标到文本终点。 从可视模式起点到光标所在字符间的文本 (含) 会被高亮。 3. 键入操作符命令。 高亮文本会执行对应操作。 'highlight' 选项可设置可视模式高亮的显示风格。 'virtualedit' 选项允许将光标定位到不存在字符的位置。 高亮文本缺省包含光标所在字符。但 'selection' 选项设为 "exclusive" 且光标刚好位 于选区之后时,则不包含光标所在字符。 使用 v 命令时,起点前、终点后的文本不会被高亮。但除 ~ 和 U 外, 所有的 大写和非字母操作符仍会作用于整行。参见下方操作符列表。 visual-block 使用 CTRL-V (列块可视模式) 时,高亮区域为起点到光标之间的一个矩形选区。部分 操作符仍会作用于整行 (见下方列表)。修改 ( c ) 和替代 ( s ) 操作会先删除高亮文 本,然后从选区左上角进入插入模式。

2. 进入和退出可视模式 visual-start

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 。

3. 改变可视区域 visual-change

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>) 拖动选 区任意一端。

4. 对可视区域执行操作 visual-operators

可视区域上可用的操作符包括: ~ 切换大小写 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 备注 可视模式下按 ":" 时,"'<,'>" 部分会自动填充。

5. 列块操作 blockwise-operators

提示: 开启 '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 。

6. 重复 visual-repeat

重复执行可视模式操作符时,操作符作用的文本长度与上次操作保持一致: - 行可视模式: 相同行数。 - 列块可视模式: 相同行数与列数。 - 单行字符 (普通) 可视模式: 相同字符数。 - 多行字符可视模式: 相同行数,末行沿用上次操作末行的字符数。 重复操作文本起点为光标位置。如果上次选区最后使用过 "$" 命令扩展高亮文本,则重 复操作同样会扩展到最长行的最右侧列。传入 . 命令的计数不生效。

7. 示例 visual-examples

: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

8. 选择模式 Select Select-mode

选择模式外观类似可视模式,但可执行的命令差异很大,风格类似 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: