我只是想知道是否有人可以解释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运动要么覆盖字符序列,要么覆盖整行。同样,被拉入寄存器的文本由以下各项组成:字符(包括换行符,但不以一个换行符结尾),整行(始终以换行符结尾)或一个文本块(来自: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等替代,用于强制采用特定模式的内置粘贴命令(现在,此主题还有更多变体,例如以逗号或查询的字符进行粘贴)。
在Vim中,带引号的文本存储在称为“寄存器”的内部变量中。但是,Vim中的寄存器不仅保留文本本身,还保留“文本类型”(就像可视模式一样,是“字符”,“行”或“块”之一)。
因此gcp
将文本“可以复制的文本”保存为“行”类型。因此,glp
命令对此予以尊重,并将其放在自己的行上。
您可以使用yy
进行更改(在末尾保留换行符,但覆盖内部类型),或者使用p
进行更改。