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
でも良い気がするけれど、これだとバイナリモードも無効になっちゃうから・・・まあ、使い分け?
いやぁ、便利だねぇ。