Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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?

like image 518
Nathan Fellman Avatar asked Jul 13 '09 08:07

Nathan Fellman


2 Answers

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
like image 153
DrAl Avatar answered Oct 22 '22 12:10

DrAl


Yet another way:

:rubydo $_ = '0x%x' % $_

Or:

:perldo $_ = sprintf '0x%x', $_

This is a bit less typing and you avoid a level of quoting / shell escaping that you'd get if you did this via :!. You need Perl / Ruby support compiled into your Vim.

like image 36
Brian Carper Avatar answered Oct 22 '22 11:10

Brian Carper