2091

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?

3
  • 251
    Would you like to duplicate this line? Yes Please. :) Commented Jan 26, 2017 at 15:56
  • 12
    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. Commented Nov 17, 2019 at 16:48
  • 1
    Whenever I'm creating a new crontab notification I've been doing it the clumsy way. I need to write a sticky note on my monitor. Commented Aug 30, 2024 at 17:23

23 Answers 23

3453

First:

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
Shift + P to paste the copied or deleted text before the current line

Sign up to request clarification or add additional context in comments.

12 Comments

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.
|
508

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

10 Comments

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.
|
342

YP or Yp or yyp.

2 Comments

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
315

copy and paste in vim

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

yy 

then move to the line you want to paste at and

p 

4 Comments

What did you use to make the gif?
@Zoltán you can use LiceCap, which is small size
Does LiceCap overlay keypresses like that? I don't see that setting...
72

Do this:

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

1 Comment

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.
68

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

1 Comment

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

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.

1 Comment

Thanks, I used this as a bind: map <Leader>d "ayy"ap
53

yyp - remember it with "yippee!"

Multiple lines with a number in between:

y7yp

3 Comments

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
33

yyp - paste after

yyP - paste before

2 Comments

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.
19

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

Comments

15

Another option would be to go with:

nmap <C-d> mzyyp`z 

gives you the advantage of preserving the cursor position.

Comments

12

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

1 Comment

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
11

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.

1 Comment

↑↑ best answer here!
9

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

Comments

6

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 

1 Comment

that is exacly what i was looking for!
5

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

Comments

5

#copy current line
usage:
press yy (to copy current line)
press p (to paste copied line)

#help&more:
https://www.youtube.com/watch?v=HMpB28l1sLc

Comments

3

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.

1 Comment

or use capital P - put before
3

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

Comments

3

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

2 Comments

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
1

I like to use this mapping:

:nnoremap yp Yp 

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

Comments

1

If you want to duplicate a line just below, the answers above are correct.

Another common case would be if you are somewhere in your text, and you want to duplicate a line located far away in your buffer, out of sight, and you don't want to go there, for some reason.

In this case:

  • begin typing a few letters of the beginning of the line that you want to duplicate;
  • hit Ctrl-X Ctrl-L: this will bring a pop-up list similar to the autocompletion one (Ctrl-P and Ctrl-N);
  • navigate up and down through this list with Ctrl-L and Ctrl-N until you get the line you wish;
  • hit Enter, and voilà.

I find this particularly handy when you write code.

Comments

0

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 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.