【问题标题】:Vim macro from yanked text enters insert mode抽出文本的 Vim 宏进入插入模式
【发布时间】:2014-03-07 23:49:49
【问题描述】:

我有一个最奇怪的问题,即从抽出的文本创建的宏。我可以访问 Ubuntu 上的另一个 vim 安装(我使用 Gentoo)并且不会发生此问题。我需要的是帮助找出这种行为的原因。

首先是一个可以正常工作的案例:

我开始使用qr 录制宏。

我输入了以下字符:iasdas<ESC>q

此宏应插入文本asdas 并退出插入模式。使用@r 运行它就是这样做的。

第二种情况:

现在我想手动输入我的宏,拉下它并运行。

我进入插入模式:

iasdas^[

当然^[ 插入<Ctrl>+v, <ESC>

我把它拉到一个寄存器q:"qyy

然后我验证q的内容是完全正确的。

我用@q 运行它,我得到的最令人困惑。输入文本asdas,vim 处于插入模式(!),光标位于最后一个s

这意味着实际发生的事情是iasdas^[i - 否则光标将在之后 s。将 ^[ 更改为 jj(我已映射为转义)并没有改变任何内容。

我有一个非常复杂的宏,我试图手动编辑它。现在我必须在宏之后退出插入模式,这在很多方面都很糟糕......

作为一种解决方法,我制作了一个包含 @q^[ 的宏,但它破坏了 @@ 的行为,因此这不是一个好的解决方案。

这个问题让我很头疼。我不知道从哪里开始寻找这个原因。我刚刚更新到 Vim 7.4,在配置完全相同的 7.3 上观察到相同的行为。

我的 .vimrc 很长,有大约 10 个插件。尝试删除它们中的每一个都需要大量工作,所以我很想知道任何其他方式来追踪它。

编辑

根据我尝试调试的建议,运行 vim -V100vimlog 文件名,我得到:

...
Calling shell to execute: "(printf "0x%X" $((0x4A307204 +0x4))) >/tmp/vWo43Tm/2 2>&1" 
Executing CursorMoved Auto commands for "*"
Executing TextChanged Auto commands for "*"
Executing CursorMoved Auto commands for "*"
Executing CursorMoved Auto commands for "*"
Executing CursorMoved Auto commands for "*"
Executing TextChanged Auto commands for "*"
Executing CursorMoved Auto commands for "*"
Executing CursorMoved Auto commands for "*"
Executing InsertEnter Auto commands for "*"-- INSERT --
...

不知道为什么这个 InsertEnter 会触发,我可以得到更详细的输出吗?

【问题讨论】:

  • 我还敢说这与映射或 :autocmd InsertLeave 事件处理程序有关。

标签: vim macros


【解决方案1】:

你可以试试这个

:let @q='iasds^['

【讨论】:

  • 是的,你不需要重新输入它,'<C-r>q' 会为你插入它(然后使用命令行历史来调用和重新编辑)。
  • 这是一个很好的提示,来自 Amit 和 @IngoKarkat,谢谢。我已经给出了答案(虽然还有一些谜团;-))
【解决方案2】:

找到了罪魁祸首。

问题在于“yy”。

实际上,我说Then I verify the content of q and it's exactly correct. 这不是真的。 yy 在行尾复制了^M

感谢@IngoKarkat 和@Amit 的回答,我发现了它。在命令行中粘贴宏会显示::iasdas^[^M

我不知道为什么会导致进入插入模式。我没有这样的回车键映射,是不是还有别的意思?

最令人困惑,但很有趣。感谢@Amit 和@IngoKarkat 的回答,这是一个很好的提示!

当然,在没有^M 的情况下拉扯在某种程度上解决了这个问题。

【讨论】:

  • 正确:使用y$ 而不是yy
猜你喜欢
  • 1970-01-01
  • 2013-04-14
  • 2013-11-02
  • 2015-04-30
  • 2013-06-24
  • 2023-03-28
  • 1970-01-01
  • 2019-03-02
  • 2011-03-01
相关资源
最近更新 更多