Next: , Previous: , Up: 目次   [Index]


クラッシュからの復歸

*usr_11.txt*	For Vim バージョン 8.1.  Last change: 2019 Apr 28

		     VIM USER MANUAL - by Bram Moolenaar

			   クラッシュからの復歸

マシンがクラッシュした? しかも何時閒もかけて編輯してゐたところだつた? 慌てないで! 作業を復元するための情報がハードディスクに記錄されてゐます。この章では、作業の復元方法や、スワップファイルの扱ひについて說明します。

|11.1|リカバリの基本
|11.2|スワップファイルはどこにある?
|11.3|クラッシュした?
|11.4|さらなる情報

リカバリの基本

ほとんどの場合、編輯していたファイルの名前さへ覺えてゐれば (そしてハードディスクが正しく動いてゐれば) ファイルのリカバリはとても簡單です。Vim を起動するときに、ファイル名に "-r" 引數を付けるだけです:

vim -r help.txt

スワップファイル (編輯中の文書を保持するのに使はれる) が讀み込まれ、編輯していたファイルのかけらが讀み込まれます。變更がリカバリされると次のやうなメッセージが表示されます (もちろん、ファイル名は違ふでせう):

Using swap file ".help.txt.swp"
Original file "~/vim/runtime/doc/help.txt"
Recovery completed. You should check if everything is OK.
(You might want to write out this file under another name
and run diff with the original file to check for changes)
You may want to delete the .swp file now.

日本語:

スワップファイル ".help.txt.swp" を使用中
原本ファイル "~/vim/runtime/doc/help.txt"
リカバリが終了しました. 全てが正しいかチェックしてください.
(變更をチェックするために, このファイルを別の名前で保存した上で
原本ファイルとの diff を實行すると良いでせう)
それから.swpファイルを削除してください

念のため、ファイルを違ふ名前で保存しませう:

:write help.txt.recovered

原本ファイルと比較して、正しく復元できたどうかを確認してください。それには vimdiff (|08.7|) が便利です。例:

:write help.txt.recovered
:edit #
:diffsp help.txt

復元したファイルが、原本ファイル (クラッシュする前に保存してあつたファイル) の內容を含んでゐることを確認し、失はれた行がないかどうかも確認してください (Vim がリカバリに失敗することもあるので)。

リカバリ時に警告メッセージが表示された場合は、それを注意深く讀んでください。まあ、そんなことは滅多にありませんが。

リカバリ後のテキストがファイル內のテキストと同じ場合は次のやうなメッセージが表示されます:

Using swap file ".help.txt.swp"
Original file "~/vim/runtime/doc/help.txt"
Recovery completed. Buffer contents equals file contents.
You may want to delete the .swp file now.

日本語:

スワップファイル ".help.txt.swp" を使用中
原本ファイル "~/vim/runtime/doc/help.txt"
リカバリが終了しました. バッファの內容とファイルの內容は同じです.
それから.swpファイルを削除してください

これが起こるのは既にファイルをリカバリしてゐたか、何か變更したあとでファイルを保存してゐた場合などです。この場合は安全にスワップファイルを削除できます。

普通は、クラッシュ直前の變更はリカバリできません。スワップファイルは、四秒閒入力がなかつたときや、約 200 文字入力されるごとに、ディスクに書き出されます。この動作は ’updatetime’ と ’updatecount’ で設定できます。ですから、變更を保存する閒もなしにシステムがダウンすると、最後に書き出した後の變更は失はれてしまふのです。

名前のないファイルを編輯してゐた場合は、引數に空文字列を與へてください:

vim -r ""

これは正しいディレクトリで實行してください。ディレクトリが違ふとスワップファイルを檢出できません。

スワップファイルはどこにある?

スワップファイルはいろんな場所に保存できます。通常は原本ファイルと同じディレクトリに保存されます。スワップファイルを見つけるには、ファイルのあるディレクトリに移動して、次のコマンドを使ひます:

vim -r

檢出されたスワップファイルの一覽が表示されます。カレントディレクトリのファイルのスワップファイルが別ディレクトリにある場合はそれも表示されます。ディレクトリツリーを再歸的に處理したりはしません。

出力は次のやうなものです:

スワップファイルが複數見つかりました:
   現在のディレクトリ:
1.    .main.c.swp
        所有者: mool   日附: Tue May 29 21:00:25 2001
    ファイル名: ~mool/vim/vim6/src/main.c
      變更狀態: あり
    ユーザー名: mool   ホスト名: masaka.moolenaar.net
    プロセスID: 12525
   ディレクトリ ~/tmp:
      -- なし --
   ディレクトリ /var/tmp:
      -- なし --
   ディレクトリ /tmp:
      -- なし --

