为什么yyp根据p的文档不起作用

问题描述 投票:1回答:2

我只是想知道是否有人可以解释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的默认行为被忽略吗?

vim paste yank
2个回答
1
投票

这在:help linewise-register中有解释。 Vim运动要么覆盖字符序列,要么覆盖整行。同样,被拉入寄存器的文本由以下各项组成:字符(包括换行符,但不以一个换行符结尾),整行(始终以换行符结尾)或一个文本块(来自:help linewise-register逐行视觉选择) 。粘贴时,“插入点”由源寄存器确定,因此完整的行将粘贴在单独的行上。 <C-V>命令使用第一栏中的:reg /:reg/ c指示每个寄存器的类型。

l

我同意您的观点,默认行为很有用。有时,将其覆盖会有所帮助,例如将不完整的文本粘贴为单独的行,或在现有行中插入已删除的完整行。 Vim提供了以您想要的方式插入寄存器内容的方法,但是您必须记住它,这是要键入的几个键。我经常需要将寄存器内容“投射”到某种(字符/行/块)模式,为此我写了b。它提供:reg abc Type Name Content c "a a word l "b a line^J b "c a block^Jof text UnconditionalPaste plugin等替代,用于强制采用特定模式的内置粘贴命令(现在,此主题还有更多变体,例如以逗号或查询的字符进行粘贴)。


0
投票

在Vim中,带引号的文本存储在称为“寄存器”的内部变量中。但是,Vim中的寄存器不仅保留文本本身,还保留“文本类型”(就像可视模式一样,是“字符”,“行”或“块”之一)。

因此gcp将文本“可以复制的文本”保存为“行”类型。因此,glp命令对此予以尊重,并将其放在自己的行上。

您可以使用yy进行更改(在末尾保留换行符,但覆盖内部类型),或者使用p进行更改。

© www.soinside.com 2019 - 2024. All rights reserved.