パーソナルツール

swapファイルが見つかった場合にどのように対処すべきか(クラッシュからのリカバリー)

作者: 小見 拓 最終変更 2012年01月08日 11時58分

vimエディタでは、ユーザーがオリジナルのファイルから変更した情報やアンドゥ用の情報を swapファイルに格納しており、 もしなんらかの原因で編集情報を保存する前にvimエディタが強制終了したとしても、 オリジナルのファイルと、このswapファイルがあれば、強制終了前の状態を復元できます。 (Windows, Mac)

概要

vimエディタでは、ユーザーがオリジナルのファイルから変更した情報やアンドゥ用の情報を swapファイルに格納しており、
もしなんらかの原因で編集情報を保存する前にvimエディタが強制終了したとしても、
オリジナルのファイルと、このswapファイルがあれば、強制終了前の状態を復元できます。

swapファイルが見つかった

swapファイルを検出する状況

swapファイルが見つかる場合、次のケースが考えられます。

  • 他のvimエディタで同じファイルを編集している
  • ファイルを編集している最中にvimエディタがエラーで強制終了した

swapファイルが見つかった場合はダイアログが表示され、どう対処すべきか問われます。
この場合、選べる選択肢は次の6択です。

swapファイルが見つかった(gvim)

ターミナル版vimエディタの場合は、 O E R D Q A のどれかを
キーボードで入力して、選択します。

swapファイルが見つかった(vim)

Note

このダイアログ、メッセージが表示されない場合は、 「shortmess」変数に「A」オプションが設定されている可能性があります。
その場合は、次の設定をvimエディタの設定ファイルに記述すれば、 ダイアログ、メッセージが表示されるようになるはずです。

:set shortmess-=A

逆に次のように設定すれば、ダイアログ、メッセージは表示されなくなりますが、
デメリットに対して、メリットはほとんどありません。止めておきましょう。

:set shortmess+=A

それぞれの選択肢について

読み込み専用で開く(O)

読み込み専用でファイルを開きます。
この選択肢は、 クラッシュから復元する前にオリジナルのファイルの中身を確認したい場合、
他の人が同じファイルを編集しているがファイルの中身の確認をしたい場合 などに選択すれば良いでしょう。

swapファイルは新たに別名のファイルが作成されます。
この状態でも :w! とコマンド入力すれば強制的に編集を保存することは可能ですが、 編集ファイルより古いswapファイルが残ることになります。

古い方のswapファイルが残ってしまう

「読み込み専用」で開いていても :recover コマンドを実行すれば、 swapファイルからのリカバリーはできます。
その場合、リカバリー後のファイルは読み取り専用の状態になります。

:recover

とにかく編集する(E)

ファイルシステム上のオリジナルのファイルに対して、編集を行います。
swapファイルは新たに別名のファイルが作成されます。
この選択をしてからファイルを保存すると、 「読み込み専用で開く」を選択して強制保存した時と同様、 編集ファイルより古いswapファイルが残ります。

「とにかく編集する」を選んでも :recover コマンドを実行すれば、 swapファイルからリカバリーはできます。

:recover

復活させる(R)

オリジナルのファイルとswapファイルを使用して、クラッシュ前の状態を復元します。
「スワップファイルより新しいです!」とメッセージが表示されている場合、 リカバリーすると状態が古くなってしまうことがあるので注意してください。

古いswapファイルが見つかった

リカバリーしてもswapファイルは残るので、
「ファイルの保存」さえしなければ、
リカバリーしたらどうなるのかの確認にも使えます。

削除する(D)

swapファイルを削除して、オリジナルのファイルの編集を行います。
swapファイルからの復元が不要な場合や、
swapファイルが編集ファイルより古くなっている場合などに選択します。

終了する(Q)

ファイルを開くのを止めます。
他にバッファを開いているセッションか、ウィンドウが無ければ、vimエディタも終了します。
他のvimエディタで同じファイルを編集している場合などに選択します。

中止(A)

現在作業中の処理を停止します。 通常は、「現在作業中の処理=ファイルを開く処理」であることが多いでしょう。
スクリプトで連続にファイルを開いているような場合には、そのスクリプトの処理が停止されます。
終了する(Q) と同じく、他にバッファを開いているセッションか、ウィンドウが無ければ、 vimエディタも終了します。

