可视化

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


可视模式是一种灵活且简便的方式,用于选择文本以供操作符使用。这是选择文本块的唯一方法。
在用户手册的第 04.4 节中介绍了此模式。

1. 使用可视模式 visual-use

使用可视模式包含三个步骤:1. 使用“v”、“V”或CTRL-V标记文本的开始位置。光标下的字符将用作起始位置。 2. 移动到文本的末尾位置。从可视模式开始位置到光标下的字符(包括该字符)的文本将被高亮显示。 3. 输入操作符命令。高亮显示的字符将被操作。
hl-Visual 组决定可视化选择的突出显示方式。 'virtualedit' 选项可用于允许将光标定位到没有实际字符的位置。
高亮显示的文本通常包括光标下的字符。但是,当 'selection' 选项设置为“exclusive”且光标位于可视区域之后时,光标下的字符将不会被包含。
使用“v”时,开始位置之前的文本和结束位置之后的文本不会被高亮显示。但是,除了“~”和“U”之外,所有大写和非字母操作符都会对整行进行操作。请参见下面的操作符列表。
visual-block
使用CTRL-V(块级可视模式)时,高亮显示的文本将是起始位置和光标之间的矩形区域。但是,一些操作符仍会对整行进行操作(请参见下面的列表)。更改和替换操作符会删除高亮显示的文本,然后从左上角位置开始插入。

2. 启动和停止可视模式 visual-start

v charwise-visual [count]v 以字符为单位启动可视模式。使用 [count] 选择与上次可视操作中使用的字符或行数相同的数量,但在当前光标位置,乘以 [count]。当上次可视操作是在块上时,块的宽度和高度都将乘以 [count]。如果没有上次可视操作,则选择 [count] 个字符。这与将光标向右移动 N * [count] 个字符类似。当 'selection' 不是“exclusive”时,会少移动一个字符。
V linewise-visual [count]V 以行为单位启动可视模式。使用 [count] 选择与上次可视操作中使用的行数相同的数量,但在当前光标位置,乘以 [count]。如果没有上次可视操作,则选择 [count] 行。
CTRL-V blockwise-visual [count]CTRL-V 以块为单位启动可视模式。
如果您在可视模式下使用<Esc>,单击鼠标左键或使用任何跳转到其他缓冲区的命令,高亮显示将停止,并且不会影响任何文本。当您在字符级可视模式下按“v”、在块级可视模式下按“CTRL-V”或在行级可视模式下按“V”时,也会出现这种情况。如果您按 CTRL-Z,高亮显示将停止,并且编辑器将被挂起或启动一个新的 shell CTRL-Z
输入后进入新模式: 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> 的位置不同,则与<LeftMouse> 的作用相同。在旧版本的 xterm 中,您在释放按钮之前不会看到选定的区域,除非可以访问运行 xterm 的显示器(通过 DISPLAY 环境变量或 -display 参数)。只有当 'mouse' 选项包含“n”或“a”时才会生效。
如果可视模式未处于活动状态,并且“v”、“V”或CTRL-V 前面有一个计数,则先前高亮显示区域的大小将被用作起始位置。然后您可以移动高亮显示区域的末尾位置并提供一个操作符。将使用旧区域的类型(字符、行或块级)。
行级可视模式:行数将乘以计数。
块级可视模式:行数和列数将乘以计数。
在一行内的普通可视模式:字符数将乘以计数。
跨多行的普通可视模式:行数将乘以计数,在最后一行中,将使用与先前高亮显示区域的最后一行中相同的字符数。文本的起始位置是光标位置。如果“$”命令用作扩展高亮显示文本的最后一个命令之一,则该区域将扩展到最长行的最右列。
如果您想高亮显示与上次完全相同的区域,可以使用“gv” gv v_gv
v_<Esc>
<Esc> 在可视模式下:停止可视模式。 v_META v_ALT ALT (META) 可能会像<Esc> 一样起作用,如果该组合键没有被映射。例如,如果<A-x> 没有可视模式映射,则<A-x> 会像<Esc>x 一样起作用。
v_CTRL-C
CTRL-C 在可视模式下:停止可视模式。当插入模式处于等待状态(模式消息显示“-- (insert) VISUAL --”)时,也会停止它。在 MS-Windows 上,您可能需要按CTRL-Break

3. 更改可视区域 visual-change

