vim-jp / vimdoc-ja / recover

recover - Vimドキュメント

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


                  VIMリファレンスマニュアル    by Bram Moolenaar


クラッシュ後のリカバリー                                crash-recovery

あなたが明日の朝までに終わらせなければならない文書のタイピングに数時間を費や
していたとき、悲劇があなたを襲う。コンピュータがクラッシュした。

                        慌てないで!

あなたはVimがファイルの内容を蓄えていたファイルから、ほとんどの変更を回復でき
る。たいていの場合、あなたの仕事は1コマンドで回復できる。
        vim -r filename

1. スワップファイル     swap-file
2. リカバリー           recovery

==============================================================================
1. スワップファイル                                     swap-file

Vimは変更した箇所をスワップファイルに蓄える。編集を開始したオリジナルのファイ
ルとスワップファイルから、あなたのした作業は回復することができる。

現在使用しているスワップファイルの名前は、次のコマンドで確認できる:

        :sw[apname]                                     :sw :swapname

または、swapname() を使うことができる。他のバッファのスワップファイル名も確
認できる。

スワップファイルの名前は、普通は編集中のファイルと同じで、拡張子が ".swp" のも
のになる。
- UNIXでは、スワップファイルは編集中のファイルと同じディレクトリ内に作られ、
  '.' が名前の前につけられる。これはディレクトリ表示からスワップファイルを隠す
  ためである。
- MS-Windows マシンで、'shortname' オプションがオンのときは、オリジナルファイ
  ル名の '.' は '_' に置き換えられる。
- このファイルがすでに存在すると(たとえば、クラッシュから復帰した場合)、注意が
  表示され、違った拡張子、".swo"、".swn"、などが用いられる。
- 存在しているファイルは決して上書きされない。
- スワップファイルはVimが編集を終えるとすぐに削除される。

技術情報:  '.' から '_' への置換はMS-DOS互換のファイルシステム(例、crossdos、
           multidos)での問題を避けるためである。もしVimがMS-DOSライクなファイ
           ルシステムを探知すると、'shortname' オプションと同じ効果を持つフラ
           グが設定される。このフラグは違うファイルの編集を始めたときにリセッ
           トされる。
                                                        E326
           もし ".swp" ファイルがすでに存在すると、同名のファイルが存在しなく
           なるか、".saa" となるまで最後の文字をひとつ前の文字に戻す。".saa"
           まで存在するときは、スワップファイルは作られない。

'directory' オプションを設定することによって、スワップファイルを、編集している
ファイルとは別の場所に置くこともできる。
利点:
- ディレクトリが ".swp" ファイルで汚染されることがない。
'directory' が別パーティションにある場合、ファイルのあるファイルシステムが
  (クラッシュで)損傷を受けるリスクが減る。
欠点:
- 別ディレクトリの同一名のファイルで名前の衝突を生じうる(Vimはパス名の比較でそ
  れを避けようとするが)。
  これによって偽の注意メッセージが表示される。
- あなたがホームディレクトリで作業をしていて、他の誰かが同じファイルを編集しよ
  うとしたとき、そのユーザーはあなたのスワップファイルに気づかないし、注意の
  メッセージも表示されない。
Amigaでは、回復可能なramディスクを使えるが、それが100%働くという保証はない。
スワップファイルを通常のramディスク(AmigaではRAM:など)に置いたり、リブートに
よって消されてしまう場所(Unixの/tmpなど)に置くことは無意味であり、クラッシュに
よってスワップファイルは失われてしまう。

スワップファイルを固定ディスクに置きたいときは、あなたの.vimrcファイルに次に示
す様なコマンドを入れる:
        :set dir=dh2:tmp        (Amigaの場合)
        :set dir=~/tmp          (Unixの場合)
        :set dir=c:\\tmp        (Win32の場合)
これらの設定はフロッピー上で編集作業をしているときには負担となる。もちろん、こ
の様な設定で作業をするならば、"tmp" ディレクトリを作らねばならない。

