netrwでファイルを圧縮・解凍する(mz)と圧縮形式の変更
ダウンロードしたzipをnetrwで開こうとしたら、圧縮されたままの内容が表示されず自動で解凍されました。この挙動はmzという1つのコマンドで、圧縮も解凍も両方こなしていることを知らないと不思議に感じます。
圧縮・解凍はnetrwの機能です。Neovim 0.13でnvim .から開く一覧には用意されていません。Vim側は変わりません。Neovimで0.13以降を使っていて、この記事の操作が見当たらない場合は:Exploreを打つと従来どおりnetrwが開きます。詳しくはNeovim 0.13でnetrwが標準の一覧から外れる件にまとめています。
目次(9項目)
| キー | これだけ覚える |
|---|---|
| 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に戻しました。標準対応の拡張子だけで困ることはほとんど無いので、無理にカスタマイズしようとせず、素直にデフォルトのまま使うのが結果的に一番安定していました。
アーカイブの中身を見るのは別の仕組み
mz はファイルを圧縮・解凍するコマンドで、中身を覗くものではありません。zipやtarの中を見て特定のファイルだけを開きたい場合は、Vimに同梱されている別のプラグインが担当します。
vim archive.zip " zip.vim が中身を一覧にする
vim archive.tar.gz " tar.vim が中身を一覧にする
一覧の中でファイル名の上に Enter を押すと、その1つだけを展開して開きます。編集して保存すればアーカイブに書き戻されるので、設定ファイルが1つ入っただけのアーカイブを直すときは解凍せずに済みます。
解凍したあとの場所
mz の解凍は、アーカイブと同じディレクトリに展開します。ディレクトリを作らずに中身をばらまくアーカイブだと、その場が散らかります。
中身の構造が分からないときは、先に端末で unzip -l や tar tf を実行して確かめるか、空のディレクトリに移してから解凍してください。netrwの一覧から mx でマークしたファイルに外部コマンドを流せるので、Vimを離れずに確認することもできます。
大きいアーカイブでは待たされる
圧縮も解凍もVimが外部コマンドを呼んで同期的に実行するため、終わるまでVimの操作を受け付けません。数百MBのアーカイブを扱うと、固まったように見える時間が長く続きます。
この用途ではVimの中で完結させる利点があまり無いので、端末側で実行するか、:terminal を開いてそちらで走らせるほうが快適です。netrwの圧縮機能が向くのは、ログを1つ固めて送る、といった小さな作業です。
まとめ
netrwの圧縮・解凍はmz1コマンドで完結し、標準の拡張子であれば設定不要で使えます。圧縮形式のカスタマイズは不具合報告があるため、必要に迫られない限りデフォルトのままにしておくのが賢明です。mzが対象にするのはマークしたファイルです(:help netrw-mz)。複数まとめて圧縮したいときは、先にマークの付け方を押さえておくと手数が減ります。解凍したいアーカイブが手元に無い場合は、リモートのファイルを直接開いてから同じ操作ができます。なおmzは、マークしたものが圧縮済みなら解凍、未圧縮ならg:netrw_compress(初期値はgzip)で圧縮する、という向きの自動判定で動きます。