ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Vim 中复制整行?

如何以类似于 IntelliJ IDEA/Resharper 中的 Ctrl+D 或 Eclipse 中的 Ctrl+Alt+↑/↓ 的方式在 Vim 中复制整行?

人们不再运行 vimtutor 了吗?这可能是在学习如何使用 Vim 的前五分钟内。
你想复制这条线吗? YP租约。 :)
FWIW 在过去的 2 个月里我已经做了十多次 vimtutor 并且这个概念没有被涵盖。它告诉如何执行“dd”和“v - navigate - y”,然后是“p”。它没有告诉如何在不删除它的情况下复制单行,如此处所要求的。

i
iono

yy 或 Y 复制该行(助记符:yank)或 dd 删除该行(Vim 将您删除的内容复制到类似剪贴板的“寄存器”中,如剪切操作)

然后

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


一个很好的观点。不过出于某种原因,我发现按两次 y 对我来说比 SHIFT-y 快
@camflan我认为Y应该是“从光标复制到末尾”
和 2yy 可用于复制 2 行(以及任何其他 n)
@nXqd:是的,很大一部分用户将 Y 映射到 y$。 (与 DC 一致;(但与 Vi 不兼容(没人关心。)))这甚至在 :help Y 中提出。
要复制两行,只需转到 yjyk 会更快,尤其是因为您不会在一个字符上加倍。另外,yk2yy做不到的向后版本,你可以把要达到的行数放在y9jy2k等中。唯一的区别是你的计数必须是n-1 总共有 n 行,但无论如何你的头脑都能学会。
H
Hjulle

正常模式:查看其他答案。

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。将在光标之后复制表单类 xxx 的所有后续行。

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


当您在视觉模式下按 : 时,它会转换为 '<,'>,因此它会预先选择视觉选择跨越的行范围。因此,在可视模式下,:t0 将复制开头的行。
作为记录:当您输入冒号 (:) 时,您将进入命令行模式,您可以在其中输入 Ex 命令。 vimdoc.sourceforge.net/htmldoc/cmdline.html Ex 命令可以非常强大和简洁。 yyp 解决方案是“正常模式”命令。如果要复制/移动/删除远处的行或行范围,Ex 命令可以快得多。
被否决不是因为答案本身有问题(虽然它不适用于我的情况,但我不知道我想复制到的行号),而是因为它真的不应该是这个的最佳/接受的答案经常搜索的问题。
@mjaggard:无论分数如何,接受的答案总是排在首位。是的,我添加了该答案作为补充,它似乎很适合 OP。
:t. 是该问题的确切答案。
T
Tim Cooper

YPYpyyp


Y 通常被重新映射到 y$(拉(复制)直到行尾(从当前光标位置,而不是行首))。在 .vimrc 中使用此行::nnoremap Y y$
别忘了可怜的老yyP
A
Adam

https://i.stack.imgur.com/dz2pb.gif

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

yy

然后移动到要粘贴的行,然后

p

你是用什么来制作gif的?
@Zoltán 你可以使用体积小的 LiceCap
A
Arslan Ali

年年

将拉当前行而不删除它

dd

将删除当前行

p

put 前面任一方法抓取的行


这个是第一个,但它的重复被接受:stackoverflow.com/a/73357/1438029
A
Arslan Ali

做这个:

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


是的,如果光标位于该行的末尾并且您键入如图所示的空格,您将复制您拉出的行,在您拉出的行下方 2 行。
t
the Tin Man

如果你想要另一种方式:

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

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

这有很多变化。

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

如需更多乐趣,请参阅“Vim help files


谢谢,我用它作为绑定:map d "ayy"ap
M
Mwiza

yyp - 用“yippee”记住它!

多行,中间有一个数字:

y7yp


7yy 相当于 y7y 并且可能更容易记住如何操作。
y7yp(或 7yyp)很少有用;光标停留在复制的第一行,以便 p 将复制的行粘贴在源代码的第一行和第二行之间。要复制一行行,请使用 7yyP
@Nefrubyr 或 :.,.+7 copy .+7 :P
M
Mwiza

yyp - 粘贴后

yyP - 粘贴之前


由于该行被复制,因此内容的最终结果是相同的。
@ABB但是,这里有一个微小的区别-您的光标将落在哪一行。
X
Xavier Guihot

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


R
Rook

另一种选择是:

nmap <C-d> mzyyp`z

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


佚名

您也可以尝试 ,它将从插入模式重复最后一行,并为您带来一个包含所有行的完成窗口。它几乎像


这非常有用,但为了避免按下很多键,我将其映射到 CTRL-L,这是我的映射:inoremap ^L ^X^L
M
Michael

对于不了解 vi 的人来说,上面的一些答案可能会用“粘贴...在当前行之后/之前”这样的短语来误导他。它实际上是“粘贴......在光标之后/之前”。 yy 或 Y 复制该行或 dd 删除该行

然后

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


如需更多键绑定,您可以访问此站点:vi Complete Key Binding List


D
DarkWiiPlayer

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

nnoremap <C-d> :copy .<CR>
vnoremap <C-d> :copy '><CR>

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

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

在可视模式下,它变成'<,'> copy '> 从选择开始到选择结束复制到选择结束下方的行


↑↑最佳答案在这里!
M
Mwiza

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

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


c
cori

1 陷阱:当您使用“p”放置该行时,它会将其放在光标所在的行之后,因此如果您想在您正在拉动的行之后添加该行,请不要将光标向下移动一行在放新线之前。


或使用大写 P - 放在前面
a
ap-osd

对于那些开始学习 vi 的人,这里是 vi 的一个很好的介绍,通过并排列出 vi 命令到典型的 Windows GUI 编辑器光标移动和快捷键。它列出了所有基本命令,包括 yy(复制行)和 p(粘贴后)或 P(粘贴前)。

vi (Vim) for Windows Users


N
Nathan Kulzer

如果您想复制一行并将其粘贴到当前喜欢的下方,就像在 Sublime Ctrl+Shift+D 中一样,然后您可以将其添加到您的 .vimrc 文件中。

nmap <S-C-d> <Esc>Yp

或者,对于插入模式:

imap <S-C-d> <Esc>Ypa


但是,这会离开插入模式,并且只需将 i 添加到末尾以重新输入它会破坏 undo,因此在插入模式下复制行的解决方案并不像看起来那么简单。
这对我来说非常好用:imap <S-C-d> <Esc>Ypi 插入模式和 nmap <S-C-d> <Esc>Yp 处于正常模式
S
Savrige

我更喜欢在 .vimrc 中定义自定义键盘映射 Ctrl+D 以在 normal 模式和 insert< 中复制当前行/em> 模式:

" duplicate line in normal mode:
nnoremap <C-D> Yp
" duplicate line in insert mode:
inoremap <C-D> <Esc> Ypi

y
yolenoyer

我喜欢使用这个映射:

:nnoremap yp Yp

因为它可以与原生 YP 命令一起使用。


f
frfernandezdev

我使用这个映射,类似于 vscode。我希望它有用!!!!

nnoremap <A-d> :t. <CR>==
inoremap <A-d> <Esc>:t. <CR>==gi
vnoremap <A-d> :t$ <CR>gv=gv