在Vim中复制整行

sum*_*mek 1555 vi vim keyboard-shortcuts editor

如何复制Vim中以类似的方式,以一整行Ctrl+ D中的IntelliJ IDEA/ReSharper的或Ctrl+ Alt+ / 在Eclipse?

Mar*_*iek 2663

yyY复制该行

dd删除(剪切)该行

然后

p将复制或删除的文本粘贴到当前行之后,
或者
P将复制或删除的文本粘贴到当前行之前

  • 一个很好的观点.但是出于某些原因,我发现对于我而言,比SHIFT-y快两倍 (124认同)
  • 和2yy可用于复制2行(和任何其他n行) (41认同)
  • @camflan我认为Y应该是"从光标复制到最后" (25认同)
  • 要复制两行,只需更快地去"yj"或"yk",特别是因为你不会在一个字符上加倍.另外,`yk`是一个'2yy`不能做的向后版本,你可以在'y9j`或`y2k`等中将行数放到后面.唯一的区别是你的数量必须是`n-1`总共有'n`行,但无论如何你的头脑都可以学到. (11认同)
  • @nXqd:是的,很大一部分用户将`Y`映射到'y $`.(与'D`和`C`一致;(但不兼容Vi(无人问津).))甚至在[`:help Y`]中提出(http://vimhelp.appspot.com/change.txt的.html#Y). (4认同)
  • 另外,使用:yj复制当前行和它下面的行/ yk来复制它上面的当前行和行 (2认同)

Ben*_*oit 393

普通模式:见其他答案.

防爆方式:

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

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

如果你将它与:gor 组合,这可能非常强大:v:

  • :v/foo/m$ 将所有与模式"foo"不匹配的行移动到文件末尾.
  • :+,$g/^\s*class\s\+\i\+/t.class xxx在光标后立即复制表单的所有后续行.

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

  • @mjaggard:无论得分如何,接受的答案总是排在最前面.是的,我将这个答案添加为补充,似乎它很适合OP. (9认同)
  • Downvoted不是因为答案问题(虽然它对我的情况不起作用,我不知道我要复制的行号)但是因为它真的不应该是这个的最高/接受的答案常见问题. (7认同)
  • `:t.是这个问题的确切答案. (7认同)
  • 当您在视觉模式下按 `:` 时,它会转换为 `'<,'>`,因此它会预先选择视觉选择所跨越的行范围。因此,在可视模式下,`:t0` 将复制开头的行。 (2认同)
  • 记录:当您键入冒号 (:) 时,您将进入命令行模式,您可以在其中输入 Ex 命令。http://vimdoc.sourceforge.net/htmldoc/cmdline.html Ex 命令可以非常强大和简洁。yyp 解决方案是“正常模式”命令。如果您想复制/移动/删除远处的行或行范围,Ex 命令可以快得多。 (2认同)

Lin*_*lin 288

YPYpyyp.

  • 别忘了可怜的老‘yyP’ (2认同)

Ada*_*dam 244

复制并粘贴到vim中

没有比这简单!从正常模式:

yy
Run Code Online (Sandbox Code Playgroud)

然后移动到要粘贴的行和

p
Run Code Online (Sandbox Code Playgroud)

  • 你用什么来制作gif? (32认同)
  • 这是用Camtasia Studio 8完成的.实际上非常简单. (19认同)
  • @Zoltán你可以使用小尺寸的LiceCap (3认同)

pjz*_*pjz 52

yy

将删除当前行而不删除它

dd

将删除当前行

p

put使用之前的任何一种方法抓住一条线

  • 这是第一个,但它的重复被接受:http://stackoverflow.com/a/73357/1438029 (3认同)

Eri*_*ard 42

做这个:

首先,yy复制当前行,然后p粘贴.

  • 不要输入空格. (20认同)

小智 39

如果你想要另一种方式:-)

"ayy 这会将行存储在缓冲区中 a

"ap 这会将缓冲区的内容放在a光标处.

这有很多变化.

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

访问http://www.vim.org/htmldoc/help.html以获得更多乐趣


the*_*zer 37

yyp - 记住它与"yippee!"

多行,中间有一个数字:

y7yp

  • 7yy相当于y7y,可能更容易记住怎么做. (17认同)
  • y7yp(或7yyp)很少有用; 光标保留在复制的第一行上,以便p粘贴源的第一行和第二行之间的复制行.要复制一行代码,请使用7yyP (9认同)

yem*_*emu 22

yyp - 贴后

yyP - 粘贴之前

  • 由于该行是重复的,因此内容的最终结果是相同的. (6认同)
  • @ABB然而,这里有一个微型差异 - 你的光标将落在哪一行. (4认同)

小智 11

您也可以尝试<Cx> <Cl>,它将从插入模式重复最后一行,并为您提供包含所有行的完成窗口.它几乎像<Cp>一样工作


Roo*_*ook 11

另一种选择是:

nmap <C-d> mzyyp`z
Run Code Online (Sandbox Code Playgroud)

为您提供保留光标位置的优势.


小智 10

我喜欢: Shift+ v(立即选择整行,让你选择其他行,如果你想),y,p


Mic*_*ael 10

对于不了解vi的人,上面的一些答案可能会误导他,例如"粘贴...... 当前行之后/之前".
它实际上是"粘贴...之后/之前的光标 ".

yyY复制该行

dd删除该行

然后

p到复制或删除文本粘贴光标

P将复制或删除的文本粘贴之前光标


有关更多键绑定,您可以访问此站点:vi完整键绑定列表


Dar*_*yer 6

我知道我参加聚会迟到了,但无论如何;我的 .vimrc 中有这个:

nnoremap <C-d> :copy .<CR>
vnoremap <C-d> :copy '><CR>
Run Code Online (Sandbox Code Playgroud)

:copy命令只是将选定的行或范围(始终是整行)复制到作为其参数给出的行号下方。

在正常模式下,它的作用是copy . 将这一行复制到这一行的正下方

在视觉模式下,它'<,'> copy '> 从选择开始到选择结束到选择结束下方的行变成了副本

  • ↑↑最佳答案在这里! (3认同)

Mai*_*ret 6

我更喜欢定义一个自定义键盘映射Ctrl+ Din.vimrc以在正常模式和插入模式下复制当前行:

" duplicate line in normal mode:
nnoremap <C-D> Yp
" duplicate line in insert mode:
inoremap <C-D> <Esc> Ypi
Run Code Online (Sandbox Code Playgroud)


Chr*_*ner 5

默认是yyp,但我已经使用这种重新绑定一年左右并且喜欢它:

" set Y to duplicate lines, works in visual mode as well. nnoremap Y yyp vnoremap Y y`>pgv