BlankTar

about | blog | works | photo

バイナリファイルをいじることなんて滅多にないですが、まあそれでも時々はそんな機会が来るものです。
滅多に来ない機会のためにエディタ入れとくのも嫌だし、かと言っていちいちダウンロードしてくるのも・・・そんなあなたに。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ログ
< HaskellでProject Eulerに挑戦してみた python標準のunittestのカバレッジを取る >