読取専用属性のファイルに対しては、スワップファイルは使用されない。ファイルが大
きくなければ、'maxmem' や 'maxmemtot' で与えられた量より多くのメモリを使用する
ことはない。読取専用属性のファイルについて何らかの変更が加えられたとき、スワッ
プファイルは無条件に作成される。

スワップファイルの作成を避けるために 'swapfile' オプションをリセットできる。そ
して新しいバッファでスワップファイルを作成しないようにするのに :noswapfile
修飾子を使うことができる。

:nos[wapfile]   {command}                       :nos :noswapfile
                {command} を実行する。それが新しいバッファを読み込むコマンドを
                含んでいる場合は、スワップファイルは作成されずに読み込まれ、
                'swapfile' オプションはリセットされる。バッファが既にスワップ
                ファイルを持っていた場合は、スワップファイルは削除されず、
                'swapfile' はリセットされない。


既存のスワップファイルを削除する

ユーザーマニュアルの11.3を参照すること。


スワップファイルの更新

スワップファイルは200文字を打ち込むか、4秒間何もしなかったときに更新される。こ
れはバッファが変更されたときのみ行われ、動き回っているだけでは行われない。なぜ
常に更新が行われないかといえば、それは通常の作業が大幅に遅くなるからである。
200文字の設定は 'updatecount' で、時間の設定は 'updatetime' で変更できる。時間
はミリ秒単位で与えられる。スワップファイルに書き込んだ後で、Vimはファイルとディ
スクの同期を取る。これにはしばらく時間が掛かる(ビジーなUnixシステムにおいては
特に時間がかかる)。もしこれを行って欲しくなければ、'swapsync' オプションに空文
字列を設定すればよい。作業の成果を失う危険性は増すが。いくつかの非Unixシステム
(MS-Windows、Amigaなど)においては、スワップファイルはまったく書き込まれなくな
るだろう。

スワップファイルへの書き込みを望まないなら、'updatecount' を0に設定することで
行われなくなる。Vimを "-n" オプションで起動することで、同じ結果が得られる。書
き込みは 'updatecount' を非0にすることでまた行われるようになる。これを行ったと
きはスワップファイルが全てのバッファに対して作られる。しかし、'updatecount' を
0に設定したときは、存在しているスワップファイルは消されることはなく、次に開か
れたファイルから有効になる。

行った編集がスワップファイルに書きこまれたかを確認するには、次のコマンドを使用
する:

                                        :pre :preserve E313 E314
:pre[serve]             現在のバッファの全てのテキストをそのスワップファイルに
                        書き込む。回復のためにオリジナルが必要とされることは
                        なくなる。このコマンドはカレントバッファにあるフラグを
                        設定する。また、'cpoptions' にフラグ '&' が入っている
                        ならば、Vim が終了するとき、このバッファのスワップファ
                        イルは削除されず、バッファは読み込まれた状態のままにな
                        る。cpo-&

Vimのスワップファイルは最初の6文字で認識される: "b0VIM "。
この後に "3.0" などのバージョン番号が続く。


リンクとシンボリックリンク

Unix では同一のファイルに2つの名前をつけることができる。それはハードリンクまた
はシンボリックリンク(symlink)を使って行う。

ハードリンクの場合、Vim はそのファイルにつけられた他の名前を知ることができな
い。そのため、スワップファイルの名前は、そのファイルを開くときに使った名前に基
づいてつけられる。
そのファイルが別の名前でも開かれているかどうかのチェックは行わない。他のスワッ
プファイルを検出することはできないからである(ハードディスク全てを検索するとい
う方法は除く。それはとても遅くなるから)。

シンボリックリンクの場合、Vim はそのリンクが指す実際のファイルを見つけられる。
スワップファイルの名前は実際の名前に基づいてつけられる。よって、ユーザーがどん
な名前でそのファイルを開いたかは関係なく、スワップファイル名は同一になる。しか
し次のような例外がある:
- 実際のファイルのディレクトリが書き込み不可ならば、スワップファイルは別の場所
  に置かれる。
- シンボリックリンクがなんらかの形でループになっているとき、エラーメッセージ
  E773 が表示され、変更されていないファイル名が使われる。普通にファイルを保
  存することはできない。

