Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Say I have a block of text like this:

// Comment1
// Comment2
// Comment3

And I want to append each of these lines to the end of 3 corresponding lines of code:

foo = 1;
bar = 2;
baz = 3;

So that the end result is

foo = 1; // Comment1
bar = 2; // Comment2
baz = 3; // Comment3

Is there an easy way to do this in Vim?

share|improve this question

migrated from Jun 21 '11 at 21:47

This question came from our site for professional and enthusiast programmers.

@Flimzy, unfortunately no. From time to time comments like yours appear in Vim questions, but check this: – sidyll Jun 21 '11 at 18:26
up vote 18 down vote accepted

Use visual block mode (Ctrl+v) to select one set of lines, then either y or d them.

Then, if you selected the foo, bar, baz lines use visual block mode again to select the first column of the comment lines and then Shift+p them into place (or if you selected the comment lines, select the last column of the foo bar baz lines and p them into place.

Getting the hang of positioning might take a bit of practice, but when you've got the knack you'll be flying. When you've got a block selected you can also use Shift+A to append e.g. spaces to the block (when appending, the new text will only appear in the top line, but when you hit esc it will magically appear in all the selected lines). Similarly, Shift+i will do the same at the beginning of the selected block on each line.

You'll need to clean up the empty lines afterwards though.

There's also a great vimcasts episode showing these techniques in more detail.

share|improve this answer
I find this solution coupled with :set ve=all to be very versatile. I personally use the UnconditionalPaste plugin ( as it fits my need a bit better. – Peter Rincker Jun 21 '11 at 18:32
+1 for really nice trick. – TLP Jun 21 '11 at 18:41

Well, if it is easy or not, you tell me. Navigate to // Comment 1, hit dd to delete. Navigate to the line with foo = 1; and hit p, to paste in below the line. Move up to foo again, and hit J to join the row. Tada.

share|improve this answer

The following will do exactly what you describe:

:%s@\(\w\s\+=\s\+\(\d\+\)\)@\=submatch(1) . " // Comment" . submatch(2)@

Depending on what you actually need done (as opposed to the example), in practice, it might be more straightforward to block-select the "// Comment1" etc. block (Ctrlv), yank (y), go to the end of the code block and paste.

share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .