如何在Vim中复制整行?

1977

我该如何在Vim中像在IntelliJ IDEA/ Resharper中按下Ctrl+D或在Eclipse中按下Ctrl+Alt+/的方式复制整行?


216
你想复制这一行吗?Yes(是的) Please(请)。 :) - Stavr00
11
近两个月来,我已经完成了约十二次vimtutor的学习,但其中涉及的概念并未包括本问题所要求的单行复制且不删除。该教程只教授如何使用“dd”、“v-导航-y”和“p”命令进行操作。 - danielson317
22个回答

3297

yyY复制整行(记忆方式:yank

dd删除整行(Vim将你删除的内容复制到类似剪贴板的“寄存器”中,就像一个剪切操作)

然后:

p粘贴复制或删除的文本当前行之后

Shift + P粘贴复制或删除的文本当前行之前


155
一个很好的观点。不过出于某种原因,我发现按两次y键比按SHIFT-y快。 - Mark Biek
30
我认为“Y”应该是“从光标复制到结尾”。 - Dzung Nguyen
55
2yy可以用来复制2行(对于任何其他n也是适用的)。 - Amir Ali Akbari
7
是的,很多用户会将Y映射为y$。(与DC保持一致;但不兼容Vi(没有人关心)。)这甚至在:help Y中有提出。 - Aaron Thoma
15
要复制两行文本,使用yjyk更快,尤其是不用输入相同字符。而且,yk是一个反向的版本,2yy无法完成,你可以在y9jy2k中指定向后复制多少行。唯一的区别是,总行数为n时,计数器必须为n-1,但也容易记住这个规则。 - zelk
显示剩余7条评论

491

普通模式:请查看其他答案。

Ex方式:

  • :t. 将复制当前行,
  • :t 7 将其复制到第7行之后,
  • :,+t0 将当前行和下一行复制到文件开头(,+ 是范围 .,.+1 的同义词),
  • :1,t$ 将从开头到光标位置的所有行复制到文件末尾(1, 是范围 1,. 的同义词)。

如果需要移动而不是复制,请使用 :m 替代 :t

如果与 :g:v 结合使用,这将非常强大:

  • :v/foo/m$ 将所有不匹配模式“foo”的行移动到文件末尾。
  • :+,$g/^\s*class\s\+\i\+/t. 将所有形如 class xxx 的后续行直接复制到光标后面。

参考::help range:help :t:help :g:help :m:help :v


2
当您在可视模式下按下“:”时,它会转换为“'<,'>”,因此它会预先选择可视选择跨越的行范围。因此,在可视模式下,“:t0”将复制开头的行。 - Benoit
2
记录一下:当您键入冒号(:)时,您进入命令行模式,在此模式下可以输入Ex命令。http://vimdoc.sourceforge.net/htmldoc/cmdline.html Ex命令可以非常强大和简洁。yyp解决方案是“正常模式”命令。如果您想复制/移动/删除远处的一行或多行,使用Ex命令会更快。 - Niels Bom
7
不是因为答案本身有问题(虽然在我的情况下不适用,我也不知道要复制到哪一行),而是因为这个被广泛搜索的问题,它不应该成为最高/被接受的答案。 - mjaggard
10
@mjaggard:被接受的答案总是排在顶部,不管它们的得分如何。是的,我添加了那个答案作为补充,看起来适合问题的提出者。 - Benoit
11
":t." 是这个问题的确切答案。" - Burak Erdem
显示剩余5条评论

334
< p > YPYpyyp

Y 通常被重新映射为 y$(从当前光标位置开始复制直到行末)。通过在 .vimrc 中添加以下这一行::nnoremap Y y$ - Aaron Thoma
2
不要忘记可怜的 yyP - icc97

301

在Vim中复制和粘贴

这没有比这更简单的了!从普通模式开始:

yy

然后移到您想要粘贴的行并

p

41
你用什么制作了这个gif动图? - Zoltán
12
你可以使用 LiceCap 这个小工具,它的体积很小。 - onmyway133
gif工具,https://www.cockos.com/licecap/ - undefined

64

操作步骤:

首先,按下yy复制当前行,然后按下p粘贴。


1
是的,如果光标在行末,您按照所示键入空格,则会将您复制的行复制到您复制的行下方两行。 - user146043

63

yy

将当前行复制但不删除

dd

将当前行删除

p

将之前复制或删除的一行内容put(粘贴)到当前位置


4
这个答案是先发表的,但它的副本也被接受了:https://dev59.com/kXVD5IYBdhLWcg3wI4CM#73357 - Geoffrey Hale

54

如果您希望另一种方式:

"ayy: 将此行存储在缓冲区a中。

"ap: 这将在光标处放置缓冲区a的内容。

有许多变化。

"a5yy: 这将在缓冲区a中存储5行。

更多信息请参见"Vim帮助文件


谢谢,我使用了这个绑定:map <Leader>d "ayy"ap - frbl

51

yyp - 用"yippee!"来记住它!

多行文本之间有数字:

y7yp


19
7yy 等价于 y7y,并且可能更容易记住如何执行。 - graywh
11
y7yp(或7yyp)很少有用;光标会停留在第一行被复制的位置,这样p命令会将所复制的行粘贴在源文本的第一行和第二行之间。要复制一块代码行,请使用7yyP命令。 - Nefrubyr
@Nefrubyr 或 :.,.+7 copy .+7 :P - DarkWiiPlayer

31

yyp - 粘贴到光标所在行的下一行

yyP - 粘贴到光标所在行的上一行


7
由于该行正在复制,因此内容的最终结果是相同的。 - Asclepius
6
@A-B-B,这里有一个微小的区别——你的光标会停留在哪一行。 - Mikk

17
我喜欢:Shift+v(立即选择整行并允许你选择其他行,如果需要的话),y,p

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