在vim中剪切和粘贴多行

96
我正在Mac 10.7.2上运行vim 7.3,并且在剪切和粘贴多行时遇到了一些问题。 在我的旧Linux设置中(已被盗走,因此我不知道版本),我可以多次键入“dd”,然后“p”会将它们全部拼接回来。例如:键入:“dd dd”,将删除两行。现在键入“p”,则两行都将被粘贴回缓冲区。
我知道我可以通过键入“2dd”然后再键入“p”来实现我的目标 - 但是我想能够不事先计算行数就删除行。有什么建议吗?

2
不要使用“relativenumbers”来计算行数,而是将其用于显示相对于光标的行号。从7.4开始,设置“numbers”和“relativenumbers”可以使光标所在的行号绝对,其他行号相对,从而获得最佳效果。然后就更容易像@Giovanni建议的那样执行d2d(两行)。 - Radu Maris
1
这很棒,但对于任何尝试此操作的人来说,实际上应该使用“number”和“relativenumber”,而不是“numbers”和“relativenumbers” :) - user3640967
6个回答

176

你考虑过使用可视模式吗?

你可以这样做:

  • 按下V
  • 选择想要剪切的所有内容,无需逐行计数
  • 按下d
  • 移动到想要粘贴的位置
  • 按下p

相比于使用dd方法,这样做大约只需要一半的击键次数,因为您每行只需要按一个键。如果您使用5j(或类似的)来一次选择多行,则额外加分。


2
我本来想说我不想这样做,因为我“喜欢”我的旧工作流程。但是,我刚刚尝试了一下,发现这样做更好。谢谢! - spinlock
每次我回来查找如何剪切和粘贴时,我都想再次为这个答案点赞 :) - spinlock
节省了我很多时间。谢谢。 - Husman
通过使用5j选择接下来的5行真的很有帮助.. 最初我并不知道所有的h、j、k、l导航键在视觉模式下都是可用的。 - nirmesh khandelwal
当我从另一个编辑器复制行,并尝试在vim中使用'p'粘贴时,它只会添加一个新行。 - openCivilisation
显示剩余2条评论

47

你可以输入:

d<n>d

其中<n>是你想要剪切的行数,然后你可以使用以下方法粘贴它们:

p
例如,剪切和粘贴三行内容:
d3d
p

21

如果要按行号剪切和粘贴(请使用:set number命令显示行号),则可以执行以下操作来选择第x行到第y行:

:x,yd

或者如果您的光标已经在第x行,则执行

:,yd

然后转到您想要粘贴的位置,按下p


7

不确定这是否足够接近您所尝试的内容,但您可以使用特定寄存器并将寄存器名称大写。这告诉vim附加到寄存器而不是替换它,因此如果您有以下行:

one
two
three

您可以输入

"qdd
"Qdd
"Qdd

然后,如果您输入

"qp

它将粘贴回原始行


从问题来看,它似乎被映射到 d - romainl

5

复制并粘贴4行:

y4y(将光标定位在要复制的起始行上)

p(将光标定位在要粘贴至其后面的行上)


2
这个解决方案无法提前计算行数。 - wxz

0

我同意@Ben S.的观点,这是实现此目的的首选方法,但如果您只想复制旧行为,则可以将dd重新映射到附加到指定寄存器,然后将p映射到从该寄存器粘贴并清除它。
这将有一个缺点,即p仅适用于使用dd删除的内容(使用d}删除到段落末尾不会将文本放入正确的寄存器以便稍后粘贴)。

将以下内容添加到您的vimrc中

noremap dd "Ddd             "Appends the contents of the current line into register d
noremap p "dp:let @d=""<CR> "Pastes from register d and then clears it out

如果您不想粘贴会清除寄存器的内容

noremap p "dp               "Paste from register d 

但这会导致该寄存器不断增长而从未清除它


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接