可视化
Nvim :help
页面,生成 于 源代码,使用 tree-sitter-vimdoc 解析器。
可视模式是一种灵活且简便的方式,用于选择文本以供操作符使用。这是选择文本块的唯一方法。
使用可视模式包含三个步骤:1. 使用“v”、“V”或CTRL-V
标记文本的开始位置。光标下的字符将用作起始位置。 2. 移动到文本的末尾位置。从可视模式开始位置到光标下的字符(包括该字符)的文本将被高亮显示。 3. 输入操作符命令。高亮显示的字符将被操作。
高亮显示的文本通常包括光标下的字符。但是,当
'selection' 选项设置为“exclusive”且光标位于可视区域之后时,光标下的字符将不会被包含。
使用“v”时,开始位置之前的文本和结束位置之后的文本不会被高亮显示。但是,除了“~”和“U”之外,所有大写和非字母操作符都会对整行进行操作。请参见下面的操作符列表。
visual-block 使用
CTRL-V
(块级可视模式)时,高亮显示的文本将是起始位置和光标之间的矩形区域。但是,一些操作符仍会对整行进行操作(请参见下面的列表)。更改和替换操作符会删除高亮显示的文本,然后从左上角位置开始插入。
v charwise-visual [count]v 以字符为单位启动可视模式。使用 [count] 选择与上次可视操作中使用的字符或行数相同的数量,但在当前光标位置,乘以 [count]。当上次可视操作是在块上时,块的宽度和高度都将乘以 [count]。如果没有上次可视操作,则选择 [count] 个字符。这与将光标向右移动 N * [count] 个字符类似。当
'selection' 不是“exclusive”时,会少移动一个字符。
V linewise-visual [count]V 以行为单位启动可视模式。使用 [count] 选择与上次可视操作中使用的行数相同的数量,但在当前光标位置,乘以 [count]。如果没有上次可视操作,则选择 [count] 行。
如果您在可视模式下使用
<Esc>
,单击鼠标左键或使用任何跳转到其他缓冲区的命令,高亮显示将停止,并且不会影响任何文本。当您在字符级可视模式下按“v”、在块级可视模式下按“CTRL-V”或在行级可视模式下按“V”时,也会出现这种情况。如果您按 CTRL-Z,高亮显示将停止,并且编辑器将被挂起或启动一个新的 shell
CTRL-Z。
普通 可视 块级可视 行级可视 可视 普通 块级可视 行级可视 块级可视 可视 普通 行级可视 行级可视 可视 块级可视 普通
gn v_gn gn 像使用
n
一样,向前搜索上一次使用的搜索模式,并启动可视模式以选择匹配项。如果光标位于匹配项上,则会视觉地选择它。如果有一个操作符正在等待,则会对匹配项进行操作。例如,“dgn”会删除下一个匹配项的文本。如果可视模式处于活动状态,则会扩展选择范围,直到下一个匹配项的末尾。
'wrapscan' 选项适用。
注意:与
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
。
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>
)来拖动可视区域的任一端。
(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 模式中按 ":" 时,"'<,'>" 会自动出现。
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",但选择会扩展到所有行的行尾。
重复 Visual 模式操作符时,操作符将应用于与上次相同数量的文本
行式 Visual 模式:相同数量的行。
块式 Visual 模式:相同数量的行和列。
单行内的普通 Visual 模式:相同数量的字符。
多行的普通 Visual 模式:相同数量的行,最后一行中的字符数量与上次最后一行中的字符数量相同。文本的开头是光标位置。如果 "$" 命令用作扩展突出显示文本的最后一个命令之一,则重复将应用于最长行的最右边列。传递给 .
命令的任何计数都不会使用。
123(hello)321 456(world)654 456(NOT THIS)654
寄存器 "x" 包含命令 yi(VP
,视觉选择前两行并键入 @x
,则会产生
hello world 456(NOT THIS)654
: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-块示例
blockwise-examples使用以下文本,我将指示生成块的命令以及下面的结果。在所有情况下,光标都位于测试文本第一行的 "a" 上。假定以下模式行设置 ":ts=8:sw=4:"。
:set hls /<TAB>(其中 <TAB>
是一个真实的制表符)会很有帮助。这有助于可视化操作。
测试文本是
abcdefghijklmnopqrstuvwxyz abc defghijklmnopqrstuvwxyz abcdef ghi jklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz
abcdefghijklmnSTRINGopqrstuvwxyz abc STRING defghijklmnopqrstuvwxyz abcdef ghi STRING jklmnopqrstuvwxyz abcdefghijklmnSTRINGopqrstuvwxyz
abcdefghijklmnopqrstuvwxyzSTRING abc defghijklmnopqrstuvwxyzSTRING abcdef ghi jklmnopqrstuvwxyzSTRING abcdefghijklmnopqrstuvwxyzSTRING
abcdefghijklmnopqrstuvwxyz abc defghijklmnopqrstuvwxyz abcdef ghi jklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz
abcdefghijklmn opqrstuvwxyz abc defghijklmnopqrstuvwxyz abcdef ghi jklmnopqrstuvwxyz abcdefghijklmn opqrstuvwxyz
abcdefghijklmnXXXXXXuvwxyz abc XXXXXXhijklmnopqrstuvwxyz abcdef ghi XXXXXX jklmnopqrstuvwxyz abcdefghijklmnXXXXXXuvwxyz
选择模式类似于 Visual 模式,但接受的命令却大不相同。这类似于 Microsoft Windows 中的选择模式。当
'showmode' 选项设置时,"-- SELECT --" 会显示在最后一行。
进入选择模式
在 Normal 模式中使用 "gh"、"gH" 或 "g_CTRL-H" 命令。
选择模式中的命令
可打印字符、<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 模式中按预期处理。
在选择模式中使用操作符,并且选择是行式的,则会对选定行进行操作,但类似于字符选择。例如,当删除整行时,它可以稍后粘贴到行的中间。
当使用
: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"。