Vim的“(插入)可视”模式是什么?

6
"(插入) 可视"模式可以通过从插入模式开始按下CTRL+Ov 进入。这将进入可视模式,但在vim内部显示为"(插入) 可视",从此模式按下Esc会回到插入模式,而不是正常模式。"(插入) 可视"模式也可以通过从插入模式中按下箭头键进入。

两个相关问题:

  1. 似乎没有关于这种特殊模式的文档。有没有一种简单的方法来搜索有关它的信息?(编辑:我知道CTRL+O通常做什么。与可视模式的交互似乎很特殊。第一段是最容易引用这种模式的方式,因为我不知道可搜索的名称。)

  2. 如何可靠地编写vmap映射?也就是说,有没有一种一致的方法来离开可视模式并进入正常模式或插入模式?

4个回答

14
插入模式下,<C-o>允许您在不离开插入模式的情况下执行普通模式命令。Vim试图使用(insert)指示新状态。由于您现在暂时处于普通模式下,按下v会将您置于可视模式中,并且Vim会再次尝试使用(insert) VISUAL指示新状态。 Vim之所以处于这种状态,仅是因为执行的命令序列,正如其他人指出的那样,该行为是有文档记录的。此时,使用<Esc>将您带回到插入模式,因为那是您的初始模式。
对于从插入-> (普通) -> 可视的可靠方法是否存在,比我更深入了解Vim的人可能能告诉您,但我想整个想法听起来很可疑。
正确的用法是:
  1. 普通模式下完成一些操作
  2. 进入插入模式以"插入"某些内容
  3. 退出插入模式以返回普通模式
  4. 普通模式下完成更多操作
  5. 进入可视模式
  6. 可视模式中完成一些操作
  7. 退出可视模式以返回普通模式
  8. 等等。
基本上,您不应该离普通模式超过一个<Esc>
我无法想象在<C-o>之后使用v有任何意义的情况。

最佳和首选的使用 Vim 的方式是尽可能地避免进入 插入 模式。使用 <C-o> 以避免退出 插入 模式是一个非常糟糕的策略。我不知道这是否是你所做的,但如果是,你应该尽快重新考虑这种方法。

但我怀疑你正在尝试做一些其他事情,而你却认为我们不需要知道。


"(插入) 可视" 模式也可以通过从插入模式按下换行键进入。这是我通常遇到的情况。问题的确是被 "其他事情" 引起的: 我正在调试 vim 映射,如果它是从 可视 vs (插入) 可视 激活的,那么它的行为完全不同。进一步的测试表明,尽管 Vim 通常会费尽心思使其无关紧要,例如 vmap vnoremap x <Esc>jjj 也可以从 (插入) 可视 正常工作。 - Ein
Ctrl+O, v 有助于在使用可视模式进行编辑时的一种情况。例如,我有可视模式绑定,调用插件执行包装操作,例如从正常模式,viw) 将当前单词包装在括号内,而 ve) 将从当前光标位置到单词末尾的内容包装在括号内。不理想的是,当我从插入模式切换回正常模式时,它会将光标向后移动一个位置,然后我必须从插入模式键入 <Esc>lve),但是在这里我们可以使用 <C-O>ve),并且可以通过插入模式绑定进一步缩短。 - Steven Lu
1
旧帖子,但我认为我同意@StevenLu的观点,并且认为说使用临时模式总是“非常糟糕的策略”有点过了。例如,如果我在插入模式下想跳过一个单词但继续输入,使用<C-o>w比首先退出到正常模式<Esc>wi更方便。如果光标被移回,甚至可能需要执行2w - Jerome Beckett
幸好我在回答中没有使用“总是”这个词。顺便说一下,你提到的用例只需要根据你的系统使用<S-Right><C-Right>即可,无需使用复杂的组合键。 - romainl

6
关于第二个问题:您可以使用<C-\><C-n>从任何其他模式切换到普通模式。没有可靠地切换到视觉或插入模式的命令,但如果您只需要在可视化之后始终切换到普通模式,则足够了。请注意,大多数可视化模式映射在i<C-o>v特殊模式下无需修改即可工作。

谢谢,这解决了第二个问题。我有一个相关的问题,关于在 i<C-o>v 中地图是如何工作的(这也是引发这个问题的原因):https://dev59.com/x3HYa4cB1Zd3GeqPLGdB - Ein

2

这些内容在:h Operator-pending和紧接着的:h mode-switching中有详细说明。可视模式下的映射同样适用于插入可视模式。请参阅:h map-modes了解模式映射的概述。 vmap会为可视和选择模式进行映射,xmap仅为可视模式映射,而不是选择模式,smap仅为选择模式映射,而不是可视模式。通常,您应该使用这些映射命令的noremap版本,以避免出现意外行为。


1
你在这里犯了一个错误:v[nore]map(以及[nore]map)定义了选择和可视模式的映射(对于noremap,还包括正常模式和操作挂起),而x[nore]map仅用于可视模式,s[nore]map则用于选择模式。 - ZyX

0

关于第一个问题。

在插入模式下,按下CTRL+O可以执行一个命令,然后返回到插入模式。请参见:h i_CTRL-O

关于第二个问题。

我认为没有可靠的方法可以退出到任何一种模式。最可靠的方法是从你想要结束的模式开始。


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