vimline-numbers

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


How can I add line numbers to a range of lines in a file opened in Vim? Not as in :set nu—this just displays line numbers—but actually have them be prepended to each line in the file?


Solution

  • 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()|)