4

根据我拉线的方式,我会看到不同的粘贴行为。我想知道为什么。

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

^v$y

^到行首

v进入视觉模式

$走到行尾

y拉扯

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

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

Vy

V逐行进入视觉模式

y拉扯

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

例子。开头的几行:

Line1
Line2
Line3. Insert here 

我使用方法 1 拉出 Line2。

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

Line1
Line2
Line3.Line2 
 Insert here

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

Line1
Line2
Line3. Insert here
Line2

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

编辑:

在这里找到了答案

即使寄存器内容相同;寄存器的类型会根据提取方法而有所不同,不同的寄存器类型会使粘贴做不同的事情。

4

3 回答 3

6

解释

如果您仔细观察,您应该会发现您是否使用过v$V

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

^J是表示整行已被拉出的换行符。

运动要么影响整行,要么影响开始和结束位置之间的字符。在 Vim 内部,这是按:help linewise字符调用的。这同样适用于视觉模式(还有第三种模式<C-V>称为块状模式)。所以,你如何拉东西会有所不同!您可以在:registers命令中看到这一点,也可以通过:help getregtype()函数对其进行查询,但在实践中,这很少会让人感到意外(一旦您掌握了这个概念)。

使用插件启动

我经常需要将寄存器内容“转换”为某种(按字符/按行/按块)模式,为此我编写了UnconditionalPaste 插件。它提供了gcp,glp等替代内置粘贴命令的选项,这些命令强制某种模式(现在这个主题还有更多变体,比如用逗号或查询字符连接的粘贴)。

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

于 2018-10-31T09:11:20.147 回答
1

在这里找到了答案

即使寄存器内容相同;寄存器的类型会根据拉取方法而有所不同。寄存器类型使粘贴变得不同。您可以通过键入来查看给定寄存器的寄存器类型:echo regtype('"')

于 2018-11-01T11:38:29.130 回答
0

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

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

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

从该行的第一个字符选择到最后一个不带新行的字符:

_vg_

_ ............... jump to the first non-blank char
v ............... visual
g_ .............. las non-blank of the line
于 2018-10-31T12:24:39.970 回答