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