什么时候在Vim中使用可视模式?

15

我对Vim还比较陌生,正在学习其中的使用方法,但尚未找到进入可视模式的实际用途。

在哪些场景下,可视模式特别有用呢?

是否有一些只能在可视模式下执行的操作?


我在阅读答案后仍然没有弄清楚它的用途。我相信有人会用到它,但对于我来说,我仍然更喜欢TextWrangler / BBEdit。 - Sridhar Sarnobat
7个回答

10

当我想要突出文本段落时,我使用视觉模式。在标准模式下,我首先键入v ,然后启用视觉模式。接下来,我使用箭头键移动光标。这将导致从我的起点到当前光标位置之间的文本被突出显示。一旦像这样选择了一个文本段落,则在命令模式(通过键入:)中输入命令(例如搜索 / 替换)仅影响所选区域。

另一个有用的视觉命令是shift+v(可视化行)。这与上述相同,但是它每次选择整行而不是单个字符。


2
另一个(有时)方便的命令是ctrl-shift-v,以使用可视块模式,在其中您可以选择正方形形状的文本,而不仅仅是按行选择。我发现它在日志文件中很方便。 - Mark McDonald
3
仅供参考,要进入列选择(“方形选择”)模式,您只需要按Ctrl-V键(不幸的是,Vim无法区分Ctrl-Foo和Ctrl-Shift-Foo)。 - overthink

4
  1. 当你想要注释一段文本时。
    在命令模式下:
    Shift + vctrl +vjkI#(注释字符)然后按Esc

    Vim会将注释字符插入到块的开头。

  2. 当我使用Gvim时,我发现通过可视模式更容易复制数据到剪贴板
    在命令模式下:
    Shift + vjk"+y

    这里+是剪贴板寄存器。

    对我来说,这比使用标记更易读。

  3. 用于手动缩进

    Shift + vShift + >向右移动。 Shift + <向左移动。.重复

这很有趣 :-)


@Cherian,使用按钮图像进行键盘输入的技巧很棒。这个标记是什么? - AJ.
我不理解第一个例子,我认为它演示了如何在块的开头插入单个字符,但我不明白为什么使用可视模式来插入单个字符很有用,因为你可以直接导航到那里并键入单个字符。我期望看到字符插入到每行的开头。如果我误解了,具体是哪个操作/按键可以在每行执行此操作? - Mark McDonald

4
视觉模式的一个好处是,由于Vim专注于模态,您可以执行大多数您习惯于使用的命令(例如使用:s进行搜索/替换,使用d删除文本或使用r替换文本),同时也可以看到确切的影响范围--这使您能够确定您正在做的任何事情的确切范围。
此外,正如其他人提到的那样,您可以通过在visual block模式(ctrl+v)中选择每行的第一个字符,按下I在第一个字符之前插入,键入您想要插入的任何内容,然后通过按Esc返回正常模式来轻松插入前缀(例如注释字符或对齐的&或LaTeX中的\item)。
最后,还有一种视觉模式是visual lineShift+v),它允许您快速选择多个行。从那里,您可以使用><更改它们的缩进(在前面加上数字以缩进该数量的制表符),使用dy删除或复制这些行,使用zf从这些行创建新的折叠,或使用任何其他基于选择的命令。
最后,还有很多其他很酷的事情可以在视觉模式下完成,包括使用gv重新选择您上次的visual[line/block]模式选择,使用gU将视觉选择转换为大写或gu转换为小写,以及许多其他功能。

1
关于“查看受影响的内容”:Vim 的一些功能(我知道 :s 和 :g 是这样的)始终在整行上工作,即使只选择了部分行也是如此。 - daniel kullmann

3

除了其他(很棒的)答案外,这是定义动作范围的一种简单方法。例如,限制搜索和替换到特定方法...

假设您有以下代码:

function foo() {
    abc();
    while (1) {
        def();
        abc();
    }
}

您可以将光标放在任何大括号或圆括号上,然后按下v%:s/abc/xyz/g,您的搜索和替换将有一个定义的范围,在此范围内执行操作。


1

如果您想对一个不容易描述为基本移动命令的文本部分应用命令,那么可视模式非常有用。您可以使用复杂的移动序列在可视模式下选择一些文本,然后对该选择应用命令。


0

我还没有看到以下内容被提及,可能是因为它们很微妙。

1 - 无需使用未命名寄存器

每当你复制(yank)一些文本,然后想要 d 更改其他文本,例如,diw 删除内部单词,Vim 将把删除的文本放入未命名寄存器中。然后,如果你尝试粘贴,它将只是将删除的文本粘贴回来,除非你使用 "0p 从 0 寄存器中粘贴。

但是通过 visual 模式,你可以像这样做 viwp,而不必处理寄存器。

因此,为了比较,在括号内复制和替换:

yiw -> 移动到某个地方 -> vi(p

yiw -> 移动 -> ci(<C-r>0p

yiw -> 移动 -> "_di(p

yiw -> 移动 -> di("0P

注意:这也适用于删除文本并将其粘贴回文本对象的情况。请参见此处

2 - 跳转到文本对象的某个部分

如果您想要跳转到文本对象的开头或结尾,您可以在可视化模式下选择它,然后按 o键。例如, va" 选择引号内的任何位置,然后按 o 键跳转到匹配的引号,就像匹配括号所用的 % 按键一样。


0

我经常发现自己使用可视块模式(Ctrl + v)比其他任何可视模式都要多。

一旦你意识到这种模式,你就可以轻松地删除缩进、注释等。根据我的经验,这通常比想出一个等效的搜索和删除语句更快。

你也可以通过选择文本块并按下 I,输入你想添加的内容,然后按下 Esc(注意:你可能需要重新绘制屏幕(例如移动光标)才能看到效果)来添加缩进(或像 Cherian 所说的注释)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接