在Vim中,为什么临时正常模式(从插入模式按Ctrl-O进入)执行命令会变得更慢?

6
通常,当我在Vim编辑文本时想要撤销更改时,我必须执行以下步骤:
  1. 使用 Esc 退出插入模式
  2. 使用 u 撤销更改
  3. 使用各种命令(如 i, o 等)进入插入模式
现在,虽然我只是一个初学者,但我知道当处于插入模式时,可以通过使用 Ctrl-O 临时转换到普通模式执行一个命令。
知道这一点后,当我想要撤销文本更改时,我想:为什么不直接进入临时的普通模式,按下 u,而不必处理所有 Esc 和模式之间的切换等烦人的事情呢?
所以我做了以下操作:
  1. 使用 Ctrl-O 进入临时普通模式,执行一个命令
  2. 使用 u 撤销更改
  3. 我会自动进入插入模式并继续编辑。
它完美地工作了...除了它非常非常慢。光标会立即放置在执行撤销之后的位置,但文本中的更改要在 ~2 秒后才显示出来。那是一个非常长的时间。
我以为只是我的电脑运行缓慢,但我用传统方式执行撤销却瞬间完成了。当然,并非所有命令都是这样。当我尝试执行 dd 并删除整行时,它会立即按预期工作。
所以我的问题是:为什么?临时普通模式不同于从按下 Esc 进入的普通模式吗?它是否与缓冲区、交换文件或正在进行的其他操作有关?这是否与 Vim 编辑器中的撤消实现方式有关?
1个回答

3
似乎Vim正在等待可能的第二个按键,即命令的动作(例如dw,它将正常执行)。显然,u命令没有动作,但是双击uu可以快速执行撤销操作,然后将下一个“u”插入到文档中。我怀疑这是“临时正常模式”如何决定何时返回到“插入模式”的怪癖。

1
我几乎认为这是一个错误。 - maniacalrobot
这很可能是一个bug。你的回答似乎有道理... 但是我尝试在临时正常模式下使用 x 删除单个字符。它立即起作用了。 - Eddo Hintoso
哈哈,女友课程!我无法理解为什么它会如此慢。我们说的是等待2至3秒。我认为删除命令执行起来要快得多,因为你只是在删除。对于撤销操作,Vim可能将最后的更改存储在某个地方(.swp文件)并需要访问它。即使如此,为什么临时正常模式会导致命令减速如此之大呢?这几乎是疯狂的。不管怎样,我甚至不知道撤销操作在计算机中是如何实现的,所以我的“理论”是站不住脚的。 - Eddo Hintoso

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