为什么 yyp 的行为不符合 p 的文档

Why does yyp not behave according to p's documentation

我只是想知道是否有人可以解释幕后发生的事情 w.r.t yyp 的行为。

给定一些文本:

Text that can be copied

在光标位于一行中间时键入 yyp,比方说就在 can 之前,结果是:

Text that can be copied
Text that can be copied

虽然非常有用且合乎逻辑,但并不是 p 通常所做的。

由于 p 粘贴在光标之后,而我的光标保留在 can 之前,我不觉得我期望这样的东西是错误的:

Text that Text that can be copied can be copied

虽然我同意前者更有用——有人可以解释为什么以及如何在这些情况下忽略 p 的默认行为吗?

这在 :help linewise-register. Vim motions either cover a sequence of characters or whole lines. Likewise, text that is yanked into a register either is comprised of characters (including newlines, but not ending with one), complete lines (always ending with a newline), or a block of text (from a <C-V> blockwise visual selection). When you paste, the "insertion point" is determined by the source register, so complete lines will be pasted on separate lines. The :reg 中有解释,命令在第一列中用 c / l / b 指示每个寄存器的类型。

:reg abc
Type Name Content
c  "a   a word
l  "b   a line^J
b  "c   a block^Jof text

我同意你的看法,默认行为很有用。有时,覆盖它是有帮助的,例如将不完整的文本粘贴为单独的行,或在现有行中插入完整的已删除行。 Vim 提供了以您想要的方式插入寄存器内容的方法,但您必须记住它并且需要输入几个键。我经常需要 "cast" 将内容注册到某种(按字符/按行/按块)模式,我为此编写了 UnconditionalPaste plugin。它提供了 gcpglp 等强制特定模式的内置粘贴命令的替代方案(现在这个主题还有几个变体,比如用逗号或查询字符连接的粘贴) .

在 Vim 中,抽取的文本存储在名为 "a register" 的内部变量中。然而,Vim 中的寄存器不仅保留文本本身,还保留 "the type of text"("char"、"line" 或 "block" 之一,就像视觉模式一样)。

所以yy保存文本"Text that can be copied",类型为"line"。因此,p 命令尊重这一点并将其放在自己的行上。

您可以使用 :call setreg('', @@, 'c') 更改此设置(在末尾保留换行符但覆盖内部类型)或使用 0y$ 等进行抽取