ChatGPT解决这个技术问题 Extra ChatGPT

How to duplicate a whole line in Vim?

How do I duplicate a whole line in Vim in a similar way to Ctrl+D in IntelliJ IDEA/ Resharper or Ctrl+Alt+↑/↓ in Eclipse?

Do people not run vimtutor anymore? This is probably within the first five minutes of learning how to use Vim.
Would you like to duplicate this line? Yes Please. :)
FWIW I have done vimtutor about a dozen times in the last 2 months and this concept is not covered. It tells how to do “dd” and “v - navigate - y” followed by “p”. It does not tell how to copy a single line without deleting it as is asked here.

i
iono

yy or Y to copy the line (mnemonic: yank) or dd to delete the line (Vim copies what you deleted into a clipboard-like "register", like a cut operation)

then

p to paste the copied or deleted text after the current line or P to paste the copied or deleted text before the current line


An excellent point. For some reason though, I find hitting y twice is faster for me than SHIFT-y
@camflan I think the Y should be "copy from the cursor to the end"
and 2yy can be used to copy 2 lines (and for any other n)
@nXqd: Yes, a big percentage of users maps Y to y$. (Consistent with D and C; (but not Vi compatible (no one cares.))) That is even proposed in :help Y.
To copy two lines, it's even faster just to go yj or yk, especially since you don't double up on one character. Plus, yk is a backwards version that 2yy can't do, and you can put the number of lines to reach backwards in y9j or y2k, etc.. Only difference is that your count has to be n-1 for a total of n lines, but your head can learn that anyway.
H
Hjulle

Normal mode: see other answers.

The Ex way:

:t. will duplicate the line,

:t 7 will copy it after line 7,

:,+t0 will copy current and next line at the beginning of the file (,+ is a synonym for the range .,.+1),

:1,t$ will copy lines from beginning till cursor position to the end (1, is a synonym for the range 1,.).

If you need to move instead of copying, use :m instead of :t.

This can be really powerful if you combine it with :g or :v:

:v/foo/m$ will move all lines not matching the pattern “foo” to the end of the file.

:+,$g/^\s*class\s\+\i\+/t. will copy all subsequent lines of the form class xxx right after the cursor.

Reference: :help range, :help :t, :help :g, :help :m and :help :v


When you press : in visual mode, it is transformed to '<,'> so it pre-selects the line range the visual selection spanned over. So, in visual mode, :t0 will copy the lines at the beginning.
For the record: when you type a colon (:) you go into command line mode where you can enter Ex commands. vimdoc.sourceforge.net/htmldoc/cmdline.html Ex commands can be really powerful and terse. The yyp solutions are "Normal mode" commands. If you want to copy/move/delete a far-away line or range of lines an Ex command can be a lot faster.
Downvoted not due to a problem with the answer as such (although it wouldn't work for my situation, I have no idea the line number I want to duplicate to) but because it REALLY shouldn't be the top / accepted answer for this commonly searched question.
@mjaggard: accepted answers are always at the top, regardless of their score. Yes I added that answer as a complement, and it seems it suited the OP well.
:t. is the exact answer to the question.
T
Tim Cooper

YP or Yp or yyp.


Y is usually remapped to y$ (yank (copy) until end of line (from current cursor position, not beginning of line)) though. With this line in .vimrc: :nnoremap Y y$
Don't forget poor old yyP
A
Adam

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

Doesn't get any simpler than this! From normal mode:

yy

then move to the line you want to paste at and

p

What did you use to make the gif?
@Zoltán you can use LiceCap, which is small size
A
Arslan Ali

yy

will yank the current line without deleting it

dd

will delete the current line

p

will put a line grabbed by either of the previous methods


This one came first but it's duplicate is accepted: stackoverflow.com/a/73357/1438029
A
Arslan Ali

Do this:

First, yy to copy the current line, and then p to paste.


Yes, if the cursor is at the end of the line and you type the space as shown you'll duplicate the line you yanked a 2 lines below the line you yanked.
t
the Tin Man

If you want another way:

"ayy: This will store the line in buffer a.

"ap: This will put the contents of buffer a at the cursor.

There are many variations on this.

"a5yy: This will store the 5 lines in buffer a.

See "Vim help files for more fun.


Thanks, I used this as a bind: map d "ayy"ap
M
Mwiza

yyp - remember it with "yippee!"

Multiple lines with a number in between:

y7yp


7yy is equivalent to y7y and is probably easier to remember how to do.
y7yp (or 7yyp) is rarely useful; the cursor remains on the first line copied so that p pastes the copied lines between the first and second line of the source. To duplicate a block of lines use 7yyP
@Nefrubyr or :.,.+7 copy .+7 :P
M
Mwiza

yyp - paste after

yyP - paste before


Since the line is being duplicated, the end result of the content is the same.
@A-B-B However, there is a miniature difference here - what line will your cursor land on.
X
Xavier Guihot

I like: Shift+v (to select the whole line immediately and let you select other lines if you want), y, p


R
Rook

Another option would be to go with:

nmap <C-d> mzyyp`z

gives you the advantage of preserving the cursor position.


佚名

You can also try which will repeat the last line from insert mode and brings you a completion window with all of the lines. It works almost like


This is very useful, but to avoid having to press many keys I have mapped it to just CTRL-L, this is my map: inoremap ^L ^X^L
M
Michael

For someone who doesn't know vi, some answers from above might mislead him with phrases like "paste ... after/before current line". It's actually "paste ... after/before cursor". yy or Y to copy the line or dd to delete the line

then

p to paste the copied or deleted text after the cursor or P to paste the copied or deleted text before the cursor


For more key bindings, you can visit this site: vi Complete Key Binding List


D
DarkWiiPlayer

I know I'm late to the party, but whatever; I have this in my .vimrc:

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

the :copy command just copies the selected line or the range (always whole lines) to below the line number given as its argument.

In normal mode what this does is copy . copy this line to just below this line.

And in visual mode it turns into '<,'> copy '> copy from start of selection to end of selection to the line below end of selection.


↑↑ best answer here!
M
Mwiza

Default is yyp, but I've been using this rebinding for a year or so and love it:

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


c
cori

1 gotcha: when you use "p" to put the line, it puts it after the line your cursor is on, so if you want to add the line after the line you're yanking, don't move the cursor down a line before putting the new line.


or use capital P - put before
a
ap-osd

For those starting to learn vi, here is a good introduction to vi by listing side by side vi commands to typical Windows GUI Editor cursor movement and shortcut keys. It lists all the basic commands including yy (copy line) and p (paste after) or P(paste before).

vi (Vim) for Windows Users


N
Nathan Kulzer

If you would like to duplicate a line and paste it right away below the current like, just like in Sublime Ctrl+Shift+D, then you can add this to your .vimrc file.

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

Or, for Insert mode:

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


This leaves insert mode though, and just adding i to the end to re-enter it breaks undo, so the solution to duplicating lines in insert mode is not as trivial as it seems.
This works perfectly fine for me: imap <S-C-d> <Esc>Ypi insert mode and nmap <S-C-d> <Esc>Yp in normal mode
S
Savrige

I prefer to define a custom keymap Ctrl+D in .vimrc to duplicate the current line both in normal mode and insert mode:

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

y
yolenoyer

I like to use this mapping:

:nnoremap yp Yp

because it makes it consistent to use alongside the native YP command.


f
frfernandezdev

I use this mapping, which is similar to vscode. I hope it is useful!!!.

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