如何从另一行开始粘贴可视块


10

我花了很长时间才意识到,用放置(粘贴)某物p或用P可视块选择某物并用ctrl+v拖动(复制)该东西可以y保留以前的方式,因此,当复制的文本位于行的中间时,然后将尽可能在其他文本中间复制。相反,select-line with V不会将复制的行粘贴到其他文本中,而是从另一行开始。

例如,假设我现在有:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
12/15:
12/16:
12/17:

当我想剪切AvocadoBean和时Cherry,通过选择(选择表示为_

12/12: ________ Apple.
12/13: ________ Banana.
12/14: ________ Citron.
12/15:
12/16:
12/17:

并按y,然后将光标移动到下一行(以表示的光标_),

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
_2/15:
12/16:
12/17:

然后按P。结果:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.12/15:
Bean.   12/16:
Cherry. 12/17:

但是我希望是:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.
Bean.   
Cherry. 
12/15:
12/16:
12/17:

每次这都使我感到困惑,直到我意识到由于将它们复制在行的中间,因此将它们粘贴在行的中间,模仿了它们的样子。

粘贴从另一行开始的东西的最佳方法似乎是将光标移动到以开头的位置0,然后将3行向下移动到新位置。使用进入插入模式i,然后按<return>3次,然后将光标向后移动6行,然后向右移动到原始位置;并复制,然后再次移至新位置并粘贴,就像我在上面所做的那样。

我可以省些招吗?或者您通常做什么?

(编辑:上面所说的是我问这个问题时的理解方式。请参见这些答案以获取正确的说明:)

Answers:


11

当您复制一些文本时,它会进入寄存器。寄存器内的文本具有一个类型:characterwiselinewiseblockwise

此类型确定文本的放置方式。

在您的示例中,您从可视块模式复制了一些文本。因此,文本具有类型blockwise,并存储在未命名的寄存器中"
由于这种类型,当您将其粘贴回缓冲区内时,它将被粘贴为一个块。


如果要将其粘贴为一行行而不是一个块,则有3种方法。

  1. 在插入模式下,您可以通过点击插入它C-r "
    它应该插入未命名寄存器的内容,就像其类型是逐行的一样。

  1. 在命令行中,您可以使用:put命令。
    :put无论文本的原始类型如何,都应将文本粘贴到寄存器中,就好像其类型是逐行的一样。请注意,您可以将寄存器的名称作为参数传递,以及行地址以指定要粘贴寄存器的行下方。

例如:

:42put a

...应将寄存器的内容放在th行a下方42

如果没有寄存器名称,Vim会假定您要粘贴未命名的寄存器(+如果进行了调整,也可以粘贴该寄存器'clipboard')。
如果没有地址,Vim会假定您要将其粘贴到当前行下方。


  1. 在命令行中,您可以使用以下setreg()函数更改未命名寄存器的类型:

    :call setreg('"', '', 'al')

在此,setreg()应将一个空字符串附加到未命名的寄存器中(这要归功于a作为第三个参数传递的标志),并将其类型更改为逐行(由于该l标志)。

然后,在普通模式下,您应该能够使用p普通命令粘贴寄存器,就好像其类型是逐行的一样。


它与您的问题没有直接联系,但是当您复制一些文本时,它也会进入0寄存器。并且,如果将值附加在unnamedplusoption之前'clipboard',则该值也将进入+寄存器。

您可以使用以下getregtype()函数检查寄存器的类型:

:echo getregtype('"')

如果返回小写字母v,则表示类型为字符型。
如果返回大写字母V,则表示类型为线性。
如果返回^V{some number},则表示类型是逐块的,块的宽度为{some number}


3

我经常需要将注册内容“广播”到某种(按字符/按行/按块)模式,为此我编写了UnconditionalPaste插件。它提供gcpglp等等替代强制某种模式的内置粘贴命令(目前,此主题有更多变体,例如以逗号或查询的字符进行粘贴)。

有了它,无论您如何取消文本,都可以使用glp/ glP粘贴当前行之后/之前(作为新行)。


我很羡慕你有时间写这样的东西QQ,但是我很满意:put。(也支持您)
Violapterin 2016年

@Aminopterin:我经常回答,实际上第一段有一个snipMate片段。所以我只需要自定义一点。感谢您赞赏我的回答,并给予支持!
Ingo Karkat 2016年

哦,我说我很羡慕您有时间单手编写一个插件,就像这样,好像轻松地做的....仅仅半年了,我才开始写一些c ++项目作为业余项目来强迫自己学习编程,并开始使用vim ~~
Violapterin

2
@Aminopterin嗯,该插件开始时是从Vimtips复制的一个小片段,并且随着时间的推移逐渐增长。由于它对我非常有用,因此我逐渐对其进行了增强。许多小步骤比一次大的努力要强大!
Ingo Karkat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.