为什么宏中的换行符被解释为 Vim 中的 `j`?

Why does a newline digraph in a macro get interpreted as a `j` in Vim?

假设我创建了一个下一行的宏。

qajq

注册 a 恰好包含 qajq,因此 @a 将我移到下一行。

现在假设我在我的缓冲区中键入 j 并使用 "ayy 将其拉入寄存器 a。现在,注册 a 看起来像 j^J(注意终端换行符)。现在,当我执行宏 a 时,它会跳下两行。

这里到底发生了什么? Vim 是否看到 ^J 有向图并认为我想多写一行,还是更微妙的东西?

我猜这是其中一个答案是 "because that's how it was designed." :P

我不确定你的 vim 上发生了什么。但我会说 vim 应该作为正确的行为。

您键入 qajq。所以运动 j 被注册到寄存器 a 中。而且您似乎键入 yy 来将某些内容注册到寄存器 a 中。但据我所知,它注册到寄存器 " 而不是寄存器 a。要将某些内容拖入寄存器 a,您应该键入 "ayy。可以用 :register 命令确认。可能输入有误?

在你键入 qajq 之后,a 注册的内容是字符串 jqa开始记录宏到寄存器a,然后你输入j,它是第一个字符记录器,现在你输入q,vim停止记录。所以,你最终在寄存器 a.

中只有 j

命令yy按行工作,因此换行符也被插入到寄存器中。当您键入 "ayy 时,您最终会在 a 寄存器中得到 j^J,因为 ^JCtrl-J(换行符)是 vim 使用的表示换行符,它还会将光标向下移动一行,如 :help Ctrl-J

中所述

为了在没有换行符的情况下抽出行,您可以键入 0"ay$。这与键入 qajq.

相同