netrwでファイルを圧縮・解凍する(mz)と圧縮形式の変更
ダウンロードしたzipをnetrwで開こうとしたら、圧縮されたままの内容が表示されず自動で解凍されました。この挙動はmzという1つのコマンドで、圧縮も解凍も両方こなしていることを知らないと不思議に感じます。
| キー | これだけ覚える |
|---|---|
| mf | 圧縮/解凍したいファイルをマーク |
| mz | マーク済みファイルを圧縮(未圧縮なら)/解凍(圧縮済みなら) |
mzで圧縮・解凍する
mf " 対象ファイルをマークする
mz " 圧縮または解凍を実行する
mzは対象が圧縮ファイルなら解凍し、通常ファイルなら圧縮する、という双方向の動作をする1つのコマンドです。Vimのヘルプでは「解凍」ではなく「伸長」と訳されていますが、意味は同じなのでどちらで覚えても問題ありません。
notes.txt
archive.tar.gz
notes.txt.gz
archive.tar.gz
デフォルトの圧縮・解凍形式
標準の圧縮形式はgzipで、解凍については拡張子ごとに対応するコマンドが辞書として定義されています。
let g:netrw_compress = "gzip"
let g:netrw_decompress = {
\ ".gz" : "gunzip",
\ ".bz2" : "bunzip2",
\ ".zip" : "unzip",
\ ".tar" : "tar -xf"
\ }
解凍側は.gz・.bz2・.zip・.tarに標準対応しています。これらの拡張子であれば、mzを押すだけで対応するコマンドが自動的に選ばれます。
圧縮形式を変更したい場合の注意
g:netrw_compressを書き換えれば、圧縮に使うコマンド自体を変更できます。
let g:netrw_compress = "bzip2"
ただし、この設定変更には既知の不安定さがあります。gzip以外に変更すると圧縮自体がうまく動かなかったり、変更後に解凍側の動作までおかしくなるケースが報告されています。原因は設定方法の問題なのか、netrw自体の実装の癖なのか判然としません。よほどの理由がない限り、圧縮形式はデフォルトのgzipのまま使うのが無難です。
7zipやrarを使いたい場合
g:netrw_decompressの辞書に拡張子とコマンドの対応を追加すれば、7zipやrarなどの他の形式にも解凍対応を広げられます。ただし、そこまでnetrwに機能を寄せるくらいなら、対象の圧縮ファイルだけは素直にシェルやOS標準の解凍ツールに任せたほうが、トラブルを抱え込まずに済むことが多くあります。
bzip2に圧縮形式を変えてみたところ、たしかに解凍側の挙動が怪しくなり、結局gzipに戻しました。標準対応の拡張子だけで困ることはほとんど無いので、無理にカスタマイズしようとせず、素直にデフォルトのまま使うのが結果的に一番安定していました。
まとめ
netrwの圧縮・解凍はmz1コマンドで完結し、標準の拡張子であれば設定不要で使えます。圧縮形式のカスタマイズは不具合報告があるため、必要に迫られない限りデフォルトのままにしておくのが賢明です。