vim-jp / vimdoc-ja / usr_11

usr_11 - Vimドキュメント

メインヘルプファイルに戻る
usr_11.txt    For Vim バージョン 8.2.  Last change: 2020 Oct 25

                     VIM USER MANUAL - by Bram Moolenaar

                             クラッシュからの復帰


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

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

次章: usr_12.txt  便利な小技
前章: usr_10.txt  大規模な編集
目次: usr_toc.txt

==============================================================================
11.1  リカバリの基本

ほとんどの場合、編集していたファイルの名前さえ覚えていれば (そしてハードディス
クが正しく動いていれば) ファイルのリカバリはとても簡単です。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 ""

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

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

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

        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:
              -- なし --

リカバリを実行したとき、スワップファイルが複数見つかった場合は、スワップファイ
ルの一覧が表示されるので、使いたいスワップファイルを番号で選択してください。日
付を見て慎重に選択してください。
どれを指定したらよいかわからない場合は、一つずつ試して中身を確認してください。


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

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

例:
        vim -r .help.txt.swo

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

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

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

==============================================================================
11.3  クラッシュした?                                ATTENTION E325

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"
            を消せばこのメッセージを回避できます.

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

1. 別のセッションが同じファイルを編集している。上記メッセージの "プロセスID"
   の行に注目してください。次のようになっていますね:

                プロセスID: 12559 (まだ実行中)

   "(まだ実行中)" というのは、このファイルを編集しているプロセスが、同じマシン
   上で実行されていることを示しています。この情報は Unix 以外のシステムでは表
   示されないかもしれません。ネットワーク越しにファイルを編集している場合も、
   この情報は表示されません。なぜなら、そのプロセスは他のコンピュータで実行さ
   れているからです。そのような場合は、自分で状況を判断してください。
   別の Vim が同じファイルを編集している場合、そのまま編集を続けると同じファイ
   ルの二つのバージョンができてしまいます。後から書き込まれたファイルがもう一
   方のファイルを上書きしてしまうので、変更内容が失われることになります。この
   ような場合は、そのまま Vim を終了したほうがいいでしょう。

2. Vim またはマシンがクラッシュしたのでスワップファイルが残っている。メッセー
   ジの日付を確認してください。スワップファイルの日付が開こうとしたファイルよ
   りも新しく、メッセージに次の行が含まれている場合:

                  変更状態: あり

   この場合、クラッシュしたセッションが存在し、リカバリすべき内容が含まれてい
   る可能性があります。
   ファイルの日付がスワップファイルの日付よりも新しい場合、クラッシュした後に
   何らかの変更が加えられた可能性があります (おそらく、リカバリした後に、スワッ
   プファイルを消し忘れたのではないですか?)。もしくは、スワップファイルが更新
   されてからクラッシュするまでの間にファイルが保存されたのかもしれません (そ
   れならラッキーです。古いスワップファイルは必要ありません)。そういう場合は、
   次のような警告が表示されます:

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


NOTE 以下の状況では、Vimはスワップファイルが有用ではないことを知っているので、
自動的にそれを削除するでしょう:
- ファイルが有効なスワップファイルである (マジックナンバーが正しい)。
- ファイル変更済みのフラグが立っていない。
- プロセスが実行中でない。

FileChangedShell 自動コマンドを使うと、この状況にプログラム的に対処すること
ができます。


読めないスワップファイル
------------------------

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

        [読込めません]

これには良い状態と悪い状態があります。

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

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

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


どうしますか?                                  swap-exists-choices
--------------

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

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

O  ファイルを読み込み専用で開く。リカバリが必要なくて、ただファイルを表示した
   い場合に選択してください。他の誰かがファイルを編集しているときに、ファイル
   の内容を変更したいのではなく、確認だけしたい場合にも使えます。

E  ファイルを普通に編集する。注意!他の Vim がそのファイルを編集中の場合、その
   ファイルの二つのバージョンができてしまいます。そうなる前に Vim は警告を発し
   ますが、転ばぬ先の杖です。

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

Q  終了する。ファイル編集を取り止めます。他の Vim が同じファイルを編集している
   場合に使ってください。
   Vim を起動中なら、Vim が終了します。複数のファイルを開こうとしていた場合、
   Vim が終了するのは、それが最初のファイルだった場合のみです。":edit" コマン
   ドで開こうとしていた場合は、ファイルを開かずに、直前のファイルに戻ります。

A  停止する。「終了する」に似ていますが、コマンドも即座に停止します。例えば、
   複数のファイルを開くようなスクリプトを実行したときに、スクリプトを即座に停
   止させることができます。

D  スワップファイルを削除する。スワップファイルが不要なことがはっきりしている
   場合に使ってください。例えば、スワップファイルが変更を何も含んでいない場合
   や、ファイル本体の日付がスワップファイルより新しい場合に使います。
   Unixでは、スワップファイルを生成したプロセスがまだ実行中の場合、この選択肢
   は表示されません。

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

        :recover


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

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

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

==============================================================================
11.4  さらなる情報

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

==============================================================================

次章: usr_12.txt  便利な小技

Copyright: see manual-copyright  vim:tw=78:ts=8:noet:ft=help:norl:
関連キーワード:  スワップ, usr, Vim, 変更, 編集, 表示, リカバリ, 保存, 名前, ディレクトリ