==============================================================================
2. リカバリー                                   recovery E308 E311

基本的なファイルの回復方法はユーザーマニュアルのusr_11.txtを参照すること。

ファイルを回復するためのもうひとつの方法は、Vimを起動して ":recover" コマンド
を使うことである。
これはVimを起動したときに "ATTENTION: Found a swap file ..." というメッセージ
を受け取ったときには便利である。その場合には ":recover" というコマンドひとつで
全てが済む。
recoverコマンドにはファイル名かスワップファイル名を渡すことができる:

                                        :rec :recover E305 E306 E307
:rec[over] [file]       スワップファイルから[file]を回復するよう試みる。もし
                        [file]が与えられていない場合は、現在のバッファの名前が
                        用いられる。現在のバッファの内容は失われる。このコマン
                        ドはバッファが修正を加えられている場合に失敗する。

:rec[over]! [file]      ":recover" と同じだが、現在のバッファに対するどんな変
                        更も失われる。

                                                        E312 E309 E310
Vimはスワップファイルが何らかの理由で壊れているときに、いくつかの対処を提供す
る。Vimが見つかったものに疑問を持った場合、エラーメッセージが与えられ、"???"
というテキストが一緒に行に挿入される。回復中にエラーメッセージを受け取ったら、
"???" を検索することによってどこに問題があったかを知ることができる。必要なテキ
ストを得るためには、カットやペーストを必要とするかもしれない。

ほとんどは "???LINES MISSING" のようなものである。これはVimがそのテキストをオ
リジナルのファイルから読み込めないことを示す。これはシステムがクラッシュした時
にファイルが正しくディスクに書き込まれなかったときに起こる。

オリジナルを上書きしたり、スワップファイルを削除する前に、回復が成功したことを
確認すること。回復されたファイルをどこか別の場所に保存して、'diff' によって変
更を加えた箇所が、ちゃんと回復されたファイルに入っているか調べてみるとよい。ま
たは :DiffOrig を使う。

回復が成功したと確信したら、スワップファイルを削除する。そうしないと、".swp"
が存在するというメッセージが表示されつづけることになる。



暗号化とスワップファイル                                :recover-crypt

テキストファイルが暗号化されているときはスワップファイルも暗号化される。これは
リカバリーを多少複雑にする。スワップファイルからリカバリーするときにそれが暗号
化されていた場合、一つか二つの秘密鍵を入力する必要があるだろう。

テキストファイルが存在しない場合は入力する必要のある秘密鍵はスワップファイル用
の一つだけである。

テキストファイルが存在する場合、そのファイルはスワップファイルとは別の方法で復
号する必要があるかもしれない。秘密鍵を二つ入力する必要がある:

        Need encryption key for "/tmp/tt"
        Enter encryption key: ******
        "/tmp/tt" [crypted] 23200L, 522129C
        Using swap file "/tmp/.tt.swp"
        Original file "/tmp/tt"
        Swap file is encrypted: "/tmp/.tt.swp"
        If you entered a new crypt key but did not write the text file,
        enter the new crypt key.
        If you wrote the text file after changing the crypt key press enter
        to use the same key for text file and swap file
        Enter encryption key: 

二つの状況が考えられる:

1. 暗号化キーが変更されなかったか、キーが変更された後でファイルが保存された場
   合。秘密鍵を二回入力する必要がある。二回目に入力するときは単にエンターを押
   すこと。そうするとテキストファイルとスワップファイルの両方に同じキーが使用
   される。
2. 新しい暗号化キーを入力したが、ファイルは保存されなかった場合。スワップファ
   イルには新しいキーが使用されているが、テキストファイルは古いキーで暗号化さ
   れたままになっている。二回目にキーを入力するときに新しい方のキーを入力する
   こと。

Note: リカバリー実行後にはスワップファイルのキーがテキストファイルに使用され
る。したがって、ファイルを書き込んだ後は新しいキーを使用する必要がある。


 vim:tw=78:ts=8:noet:ft=help:norl:
関連キーワード:  スワップ, usr, Vim, recover, file, バッファ, 回復, 名前, 編集, 設定