リカバリを實行したとき、スワップファイルが複數見つかつた場合は、スワップファイルの一覽が表示されるので、使ひたいスワップファイルを番號で選擇してください。日附を見て愼重に選擇してください。

どれを指定したらよいかわからない場合は、1 つずつ試して中身を確認してください。

スワップファイルを直接指定する

使ひたいスワップファイルがわかつてゐる場合は、スワップファイルの名前を指定すればリカバリすることができます。原本ファイルの名前はスワップファイルから取得されます。

例:

vim -r .help.txt.swo

これはスワップファイルが本來の場所以外にあるときも便利です。Vim は ‘*.s[uvw][a-z]’ のパターンにマッチするファイルをスワップファイルとして認識します。

うまく動作しない場合は、Vim が表示したファイル名を見て、それにしたがつてファイル名を變更してください。’directory’ オプションを確認し、スワップファイルが保存される場所も確認してください。

Note:
スワップファイルには、’dir’ オプションに指定されたディレクトリ內の、"filename.sw?" といふパターンにマッチしたファイルが使はれます。ワイルドカードの展開ができなかつた (例へば ’shell’ オプションが無效であつた) 場合は、"filname.swp" といふファイルが檢索されます。それも失敗した場合は、スワップファイルを直接指定してリカバリするしかありません。

クラッシュした?

Vim には、うつかりミスを防止するための仕組みがあります。ファイルを開かうとしたときに、次のやうなメッセージが表示されることがあります:

E325:注意
次の名前でスワップファイルを見つけました ".main.c.swp"
        所有者: mool   日附: Tue May 29 21:09:28 2001
    ファイル名: ~mool/vim/vim6/src/main.c
      變更狀態: なし
        ユーザー名: mool   ホスト名: masaka.moolenaar.net
    プロセスID: 12559 (まだ實行中)
次のファイルを開いてゐる最中 "main.c"
          日附: Tue May 29 19:46:12 2001

(1) 別のプログラムが同じファイルを編輯してゐるかもしれません.
    この場合には, 變更をした際に最終的に, 同じファイルの異なる
    2つのインスタンスができてしまふことに注意してください.
    終了するか, 注意しながら續けます.

(2) このファイルの編輯セッションがクラッシュした.
    この場合には ":recover" か "vim -r main.c"
    を使用して變更をリカバーします(":help recover" を參照).
    既にこれを行つたのならば, スワップファイル ".main.c.swp"
    を消せばこのメッセージを囘避できます.

ファイルを開くとき、スワップファイルが既に存在するかどうかがチェックされます。既に存在してゐるなら、何かがをかしくなつてゐるのです。原因は次の 2 つの內のどちらかでせう。

  1. 別のセッションが同じファイルを編輯してゐる。上記メッセージの "プロセスID"の行に注目してください。次のやうになつてゐますね:
    プロセスID: 12559 (まだ實行中)
    

    "(まだ實行中)" といふのは、このファイルを編輯してゐるプロセスが、同じマシン上で實行されてゐることを示してゐます。この情報は Unix 以外のシステムでは表示されないかもしれません。ネットワーク越しにファイルを編輯してゐる場合も、この情報は表示されません。なぜなら、そのプロセスは他のコンピュータで實行されてゐるからです。そのやうな場合は、自分で狀況を判斷してください。

    別の Vim が同じファイルを編輯してゐる場合、そのまま編輯を續けると同じファイルの 2 つのバージョンができてしまひます。後から書き込まれたファイルがもう一方のファイルを上書きしてしまふので、變更內容が失はれることになります。このやうな場合は、そのまま Vim を終了したはうがいいでせう。

  2. Vim またはマシンがクラッシュしたのでスワップファイルが殘つてゐる。メッセージの日附を確認してください。スワップファイルの日附が開かうとしたファイルよりも新しく、メッセージに次の行が含まれてゐる場合:
    變更狀態: あり
    

    この場合、クラッシュしたセッションが存在し、リカバリすべき內容が含まれてゐる可能性があります。

    ファイルの日附がスワップファイルの日附よりも新しい場合、クラッシュした後に何らかの變更が加へられた可能性があります (おそらく、リカバリした後に、スワップファイルを消し忘れたのではないですか?)。もしくは、スワップファイルが更新されてからクラッシュするまでの閒にファイルが保存されたのかもしれません (それならラッキーです。古いスワップファイルは必要ありません)。さういふ場合は、次のやうな警告が表示されます:

    スワップファイルよりも新しいです!
    

讀めないスワップファイル

ときどき、スワップファイルの名前の下に、次の行が表示されることがあります

[讀込めません]

