How to delete every other line in Vim?

I would like to delete every other line from a Vim buffer, starting with the second one, i.e., lines 2, 4, 6, etc. For example, if the buffer’s contents is:

aaa
bbb
ccc
ddd
eee
fff

then, after the desired line removal, it should become:

aaa
ccc
eee

Which Vim commands can be used to automate this operation?


An elegant (and efficient) way to accomplish the task is to invoke the :delete command (see :help :d) for the + line range (same as .+1) addressing the line following the current one (see :help {address}), on every line (see :help /^) using the :global command (see :help :g):

:g/^/+d

You can use a macro for this. Do the following.

  • Start in command mode.
  • Go to the beginning of the file by pressing gg.
  • Press qq.
  • Click arrow down and press dd after.
  • Press q.
  • Press 10000@q

PS: To go to command mode just press Escape a couple of times.


We can use the :normal (or :norm) command to execute the j and dd Normal-mode commands:

:%norm jdd

Source: the Best of Vim Tips page by zzapper.


:map ^o ddj^o
^o

Here ^ stand for CTRL. Recursive macro to delete a line every two line. Choose well your first line and it's done.


from vim mail archive:

:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile

(To be typed on one line on the vim command line, will delete row 1,3,5,7,...)