【问题标题】:Vim's '(insert) VISUAL' mode?Vim 的“(插入)视觉”模式?
【发布时间】:2018-01-24 23:33:41
【问题描述】:

(insert) VISUAL”模式可以通过 CTRL+O , v 进入插入模式。这将进入可视模式,但在 vim 中显示为“(insert) VISUAL”,在此模式下按 Esc 会使您回到插入模式,而不是正常模式。 “(insert) VISUAL”模式也可以通过插入模式的移动箭头键进入。

两个相关问题:

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

  2. 如何可靠地编写vmap 映射?即,是否有一致的方法可以离开视觉模式并最终进入正常模式?还是一直处于插入模式?

【问题讨论】:

    标签: vim insert


    【解决方案1】:

    insert 模式下,<C-o> 允许您在不离开 insert 模式的情况下执行 正常 模式命令。 Vim 尝试用(insert) 表示新状态。由于你现在暂时处于正常模式,点击v会让你进入视觉模式,Vim再次尝试用(insert) VISUAL指示新状态。 Vim 处于这种状态只是因为 you 执行的命令序列,并且正如其他人所指出的那样,该行为已记录在案。此时,<Esc> 将您带回到 insert 模式是正常的,因为那是您的原始模式。

    比我更深入了解 Vim 的人可能会告诉你是否有可靠的方法从 insertnormal -> (normal) -> visual 但我想说的是整个想法对我来说听起来很可疑。

    正确的用法是:

    1. 正常模式下做事
    2. 进入插入模式“插入”一些东西
    3. 退出插入模式回到正常模式
    4. 正常模式下做更多的事情
    5. 进入视觉模式
    6. 视觉模式下做事
    7. 退出视觉模式返回正常模式

    基本上,您不应该距离正常模式超过一个<Esc>

    我无法想象在<C-o> 之后使用v 有什么意义。

    使用 Vim 的最佳和首选方式是尽可能远离 insert 模式。使用<C-o> 来避免离开insert 模式是一个非常糟糕的策略。我不知道你是否这样做,但如果你这样做了,你应该尽快重新考虑这种方法。

    但我怀疑你正在尝试做一些你不知何故认为我们不需要知道的事情。

    【讨论】:

    • (insert) VISUAL”模式也可以通过从插入模式移动的箭头键进入。这就是我经常遇到的方式。这个问题确实是由“其他东西”引起的:我正在调试 vim 映射,如果它是从 VISUAL(insert) VISUAL 激活的,它的行为完全不同。进一步的测试表明,尽管 Vim 通常会出其不意,所以没关系,例如vmap vnoremap x <Esc>jjj 也可以从 (insert) VISUAL 正常工作。
    • Ctrl+O, v 提供帮助的一种情况是使用可视模式进行编辑。例如,我有可视模式绑定调用执行包装操作的插件,例如在正常模式下,viw) 会将当前单词包裹在括号中,ve) 将从当前光标位置包裹到括号中单词的末尾。不理想的是,当我从插入模式切换回正常模式时,它会将光标移回一个位置,然后我必须输入(从插入模式)<Esc>lve),但在这里我们可以做<C-O>ve),它可以进一步缩短使用插入模式绑定。
    • 旧帖子,但我想我会补充一点,我同意@StevenLu,我认为使用临时模式总是是一个“非常糟糕的策略”。例如,如果我处于插入模式并想跳过一个单词但继续输入,则执行<C-o>w 比必须先退出正常:<Esc>wi 更方便。如果光标向后移动,您甚至可能需要执行2w
    • 幸好我没有在回答中使用“always”这个词。 FWIW,您提到的用例只是<S-Right><C-Right> 的问题,具体取决于您的系统。无需求助于复杂的组合。
    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

    它记录在 :h Operator-pending 和下面的 :h mode-switching。视觉模式的映射也适用于(插入)视觉模式。请参阅:h map-modes 查看模式映射。 vmap 将映射为视觉和选择模式,xmap 将仅映射为视觉而不是选择,smap 将映射仅用于选择而不是视觉。通常,您应该使用这些映射命令的noremap 版本以避免意外行为。

    【讨论】:

    • 你这里有一个错误:v[nore]map(和[nore]map)定义了选择和视觉模式的映射(+普通和noremap的操作符待定),使用x[nore]map仅用于可视模式,s[nore]map 用于选择模式。
    【解决方案4】:

    第一个问题。

    CTRL+O 在插入模式下执行一个命令,然后退出回到插入模式。见:h i_CTRL-O

    关于第二个问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多