f

アーカイブ

2016-04-29

Configuration of editing binary file for Vim

バイナリーファイルを処理する必要が出てきて,ファイルを16進数表記で表示したくなったので,Vimでどうすればいいか調べた。

以下の記事やVimのヘルプがとても参考になった。

hex表示するための基本的な手順は以下となる。

  1. バイナリモードでファイルを開く(-bオプション。ex: vim -b a.dat)。
  2. %!xxdコマンドで現在開いているバッファをバイナリ表示。
  3. 任意の箇所を変更。
  4. %!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で快適にバイナリーファイルを編集することができるだろう。

0 件のコメント:

コメントを投稿