How to add line numbers to range of lines in Vim?

With

:%s/^/\=line('.')/

EDIT: to sum up the comments.

This command can be tweaked as much as you want.


Let's say you want to add numbers in front of lines from a visual selection (V + move), and you want the numbering to start at 42.

:'<,'>s/^/\=(line('.')-line("'<")+42)/

If you want to add a string between the number and the old text from the line, just concatenate (with . in VimL) it to the number-expression:

:'<,'>s/^/\=(line('.')-line("'<")+42).' --> '/

If you need this to sort as text, you may want to zero pad the results, which can be done using printf for 0001, 0002 ... instead of 1, 2... eg:

:%s/^/\=printf('%04d', line('.'))/

Anyway, if you want more information, just open vim help: :h :s and follow the links (|subreplace-special|, ..., |submatch()|)


cat -n adds line numbers to its input. You can pipe the current file to cat -n and replace the current buffer with what it prints to stdout. Fortunately this convoluted solution is less than 10 characters in vim:

 :%!cat -n

Or, if you want just a subselection, visually select the area, and type this:

 :!cat -n

That will automatically put the visual selection markers in, and will look like this after you've typed it:

 :'<,'>!cat -n

In order to erase the line numbers, I recommend using control-v, which will allow you to visually select a rectangle, you can then delete that rectangle with x.


On a GNU system: with the external nl binary:

:%!nl