これには良い狀態と惡い狀態があります。

以前のセッションがファイルに變更を加へることなくクラッシュした場合は良い狀態です。その場合、ゼロバイトのスワップファイルが作成されてゐるはずです。それを削除して作業を續けてください。

スワップファイルの讀み込み權限があなたにない場合は少し惡い狀態です。ファイルを讀み込み專用で開くか、Vim を終了するかしてください。マルチユーザーシステムで、あなたが違ふ名前でログインしてゐたときに變更を加へてゐたのだとしたら、その名前でログインしなほせば "讀み込みエラー" を直せるかもしれません。あるいは、そのファイルを最後に變更した (してゐる) 人を探して話し合ふ必要があるかもしれません。

スワップファイルを保存してゐるディスクが物理的に故障してゐる場合はとても惡い狀態です。幸ひにも、そんなことはほとんど起こりません。(可能なら) まづ、ファイルを讀み込み專用で開き、變更がどの程度失はれたか確認してください。あなたがそのファイルの責任者なら、變更をやり直す覺悟を決めませう。

どうしますか?

ダイアログがサポートされてゐる場合、次の 6 つの選擇肢が表示されます:

スワップファイル ".main.c.swp" が既にあります!
讀込專用で開く([O]), とにかく編輯する((E)), 復活させる((R)),
削除する((D)), 終了する((Q)), 中止する((A)):
"O"

ファイルを讀み込み專用で開く。リカバリが必要なくて、ただファイルを表示したい場合に選擇してください。他の誰かがファイルを編輯してゐるときに、ファイルの內容を變更したいのではなく、確認だけしたい場合にも使へます。

"E"

ファイルを普通に編輯する。注意!他の Vim がそのファイルを編輯中の場合、そのファイルの 2 つのバージョンができてしまひます。さうなる前に Vim は警告を發しますが、後で殘念なことにならないやうに、最初から安全な選擇をしませう。

"R"

スワップファイルを使つてファイルを復元する。復元すべき內容がスワップファイルに含まれてゐることがわかつてゐる場合に使つてください。

"Q"

終了する。ファイル編輯を取り止めます。他の Vim が同じファイルを編輯してゐる場合に使つてください。

Vim を起動中なら、Vim が終了します。複數のファイルを開かうとしてゐた場合、Vim が終了するのは、それが最初のファイルだつた場合のみです。":edit" コマンドで開かうとしてゐた場合は、ファイルを開かずに、直前のファイルに戾ります。

"A"

停止する。「終了する」に似てゐますが、コマンドも卽座に停止します。例へば、複數のファイルを開くやうなスクリプトを實行したときに、スクリプトを卽座に停止させることができます。

"D"

スワップファイルを削除する。スワップファイルが不要なことがはつきりしてゐる場合に使つてください。例へば、スワップファイルが變更を何も含んでゐない場合や、ファイル本體の日附がスワップファイルより新しい場合に使ひます。

Unixでは、スワップファイルを生成したプロセスがまだ實行中の場合、この選擇肢は表示されません。

ダイアログが表示されない (ダイアログをサポートしてゐない Vim を使つてゐる) 場合は、手動で復元作業を實行してください。ファイルを復元するには、次のコマンドを使ひます:

:recover

スワップファイルの存在を常に檢出できるとは限りません。例へば、他のセッションが別のディレクトリにスワップファイルを保存してゐる場合や、他のマシンのファイルを編輯してゐるためにファイルのパスが違つてゐる場合などです。ですから、警告が表示されないからといつて安心しないでください。

スワップファイルの警告を表示したくない場合は、’shortmess’ オプションに "A" フラグを追加してください。しかし特別な理由がなければ設定を變更する必要はないでせう。

暗號化時のスワップファイルの扱ひについては |:recover-crypt| を參照してください。 スワップファイルへのプログラムによるアクセスについては |swapinfo()| を參照してください。

さらなる情報

|swap-file|スワップファイルの名前と作成される場所の說明。
|:preserve|スワップファイルを手動でディスクに書き込む。
|:swapname|カレントファイル用のスワップファイルの名前を表示する。
updatecountキーストロークの數。指定された數だけキーが入力されると、スワップファイルがディスクに書き込まれる。
updatetimeタイムアウト値。指定された時閒內に入力がなかつたら、スワップファイルがディスクに書き込まれる。
swapsyncスワップファイルを書き込んだときにディスクを同期するかどうか。
directoryスワップファイルが保存されるディレクトリの一覽。
maxmemテキストをスワップファイルに保存せずに扱へるメモリの上限。
maxmemtot同上。ただし、全ファイルの合計値。

Next: , Previous: , Up: 目次   [Index]