結局、どのように対処すべきか

状況としては、次の場合が考えれるでしょうか。

他のvimエディタで同じファイルを開いている場合

この場合の対処としては、次のような方法が考えられます。上2つの方法がお勧めです。
一番下の方法は、よほど急いでいるのでなければ、お勧めできません。

  • 「終了する(Q)」を選んで、他のvimエディタの作業が終わるのを待つ
  • ファイルの中身を見たいだけなら「読み込み専用」でファイルを開いて見る
  • 「読み込み専用」で開いて別のファイルに中身を逃がし、他のvimエディタの作業終了後マージ作業する

クラッシュ直前までの編集情報を破棄しても構わない場合

保存前の情報を破棄して良いのであれば、 「削除する(D)」を選んでファイルシステムに残っていたswapファイルを削除します。
元々、vimエディタにクラッシュからリカバリーする機能など付いていなかった、と思えるなら、 常にこの選択視を選んでしまっても良いのかもしれません。
(ただし、シングルユーザーで操作している人のみ)

古いスワップファイルが残っている場合

古いswapファイルからでもリカバリーできなくはないのですが、
大抵の場合、「削除する(D)」を選んでswapファイルを削除した方が良いでしょう。

どうするべきか判断がつかない場合

どこまでの編集データが失われたのか、 どのようなデータが復旧できるのかわからない場合、
一度、swapファイルからリカバリーして、 ファイルシステム上のファイルと比較するのが安全です。

最もミスが起こりづらく、安全であろう手順は次の通りです。

  • 「読み込み専用で開く」
  • :recover コマンドを実行し、読込専用の状態で復元
  • 復元したファイルを、別の名前でファイルシステムに書き出す。
  • ファイルを :e コマンドで読み込み直す。
  • swapファイルが見つかる。
  • 「読み込み専用で開く」
  • ファイルシステムに逃がしたリカバリー済みのファイルと比較する。
  • リカバリーするか、swapファイルを破棄するかの判断を下す。
  • ファイルシステムに逃がしたリカバリー済みのファイルは、もう不要なので削除する。
" ダイアログから「読み込み専用で開く」を選択
:recover
:w %.bk
:e
" ダイアログから「読み込み専用で開く」を選択
:VDsplit %.bk

Note

vimエディタのコマンドの中で「%」を使うと、 コマンド実行時に開いているファイルのパスと置き換わります。
つまり、「%.bk」は今開いているファイルのパスに「.bk」をつけたPATHに置き換わります。

Note

:e コマンドをファイル名指定なしで実行すると、今開いているファイルを読み込みなおします。

Note

:VDsplit は、今開いているファイルと、指定のファイルとの比較を行うコマンドです。
参考: 2つのテキストファイルの差分を取る

クラッシュ前の状態までリカバリーしたい場合

失われた情報をどうしても復元したい場合は、ダイアログから「復活させる(R)」を選択します。
ただし、完全には復元できない時もあります。
復元を選択した場合、ファイルシステムに残っていたswapファイルは不要になるので、 復元完了したのを確認した後、swapファイルは削除します。

復元する場合の手順は次の通りです。

  • 「復活させる」
  • :w コマンドでバッファをファイルに書き出す
  • ファイルを :e コマンドで読み込み直す。
  • swapファイルが見つかる。
  • 「削除する」
  • 古いswapファイルが削除される。
" ダイアログから「復活させる」を選択
:w
:e
" ダイアログから「削除する」を選択

Note

:e コマンドをファイル名指定なしで実行すると、 今開いているファイルを読み込みなおします。
:w コマンドをファイル名指定なしで実行すると、 編集中のバッファを、今開いているファイルと同じ名前で ファイルシステムに書き出します。

上の説明が難しくて、わからなかった場合

上の章で説明している方法は、 安全のため、いくつか余計なステップを踏んでいるので、 少し難しくなっています。

難しくて良くわからなかった人は、「上の3択をダイアログから選択すれば良い」、 と覚えれば良いです。
この場合、不要になったswapファイルは、エクスプローラーでごみ箱に入れてください。

ドキュメントアクション
コメント
blog comments powered by Disqus