为什么 vim 粘贴的行为会因 yanking 方法而异

Why vim pasting behaves differently depending on yanking method

我看到了不同的粘贴行为,具体取决于我拉出一行的方式。我想知道为什么。

如果我从正常模式开始抽取一行:

^v$y

^ 转到行首

v进入可视化模式

$ 到行尾

y 猛拉

然后我用p粘贴,效果如预期。

但是,当我从正常模式开始并使用可视模式逐行抽取一行时:

Vy

V 逐行进入视觉模式

y 猛拉

然后我用p粘贴,我看到该行粘贴在当前行下面。就好像粘贴操作是先另起一行再粘贴。

例子。开头的行数:

Line1
Line2
Line3. Insert here 

我使用方法 1 拉出 Line2。

我把光标移动到第3行的点上,然后按p粘贴。我得到这个结果:

Line1
Line2
Line3.Line2 
 Insert here

但是当我使用 yanking 方法二做同样的事情时,我得到了这个结果:

Line1
Line2
Line3. Insert here
Line2

如果 :registers 的内容在两种情况下都相同,为什么粘贴工作不同?

编辑:

找到答案here

即使寄存器内容相同;寄存器的类型根据 yanking 方法而变得不同,不同的寄存器类型使粘贴做不同的事情。

说明

如果仔细观察,您应该会发现使用 v$ 还是 V 的区别:

:registers ab
--- Registers ---
"a   foo
"b   foo^J

^J换行符,表示整行 已被抽出。

动作要么影响整行,要么影响开始和结束位置之间的字符。在 Vim 中,这被称为 :help linewise and characterwise. The same applies to visual mode (and there's a third mode for <C-V> called blockwise). So, it makes a difference how you yank stuff! You see this in the :registers command, and can also query this via the :help getregtype() 函数,但在实践中,这很少会让人感到意外(一旦你掌握了这个概念)。

使用插件增强

我经常需要 "cast" 将内容注册到某种(按字符/按行/按块)模式,因此我为此编写了 UnconditionalPaste plugin。它提供了 gcpglp 等强制特定模式的内置粘贴命令的替代方案(现在这个主题还有几个变体,比如用逗号或查询字符连接的粘贴) .

有了它,您可以只使用 gcp / gcP 在光标位置之后/之前粘贴,无论您是如何抽取文本的(例如,从行视觉模式通过 V,如你的问题)。

而不是 Vy 我会推荐 yg_ 也可以是 vg_y 但你会输入一个额外的字符。所以:

yg_ ................... yank until the last character of the line

OBS:g_不包含换行符。更多:h g_

到select从该行的第一个字符到最后一个没有换行的字符:

_vg_

_ ............... jump to the first non-blank char
v ............... visual
g_ .............. las non-blank of the line

找到答案here

即使寄存器内容相同;寄存器的类型因抽取方法而异。寄存器类型使粘贴做不同的事情。 您可以通过键入 :echo regtype('"')

查看给定寄存器的寄存器类型