Search code examples
vim

How can I convert a decimal number to hex in VIM?


I have this column in a file I'm editing in VIM:

16128
16132
16136
16140
# etc...

And I want to convert it to this column:

0x3f00
0x3f04
0x3f08
0x3f0c
# etc...

How can I do this in VIM?


Solution

  • Use printf (analogous to C's sprintf) with the \= command to handle the replacement:

    :%s/\d\+/\=printf("0x%04x", submatch(0))
    

    Details:

    • :%s/\d\+/ : Match one or more digits (\d\+) on any line (:%) and substitute (s).
    • \= : for each match, replace with the result of the following expression:
    • printf("0x%04x", : produce a string using the format "0x%04x", which corresponds to a literal 0x followed by a four digit (or more) hex number, padded with zeros.
    • submatch(0) : The result of the complete match (i.e. the number).

    For more information, see:

    :help printf()
    :help submatch()
    :help sub-replace-special
    :help :s