Configuration of editing binary file for Vim
バイナリーファイルを処理する必要が出てきて,ファイルを16進数表記で表示したくなったので,Vimでどうすればいいか調べた。
以下の記事やVimのヘルプがとても参考になった。
hex表示するための基本的な手順は以下となる。
- バイナリモードでファイルを開く(-bオプション。ex:
vim -b a.dat
)。 %!xxd
コマンドで現在開いているバッファをバイナリ表示。- 任意の箇所を変更。
%!xxd -r
コマンドでテキストに戻す。
xxd
というテキストをhex表記に変換したり,逆にhex表記をテキストに変換する(xxd -r
)コマンドを利用している。xxd
コマンドはVimに標準で付属しているので,LinuxだけでなくWindows環境でも問題なく使える。
ただ,バイナリ表記したいときと保存するときに,いちいちコマンドを打たないといけないのは面倒だし,変換を忘れる危険性がある。そこで,バイナリーモードで開いたら自動的にhex表記するように以下のとおりに設定する。
"" Binary "バイナリ編集(xxd)モード(vim -b での起動、または *.bin ファイルを開くと発動) augroup BinaryXXD autocmd! autocmd BufReadPre *.bin let &binary=1 autocmd BufReadPost * if &binary | silent %!xxd -g 1 autocmd BufReadPost * set ft=xxd | endif autocmd BufWritePre * if &binary | execute '%!xxd -r' | endif autocmd BufWritePost * if &binary | silent %!xxd -g 1 autocmd BufWritePost * set nomod | endif augroup END
ただし,この設定のままだとうまくいかないときがある。それは,ファイルが変更不可(set nomodifiable
)のときだ。
例えば,:help xxd
などでhelpファイルを開こうとすると,4行目のif &binary | silent
の行で以下のエラーが出た。
Error detected while proessIng BufRead auto commands for "*": E21: Cannot make changes, 'modifiable' is off
実際に上記の設定とset nocompatible
だけを記入したvimrc
ファイルを用意して,以下のコマンドで設定ファイルを指定してvimを起動してヘルプを閲覧して確認した。
vim -u ~/vimrc
:help xxd
Windows10のMSYS2のVim 7.4.872とUbuntu 14.04のVim 7.4.52ではこのエラーは出なかったが,Fedora19のVim 7.4.417とCentOS 7のVim 7.4.160ではエラーが出た。
おそらくVimのコンパイル時に有効になっている機能の違いによるものと想定する。そこで,ファイルが変更可能であるかという条件も設定で考慮する。
"" Binary
"バイナリ編集(xxd)モード(vim -b での起動、または *.bin ファイルを開くと発動)
augroup BinaryXXD
autocmd!
autocmd BufReadPre *.bin let &binary=1
autocmd BufReadPost * if &binary && &modifiable | silent %!xxd -g 1
autocmd BufReadPost * set filetype=xxd | endif
autocmd BufWritePre * if &binary | execute '%!xxd -r' | endif
autocmd BufWritePost * if &binary | silent %!xxd -g 1
autocmd BufWritePost * set nomod | endif
augroup END
上記の6行目のsilent %!xxd -g 1
において,if &binary && &modifiable
のように,modifiable
がオンのときにだけ,hex表記するようにした。
これで,Vimで快適にバイナリーファイルを編集することができるだろう。