为什么vim粘贴的行为取决于yanking方法

Rob*_*ert 4 vim paste yank

我看到不同的粘贴行为取决于我如何拉线.我想知道为什么.

如果我从正常模式开始划线:

^v$y
Run Code Online (Sandbox Code Playgroud)

^ 去行的开头

v 进入视觉模式

$ 走到尽头

y 猛拉

然后我用p它来粘贴,它按预期工作.

但是,当我从正常模式开始并使用直线视觉模式拉线时:

Vy
Run Code Online (Sandbox Code Playgroud)

V 按行进入视觉模式

y 猛拉

然后我用p粘贴,我看到该线被粘贴在当前行下方.这就像粘贴操作首先打开一个新行然后粘贴那里.

例.开头的行:

Line1
Line2
Line3. Insert here 
Run Code Online (Sandbox Code Playgroud)

我用方法1猛拉了Line2.

我将光标移动到Line3的点,然后按p粘贴.我得到这个结果:

Line1
Line2
Line3.Line2 
 Insert here
Run Code Online (Sandbox Code Playgroud)

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

Line1
Line2
Line3. Insert here
Line2
Run Code Online (Sandbox Code Playgroud)

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

编辑:

这里找到答案

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

Ing*_*kat 6

说明

如果仔细观察,您应该看到是否使用了v$或者V:

:registers ab
--- Registers ---
"a   foo
"b   foo^J
Run Code Online (Sandbox Code Playgroud)

^J换行符,表示整条线已被拉扯.

动作要么影响整行,要么影响开始和结束位置之间的字符.在Vim内部,这被称为:help linewise和字符.这同样适用于可视模式(并且还有第三种模式<C-V>称为blockwise).所以,它会对你如何猛拉东西产生影响!你可以在:registers命令中看到这个,也可以通过:help getregtype()函数查询这个,但在实践中,这很少出人意料(一旦你掌握了这个概念).

通过插件启动

我需要将寄存器内容"转换"为某种(字符/线性/块状)模式,因此我经常为它编写UnconditionalPaste插件.它提供gcp,glp等等的替代品,迫使某一模式(和现在几个变体这一主题,等粘贴用逗号或查询字符接合)内置粘贴命令.

有了它,您可以在光标位置之后/之前使用gcp/ gcP粘贴,无论您如何拉动文本(例如,从V您的问题中通过线性视觉模式).