如何在Vim中的其他文本列之后粘贴一列文本?


76

我有两栏充满文字,我想让它们并排。例如,我有

abc
def
ghi

123
456
789

而且我要

123 abc
456 def
789 ghi

我所能找到的就是如何将同一行粘贴到列中每一行的末尾。我不知道如何在另一列的末尾粘贴多行文本块。

Answers:


60

使用可视块(ctrl-v)剪切字母列。然后移至数字列的第一行。移至末尾并留出一个空格。然后粘贴字母列。


在可视块模式下进行剪切/拉动是否有什么特别之处?我现在的问题是我正在使用的*寄存器实际上是寄存器,这意味着系统剪贴板。
莉莉·巴拉德

1
同样的寄存器被用于普通yp,如果你没有指定一个特别的用"
Matej

1
我希望Incast Karkat提供的这个不错的插件对“粘贴”粘贴很有帮助。vim.org/scripts/script.php?script_id=3355
Peter Rincker,2012年

1
嗯,我想我从这里开始记得了:“ gui-selection”(可能也在其他地方)在帮助中提到了它。注意:当将一个Vim中的文本粘贴到另一个单独的Vim中时,选择的类型(字符,行或块)也将被复制。对于其他应用程序,类型始终是字符。”
Matej

2
@clime:如果我从MacVim中的逐块选择复制,然后转到另一个MacVim实例,它将保留逐块性质。但是,如果我从另一个应用程序复制(这就是我所做的),则不是。我必须粘贴到vim中,然后进行逐块选择并重新复制,才能使用逐块寄存器。
莉莉·巴拉德

72

我想知道为什么“可视块模式”对我不起作用。关键是在可视模式下拉动(或删除)。

我发现自己需要从具有可变长度的excel列中复制一些内容。这是我的方法:

Names
Donald Knuth
Sebastian Thrun
Peter Norvig
Satoshi Nakamoto

Age
100
50
60
45

假设您想将第二列放在第一列之后。

  1. 在可视模式下拉动它:
    • 将光标移到 Age
    • 按下Ctrl + v即可进入视觉模式
    • 移动光标到545
    • 按下y即可拉动(或d删除)

您现在已在可视模式下拉动。

  1. 粘贴(在正常模式下)

    • 移至第一行的末尾并添加更多空格,因为它比第二行短。如果粘贴“块”而不添加额外的空格,它将覆盖Sebastian Thrun中的“运行”。

    • 现在您在第一行,在最后一个字符之后插入一些空格。确保您未处于插入模式,然后单击p以粘贴该块。(如果要以插入模式粘贴,请使用ctrl+r "

在此处输入图片说明


@Abdo:谢谢,这对我有所帮助。但是,尽管在正常模式下粘贴可以按预期工作,但使用插入ctrl+r "无法按说明进行。那应该是吗?
Xiphias '16

@Xiphias输入:registers并查看其中的内容。如果您确实有某些东西在下",您可能正在打字ctrl+r '(请确保您掌握了班次)
Abdo

1
实际上,它被称为“可视块模式”,而不仅仅是“可视模式”。
Fritz

花花公子... 这非常有用。但是,如果数据(在可视模式下选择的内容)也不均匀-特别是如果中间行的字符(行尾为+1)比顶部(或底部,取决于您在何处开始选择)更多的字符)-那么无法进行完整选择。技巧是在较短的光标行的末尾添加空格,直到偏移量与最长的行的偏移​​量匹配。例如,尝试1\n100\n1,最后0一个100将丢失。
乔纳森·科玛

4
请注意,对我来说,如果我可以set clipboard^=unnamedvimrcmacOS和Vim之间自动共享剪贴板,那么这将不起作用。设置了该选项后,它将始终将内容粘贴为单列,而删除该选项后,粘贴将如上所述进行。
robenkleene

15

你有:

abc
def
ghi

123
456
789

将光标移到a。然后CTRL+V,将光标移到i。按y

接下来,在3字符后面添加一个空格,然后按p

做完了


13

如果您使用的是Mac,并且无法弄清楚粘贴为何将换行插入新行,那是因为您使用的是系统粘贴板。

没问题,只是用缓冲区拉动/粘贴:

  1. Ctrlv -选择您想要的内容
  2. "字母y-拉入letter缓冲区
  3. 转到要粘贴的位置
  4. "字母p-从letter缓冲区粘贴

确保letter不是,+因为它不是系统粘贴板缓冲区,因此将具有相同的效果。


这就是我的答案。系统粘贴板,即。+注册,不要让其p粘贴列。
mozlingyu

4

这看起来似乎很明显,但是如果您是从外部复制的缓冲区中粘贴,则仅凭视觉模式粘贴将无法正常工作。您可以做的是首先使用上述方法在空白区域中进行常规粘贴并垂直剪切/粘贴。


0

如果您想手动将寄存器类型设置为逐块,请使用此

:call setreg(0, getreg(0), 'b')

要么

:call setreg('*', getreg('*'), 'b')

从电子表格编辑器粘贴列很有用。

有关详细信息,请参见:help setregvimtip

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.