来自被拔出的文本的Vim宏进入插入模式

时间:2014-03-07 15:24:04

标签: vim macros

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

首先是一个正常的案例:

我开始录制一个宏,比方说qr

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

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

第二种情况:

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

我进入插入模式:

iasdas^[

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

我将它拖到注册q"qyy

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

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

这意味着实际发生的事情是iasdas^[i - 否则光标将在 s之后。将^[更改为jj,我已将其映射为escape,但未更改任何内容。

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

作为一种解决方法,我创建了一个包含@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会触发,我可以获得更精细的输出吗?

2 个答案:

答案 0 :(得分:5)

你可以试试这个

:let @q='iasds^['

答案 1 :(得分:2)

罪魁祸首。

问题在于“yy”。

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

由于@IngoKarkat和@Amit的回答,我已经检测到了它。在命令行中粘贴宏显示::iasdas^[^M

我不知道为什么它会进入插入模式。我没有输入密钥的这种映射,它是否意味着其他东西?

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

当然,没有^M的yanking在某种程度上解决了这个问题。