为什么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个回答
4
投票

这在以下地方有解释 :help linewise-register. Vim的动作可以是一连串的字符,也可以是整行。同样,被拽入寄存器的文本要么是由字符(包括换行符,但不是以换行符结尾)、完整的行(总是以换行符结尾)或文本块(从 <C-V> 块化视觉选择)。) 粘贴时,"插入点 "是由源寄存器决定的,所以完整的行将被单独粘贴。粘贴时,"插入点 "由源寄存器决定,因此完整的行将被分开粘贴。:reg 命令表示每个寄存器的类型,用 c l b 在第一列中。

:reg abc
Type Name Content
c  "a   a word
l  "b   a line^J
b  "c   a block^Jof text

我同意你的观点,默认行为是有用的。有时,覆盖默认行为是有帮助的,例如,将不完整的文本作为单独的一行粘贴,或者在现有的一行中插入完整的删除行。Vim提供了以你想要的方式插入寄存器内容的方法,但你必须记住它,而且要打几个键。我需要经常将寄存器内容 "投射 "到某种模式(字符顺行顺块)中,所以我写了 UnconditionalPaste插件 为其提供。它提供 gcp, glp等替代内置的粘贴命令,强制执行某种模式(到现在为止,这个主题还有一些变化,比如用逗号或查询字符连接的粘贴)。


0
投票

在Vim中,一个拽出的文本被存储在一个叫做 "寄存器 "的内部变量中。然而Vim中的寄存器不仅保存了文本本身,还保存了 "文本类型"("char"、"line "或 "block "中的一种,就像Visual模式一样)。

所以 yy 以 "行 "的类型保存 "可复制的文本"。因此, p 命令尊重这一点,并将其放在自己的行中。

你可以用 :call setreg('', @@, 'c') (保留最后的换行,但覆盖内部类型),或用 0y$ 等等。

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