v_o
o 转到高亮显示文本的另一端:当前光标位置将成为高亮显示文本的起始位置,并将光标移动到高亮显示文本的另一端。高亮显示的区域保持不变。
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 一个 WORD(含空格) v_aW iW 内部 WORD 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 命令(1) 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 yank(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" 命令可用于专门映射 Visual 模式中的键。例如,如果您希望 "/" 命令不扩展 Visual 区域,而是使用突出显示的文本进行搜索
:vmap / y/<C-R>"<CR>
(在 <> 符号 <> 中,键入时应按字面意思键入;您需要从 'cpoptions' 中删除 "B" 标志。
如果您想使用 """ 命令给出寄存器名称,请在键入操作符字符之前执行此操作:"v{move-around}"xd"。
如果您想为命令提供一个计数,请在键入操作符字符之前执行此操作:"v{move-around}3>"(将行向右移动 3 个缩进)。
{move-around}
{move-around} 是任何移动命令序列。请注意它与 {motion} 的区别,{motion} 仅包含一个移动命令。
操作 Visual 区域的另一种方法是使用模式中的 /\%V 项目。例如,将 Visual 区域中的所有 "(" 替换为 "#"
:'<,'>s/\%V(/#/g
请注意,当您在 Visual 模式中按 ":" 时,"'<,'>" 会自动出现。

5. 块操作符 blockwise-operators

提醒:使用 'virtualedit' 以便选择从行尾或制表符中间开始或结束的块。
Visual-块插入 v_b_I
对于块选择,I{string}<ESC> 将在块中每行的开头插入 {string},前提是该行延伸到块中。因此,短行将保持不变。制表符将被分割以保留视觉列。仅适用于向行添加文本,不适用于删除。参见 v_b_I_example
Visual-块追加 v_b_A
对于块选择,A{string}<ESC> 将在块中每行的末尾追加 {string}。由于行长不同,块的 RHS 不直的情况有一些不同的行为
1. 块是使用 <C-v>$ 创建的。在这种情况下,字符串将追加到每行的末尾。2. 块是使用 <C-v>{move-around} 创建的。在这种情况下,字符串将追加到每行块的末尾,并插入空格以填充到块末尾列。参见 v_b_A_example注意:"I" 和 "A" 对未延伸到选定块中的行有不同的行为。这是有意为之的,这样您就可以按照自己的意愿进行操作。仅适用于向行添加文本,不适用于删除。
Visual-块更改 v_b_c
块中的所有选定文本将被替换为相同的文本字符串。使用 "c" 时,选定文本将被删除,并开始插入模式。然后您可以输入文本(不含换行符)。当您按 <Esc> 时,相同的字符串将插入到所有先前选择的行中。
Visual-块更改 v_b_C
类似于使用 "c",但选择会扩展到所有行的行尾。
v_b_<
Visual-块移位 v_b_>
块将被 'shiftwidth' 移位。块的 RHS 与之无关。块的 LHS 决定从哪里应用向右移位,填充包括根据 'ts''et' 最优地分割的制表符。块的 LHS 决定向左移位的截止点。参见 v_b_>_example。参见 v_b_<_example
Visual-块替换 v_b_r
突出显示区域中的每个屏幕字符都将被替换为相同的字符,即制表符将被分割,虚拟空格将被替换,保持屏幕布局。参见 v_b_r_example

6. 重复 visual-repeat

重复 Visual 模式操作符时,操作符将应用于与上次相同数量的文本
行式 Visual 模式:相同数量的行。
块式 Visual 模式:相同数量的行和列。
单行内的普通 Visual 模式:相同数量的字符。
多行的普通 Visual 模式:相同数量的行,最后一行中的字符数量与上次最后一行中的字符数量相同。文本的开头是光标位置。如果 "$" 命令用作扩展突出显示文本的最后一个命令之一,则重复将应用于最长行的最右边列。传递给 . 命令的任何计数都不会使用。
Visual 模式 default-mappings "@" 和 "Q" 如果选择是行式的,则为所有选定行重复一个寄存器。有关详细信息,请参见 v_@-defaultv_Q-default。例如,给定以下文本
123(hello)321 456(world)654 456(NOT THIS)654
寄存器 "x" 包含命令 yi(VP,视觉选择前两行并键入 @x,则会产生
hello world 456(NOT THIS)654

7. 示例 visual-examples

:visual_example
当前,":" 命令仅对整行起作用。当您选择部分行时,执行类似于 ":!date" 的操作将替换整行。如果您只想替换部分行,则需要为此创建一个映射。在将来的版本中,":" 可能会对部分行起作用。
以下是一个示例,使用 "date" 的输出替换选定文本
:vmap _a <Esc>`>a<CR><Esc>`<i<CR><Esc>!!date<CR>kJJ
(在 <> 符号 <> 中,键入时应按字面意思键入;您需要从 'cpoptions' 中删除 "B" 标志。
此操作执行以下操作: <Esc> 停止 Visual 模式 > 转到 Visual 区域的末尾 a<CR><Esc> 在 Visual 区域之后换行 < 跳到 Visual 区域的开头 i<CR><Esc> 在 Visual 区域之前换行 !!date<CR> 使用 date 筛选 Visual 文本 kJJ 将行重新连接在一起
visual-search
以下是一个映射的想法,它可以实现对选定文本进行搜索
:vmap X y/<C-R>"<CR>
(在 <> 符号 <> 中,键入时应按字面意思键入;您需要从 'cpoptions' 中删除 "B" 标志。
请注意,特殊字符(如 "." 和 "*")会导致问题。
Visual-块示例 blockwise-examples
使用以下文本,我将指示生成块的命令以及下面的结果。在所有情况下,光标都位于测试文本第一行的 "a" 上。假定以下模式行设置 ":ts=8:sw=4:"。
: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

选择模式类似于 Visual 模式,但接受的命令却大不相同。这类似于 Microsoft Windows 中的选择模式。当 'showmode' 选项设置时,"-- SELECT --" 会显示在最后一行。
进入选择模式
使用鼠标选择区域,并且 'selectmode' 包含 "mouse"。 'mouse' 还必须包含当前模式的标志。
使用不可打印的移动命令,并按住 Shift 键,并且 'selectmode' 包含 "key"。例如:<S-Left><S-End>'keymodel' 还必须包含 "startsel"。
使用 "v"、"V" 或 CTRL-V 命令,并且 'selectmode' 包含 "cmd"。
在 Normal 模式中使用 "gh"、"gH" 或 "g_CTRL-H" 命令。
从 Visual 模式中按 CTRL-Gv_CTRL-G
选择模式中的命令
可打印字符、<NL><CR> 会导致选择被删除,并且 Vim 进入插入模式。输入的字符将被插入。
不可打印的移动命令,按住 Shift 键会扩展选择。 'keymodel' 必须包含 "startsel"。
不可打印的移动命令,不按 Shift 键,会停止选择模式。 'keymodel' 必须包含 "stopsel"。
ESC 停止选择模式。
CTRL-O 切换到 Visual 模式,持续时间为一个命令。 v_CTRL-O
CTRL-G 切换到 Visual 模式。
CTRL-R {register} 选择要用于键入文本时删除的文本的寄存器。 v_CTRL-R
除非您指定 "_"(黑洞)寄存器,否则未命名寄存器也会被覆盖。
否则,输入的字符将在 Visual 模式中按预期处理。
在选择模式中使用操作符,并且选择是行式的,则会对选定行进行操作,但类似于字符选择。例如,当删除整行时,它可以稍后粘贴到行的中间。
选择模式中的映射和菜单。 Select-mode-mapping
当使用 :vmap:vmenu 命令定义映射和菜单时,它们在 Visual 模式和 Select 模式下都起作用。当在 Select 模式下使用它们时,Vim 会自动切换到 Visual 模式,以便实现与 Visual 模式相同的行为。如果您不希望这样做,请使用 :xmap:smap
一个特殊的边缘情况
:vnoremap <C-K> <Esc>
这在 Visual 模式下会结束 Visual 模式,但在 Select 模式下不起作用,因为在执行映射的键后会恢复 Select 模式。您需要使用
:snoremap <C-K> <Esc>
用户希望可打印字符替换选定区域。因此,请避免在 Select 模式下映射可打印字符。或者在 :map:vmap 之后使用 :sunmap 来删除 Select 模式的映射。
映射或菜单完成后,选择将再次启用并进入 Select 模式,除非选定区域被删除,另一个缓冲区成为当前缓冲区或窗口布局发生了更改。
当输入的字符导致删除选择并启动 Insert 模式时,Insert 模式映射将应用于该字符。这可能会引起一些混淆,因为这意味着 Insert 模式映射应用于在 Select 模式下输入的字符。语言映射也会应用。
gV v_gV gV 避免在 Select 模式映射或菜单完成后自动重新选择 Visual 区域。将此放在映射或菜单的末尾之前。至少它应该在对选择的任何操作之后。
gh
gh 启动 Select 模式,字符级。这类似于 "v",但启动 Select 模式而不是 Visual 模式。助记符:"get highlighted"。
gH
gH 启动 Select 模式,行级。这类似于 "V",但启动 Select 模式而不是 Visual 模式。助记符:"get Highlighted"。
g_CTRL-H
g CTRL-H 启动 Select 模式,块级。这类似于 CTRL-V,但启动 Select 模式而不是 Visual 模式。助记符:"get Highlighted"。
主要内容
命令索引
快速参考