vimでバイナリファイルをいじる

バイナリファイルをいじることなんて滅多にないですが、まあそれでも時々はそんな機会が来るものです。 滅多に来ない機会のためにエディタ入れとくのも嫌だし、かと言っていちいちダウンロードしてくるのも・・・そんなあなたに。vimがあるじゃない。

カレントディレクトリにあるbinary.binとか言うファイルを編集するとしましょう。

$ vim -b binary.bin

こんな感じで開く。

このままだと見れたもんじゃないので、

:%! xxd

xxdコマンドでフィルタを掛けます。

すると以下のような形式に変換してくれます。

0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 3e00 0100 0000 c047 4000 0000 0000  ..>......G@.....
0000020: 4000 0000 0000 0000 b0a6 0100 0000 0000  @...............
0000030: 0000 0000 4000 3800 0a00 4000 1a00 1900  ....@.8...@.....
0000040: 0600 0000 0500 0000 4000 0000 0000 0000  ........@.......

16進数表記にしてアドレスをつけて、しかもasciiも見れるのでとてもいい感じ。

適当に編集したら、

:%! xxd -r
:w

とやってバイナリに戻して保存します。 続けて編集したいならもう一回xxdすればおっけー。

・・・と、まあこれだけでもいいのだけれどね。 何度も保存したり読み込んだりすると割と面倒くさい。ググったら自動でxxdしたりxxd -rしたりしてくれるやつが出てきました。素敵。 そのままだと問題があったのでちょっと調整して、こんな感じ。 .vimrcに丸コピーで動くはずです。

augroup BinaryXXD
  autocmd!
  autocmd BufReadPost * if &binary | silent %!xxd -g 1
  autocmd BufReadPost * set ft=xxd | endif
  autocmd BufWritePre * if &binary | %!xxd -r
  autocmd BufWritePre * endif
  autocmd BufWritePost * if &binary | silent %!xxd -g 1
  autocmd BufWritePost * set nomod | endif
augroup END

あんまりよく分かってないけど、まあきっと大丈夫でしょう。動いてるし。

バイナリ表示を無効にしたかったら

:autocmd! BinaryXXD

としてから開き直せば良いようです。

:set nobin

でも良い気がするけれど、これだとバイナリモードも無効になっちゃうから・・・まあ、使い分け?

いやぁ、便利だねぇ。

参考:vimでバイナリを表示し、値を変更したい - rderaログ