[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23. バックアップと自動セーブ

バックアップ・ファイルと自動セーブは、Emacsがクラッシュやユーザ自身のあ やまちがもたらす結果からユーザを守ろうとするのに使う二つの方法です。自動 セーブは、現在の編集セッションの初期の段階のテキストを保存します。バック アップ・ファイルは現在のセッション以前のファイルの内容を保存します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.1 バックアップ・ファイル

バックアップ・ファイル(backup file)は、編集しているファイルの古い 内容のコピーです。Emacsはバッファを、読み込んだファイル(visited file)に 最初にセーブするときにバックアップ・ファイルを作ります。普通は、バックアッ プ・ファイルには現在の編集セッションの前のファイルの内容が入っていること になります。バックアップ・ファイルの内容は、通常は一度作られたら変更され ずに残ります。

バックアップは通常、読み込んだファイルを新しい名前に変更して作ります。読 み込んだファイルをコピーしてバックアップ・ファイルを作るように指定すること も可能です。この選択は複数の名前をもつファイルに関して違いがあります。ま た、編集しているファイルが元のオーナーの所有のままか、編集しているユーザ の所有になるかにも影響します。

デフォルトでは、Emacsは編集しているファイルそれぞれに一つのバックアップ・ ファイルを作ります。あるいは、番号付のバックアップを指定することもできま す。こうすると、新しいバックアップ・ファイルはそれぞれ新しい名前になりま す。古い番号つきバックアップは、もうこれ以上いらないと思ったときに消すこ とができますし、自動的に消すこともできます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.1.1 バックアップ・ファイルの作成

Function: backup-buffer

この関数はカレント・バッファに読み込んでいるファイルのバックアップを、必 要ならば作ります。save-bufferはバッファが最初にセーブされるときに これを呼び出します。

Variable: buffer-backed-up

このバッファローカル変数は、このバッファのファイルがこのバッファのために バックアップされているかどうかを示します。非nilならバックアップ・ ファイルは書き込まれています。そうでなければファイルは次のセーブ時にバッ クアップする必要があります(バックアップがオンになっていれば)。これは常時 ローカルで、kill-local-variablesは効きません。

User Option: make-backup-files

この変数はバックアップ・ファイルを作るかどうかを決めます。これが非 nilなら、Emacsはそれぞれのファイルのバックアップをそれが最初にセー ブされるときに作ります、ただしbackup-inhibitednil(下記参 照)ならばです。

次の例は、make-backup-files変数を`RMAIL'バッファの中だけで変 更して、ほかでは変更しない方法を示しています。これをnilにすると、 Emacsは`RMAIL'ファイルのバックアップを作らなくなり、ディスク・スペー スの節約になります。(このコードは`.emacs'ファイルに入れておくといい でしょう。)

 
(add-hook 'rmail-mode-hook 
          (function (lambda ()
                      (make-local-variable 
                       'make-backup-files)
                      (setq make-backup-files nil))))
Variable: backup-enable-predicate

この変数の値は、ファイルをバックアップする必要があるかどうか判断するとき に呼び出される関数です。この関数は引数を一つ受けとり、それをファイル名と みなします。この関数がnilを返す場合はそのファイルはバックアップす る必要がありません。そうでない場合はこの節のほかの変数によってバックアッ プするかどうか、またその方法が決まります。

デフォルト値はこうです:

 
(lambda (name)
  (or (< (length name) 5)
      (not (string-equal "/tmp/"
                         (substring name 0 5)))))
Variable: backup-inhibited

この変数が非nilの場合はバックアップを行ないません。この変数には、 読み込んだファイル名をbackup-enable-predicateで試した結果が記録さ れています。この変数は、読み込んだファイルにしたがってバックアップを抑制 するほかの仕組みが一緒に使っても大丈夫です。 たとえば、VCはバージョン管理システムで管理されているファイルのバッ クアップが作られるのを防ぐためにこの変数を非nilにセットします。

この変数は、主モードを変更しても変数の値が変わらないように常時ロー カルになっています。主モードはこの変数をセットしてはいけません。代 わりにmake-backup-filesをセットすべきです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.1.2 バックアップの手段は名前の変更?それともコピー?

Emacsがバックアップ・ファイルを作る方法は二つあります:

1番目の、名前を変更する方法がデフォルトです。

変数backup-by-copyingが非nilなら2番目の方法、元のファイル をコピーしてバッファの新しい内容を上書きする方法を使います。変数 file-precious-flagが非nilのときも同様の効果(本来の意味の副 作用としてですが)があります。See section バッファを保存する

Variable: backup-by-copying

この変数が非nilなら、Emacsは常にバックアップ・ファイルをコピーによっ て作ります。

以下の二つの変数が非nilのときは、ある特殊な場合に2番目の方法が使わ れることになります。ファイルがその特殊な場合に当てはまらない場合はファイ ルの扱い方に何の影響もありません。

Variable: backup-by-copying-when-linked

この変数が非nilなら、Emacsは複数の名前をもつファイル(ハード・リンク) のバックアップをコピーによって作ります。

backup-by-copyingが非nilなら常にコピーが使われるので、この 変数はbackup-by-copyingnilのときだけ意味があります。

Variable: backup-by-copying-when-mismatch

この変数が非nilなら、Emacsは名前を変更するとオーナーやグループが 変わってしまうようなファイルのバックアップをコピーによって作ります。

名前を変更してもファイルのオーナーやグループに変化がないときは、すなわち ファイルがユーザーの所有で、グループがそこでユーザーがファイルを作成した ときのデフォルトと一致している場合、この値は何の影響も与えません。

backup-by-copyingが非nilなら常にコピーが使われるので、この 変数はbackup-by-copyingnilのときだけ意味があります。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.1.3 番号付バックアップ・ファイルの作成と削除

ファイルの名前が`foo'なら、その番号付バックアップ・バージョンの名前は `foo.~v~'になります。vはさまざまな整数で、こんな感じになり ます: `foo.~1~'`foo.~2~'`foo.~3~'、…、 `foo.~259~'など。

User Option: version-control

この変数は、単独の番号付でないバックアップ・ファイルを作るか、複数の番号付 バックアップを作るかを制御します。

nil

読み込んだファイルがすでに番号付バックアップを持っていれば番号付バックアッ プを作り、そうでなければ作りません。

never

番号付バックアップを作りません。

anything else

番号付バックアップを作ります。

番号付バックアップを使っていると、しまいにはたくさんのバックアップ・バー ジョンができてしまいます。そうなったらそれらを削除しなくてはなりません。 Emacsがこれを自動で行なうこともできますし、それらを削除するかどうかユー ザに問い合わせることもできます。

User Option: kept-new-versions

この変数の値は、新しい番号付バックアップが作られたときに取っておく最新の バージョンの数です。新しく作られたバックアップはこの数に含まれています。 デフォルト値は2です。

User Option: kept-old-versions

この変数の値は、新しい番号付バックアップが作られたときに取っておく最も古 いバージョンの数です。デフォルト値は2です。

1、2、3、5と7の番号がついたバックアップがあり、これらの変数の値が両方と も2なら、1と2の番号のバックアップを古いバージョンとして取っておき、5番と 7番を新しいバージョンとしてとっておきます。バックアップ・バージョン3は過 剰ということになります。関数find-backup-file-name(see section バックアップ・ファイルの命名)は、どのバックアップ・バージョンを削除するか決定する役を引き受け ますが、それ自身でそれらを削除することはありません。

User Option: trim-versions-without-asking

この変数が非nilなら、ファイルをセーブするときに過剰なバックアップ・ バージョンを黙って削除します。そうでなければ、それらを削除するかどうかユー ザに問い合わせます。

User Option: dired-kept-versions

この変数はDiredコマンド.(dired-clean-directory)中で最新のバックアップ・バージョンをいくつ取っておくかを指定します。これは、新しいバックアップ・ファイルを作るときにkept-new-versionsが指定している動作とお なじことです。デフォルト値は2です。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.1.4 バックアップ・ファイルの命名

この節の関数を再定義することによってバックアップ・ファイルの名前をつけるや り方をカスタマイズできるようにすることを主な目的として説明します。一つを 変更したなら、多分残りも変更する必要があるでしょう。

Function: backup-file-name-p filename

この関数は、filenameがバックアップ・ファイルの名前として適当な場合、 非nilを返します。filenameという名前のファイルが存在する必要 はありません。この関数は名前をチェックするだけです。

 
(backup-file-name-p "foo")
     ⇒ nil
(backup-file-name-p "foo~")
     ⇒ 3

この関数の標準の定義は以下のとおりです:

 
(defun backup-file-name-p (file)
  "Return non-nil if FILE is a backup file \
name (numeric or not)..."
  (string-match "~$" file))

したがって、この関数はファイル名が`~'で終っていれば非nil値を 返します。(説明文字列の最初の行を二つの行に分割するのにバックスラッシュを 使っていますが、実際には1行になります。)

この簡単な式を独立した関数にしているのは、カスタマイズするときに再定義し やすくするためです。

Function: make-backup-file-name filename

この関数は、ファイルfilenameの番号つきでないバックアップ・ファイル の名前の文字列を返します。Unixでは、ただ単にfilenameにチルダ (tilde)を後ろにつけたものになります。

この関数の標準の定義は以下のとおりです:

 
(defun make-backup-file-name (file)
  "Create the non-numeric backup file name for FILE.
…"
  (concat file "~"))

この関数を定義し直すことによって、バックアップ・ファイルの名前のつけ方を変 えることができます。以下の例では、チルダを後ろにつけるのに加えて`.' を前につけるようにmake-backup-file-nameを定義し直しています:

 
(defun make-backup-file-name (filename)
  (concat "." filename "~"))

(make-backup-file-name "backups.texi")
     ⇒ ".backups.texi~"
Function: find-backup-file-name filename

この関数は、filenameの新しいバックアップ・ファイルのファイル名を算出 します。また、既存のバックアップ・ファイルのうち削除した方がいいものを示し すこともします。find-backup-file-nameはリストを返します。そのリス トのCARが新しいバックアップ・ファイルの名前で、CDRが削除した方が いいバックアップ・ファイルのリストです。

二つの変数kept-old-versionskept-new-versionsは、取ってお くべきバックアップ・バージョンを決めます。この関数はこれらのバージョンを 取っておくために、返り値のCDRからこれらを除きます。See section 番号付バックアップ・ファイルの作成と削除

この例では、`~rms/foo.~5~'が新しいバックアップ・ファイルに使う名前で、 `~rms/foo.~3~'が"過剰"バージョン、現時点で消すべきだと思われるバー ジョン、であることを示しています。

 
(find-backup-file-name "~rms/foo")
     ⇒ ("~rms/foo.~5~" "~rms/foo.~3~")
Function: file-newest-backup filename

この関数は、filenameの最も新しいバックアップ・ファイルの名前を返しま す。そのファイルのバックアップ・ファイルがなければnilを返します。

あるファイル比較コマンドは、ファイルをその最新のバックアップと自動的に比 較するためにこの関数を使います。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.2 自動セーブ

Emacsは読み込んだファイル全てを定期的にセーブします。これを自動セー ブ(auto-saving)といいます。自動セーブはシステムがクラッシュしたときに、 ある決まった量以上の作業が失われることを防ぎます。デフォルトでは自動セー ブは300打鍵ごと、または30秒以上暇だと行なわれます。自動セーブのユーザ向 け情報は、See Auto-Save: (emacs)Auto-Save section `Auto-Saving: Protection Against Disasters' in The GNU Emacs Manual。ここでは自動セーブを実装するの に使われている関数とそれらを制御する変数について説明します。

Variable: buffer-auto-save-file-name

このバッファローカル変数は、カレント・バッファを自動セーブするのに使われ るファイルの名前です。バッファが自動セーブされないときはnilです。

 
buffer-auto-save-file-name
=> "/xcssun/users/rms/lewis/#files.texi#"
Command: auto-save-mode arg

対話的に引数なしで使われたときはこのコマンドはトグル・スイッチになり、カ レント・バッファの自動セーブがオフならオンにし、オンならオフにします。引 数argがあり、その値がt、空ではないリスト、正の整数のいずれ かのときは、このコマンドは自動セーブをオンにします。それ以外のときは自動 セーブをオフにします。

Function: auto-save-file-name-p filename

この関数はfilenameが自動セーブ・ファイルの名前になり得る文字列のとき 非nil値を返します。この関数は、ハッシュ・マーク(`#')で始まって 終る名前が自動セーブ・ファイル名になり得るという自動セーブ・ファイルの命名法 の知識に基づいて働きます。引数filenameはディレクトリ部分を含んでい てはいけません。

 
(make-auto-save-file-name)
     ⇒ "/xcssun/users/rms/lewis/#files.texi#"
(auto-save-file-name-p "#files.texi#")
     ⇒ 0
(auto-save-file-name-p "files.texi")
     ⇒ nil

この関数の標準の定義は以下のとおりです:

 
(defun auto-save-file-name-p (filename)
  "Return non-nil if FILENAME can be yielded by..."
  (string-match "^#.*#$" filename))

この関数は、自動セーブ・ファイルの命名法を変更したいときにカスタマイズ可能 にするために存在します。これを定義し直したときは、必ず関数 make-auto-save-file-nameも定義し直してください。

Function: make-auto-save-file-name

この関数はカレント・バッファの自動セーブに使うファイル名を返します。これ はファイル名の前と後ろにハッシュ・マーク(`#')をつけただけのものです。 この関数は変数auto-save-visited-file-name(下記参照)を見ませんので、 この関数を呼び出す前にチェックしなくてはなりません。

 
(make-auto-save-file-name)
     ⇒ "/xcssun/users/rms/lewis/#backup.texi#"

この関数の標準の定義は以下のとおりです:

 
(defun make-auto-save-file-name ()
  "Return file name to use for auto-saves \
of current buffer.
…"
  (if buffer-file-name
      (concat
       (file-name-directory buffer-file-name)
       "#"
       (file-name-nondirectory buffer-file-name)
       "#")
    (expand-file-name
     (concat "#%" (buffer-name) "#"))))

自動セーブ・ファイルの命名法をカスタマイズするためにこれを定義し直せるよう に、独立した関数として存在します。必ずauto-asve-file-name-pも一致 するように変更してください。

Variable: auto-save-visited-file-name

この変数が非nilなら、Emacsはバッファを読み込んだファイルに自動セー ブします。すなわち、編集しているファイルと同じファイルに自動セーブが行な われます。通常この変数はnilなので、自動セーブ・ファイルは make-auto-save-file-nameによって作られた別の名前になります。

この変数の値を変更したときは、どのバッファでも次に自動セーブ・モードがもう 一度オンになるまで効果がありません。自動セーブ・モードがすでにオンになってい るなら、auto-save-modeが再び呼ばれるまで同じファイル名に自動セー ブし続けます。

Function: recent-auto-save-p

この関数は、カレント・バッファが最後に読み込みまたはセーブされたとき以降 に自動セーブされていたらtを返します。

Function: set-buffer-auto-saved

この関数はカレント・バッファに自動セーブされたという印をつけます。このバッ ファはそのテキストが次に変更されるまで自動セーブされません。この関数は nilを返します。

User Option: auto-save-interval

この変数の値は、Emacsが自動セーブと自動セーブの間にキーボードから読み込 む文字の数を示しています。この文字数よりも多くの文字を読み込むたびに、自 動セーブがオンになっている全てのバッファで自動セーブが行なわれます。

User Option: auto-save-timeout

この変数の値は、自動セーブが起きるアイドル時間の秒数です。この長さの間ユー ザが何もしないでいるたびごとに、Emacsは必要な全てのバッファで自動セーブ を行ないます。(実際には、カレント・バッファのサイズに依存する要因のせい で、指定された時間より長くなります。)

Variable: auto-save-hook

この正規フックは自動セーブが行なわれる直前に実行されます。

User Option: auto-save-default

この変数が非nilなら、ファイルを読み込んでいるバッファはデフォルト で自動セーブがオンになります。それ以外ならそうなりません。

Command: do-auto-save &optional no-message current-only

この関数は自動セーブが必要な全てのバッファを自動セーブします。自動セーブ がオンになっていて前回の自動セーブ以降変更されているバッファをセーブしま す。

通常、いくつかのバッファを自動セーブすると自動セーブの実行中に `Auto-saving...'というメッセージがエコー領域に表示されます。ですが、 no-messageが非nilならメッセージは抑制されます。

current-onlyが非nilならカレント・バッファだけを自動セーブし ます。

Function: delete-auto-save-file-if-necessary

この関数はdelete-auto-save-filesが非nilならカレント・バッ ファの自動セーブ・ファイルを削除します。これはバッファをセーブするたびご とに呼び出されます。

Variable: delete-auto-save-files

この変数は関数delete-auto-save-file-if-necessaryで使われます。こ れが非nilなら、Emacsは本当のセーブを(読み込んだファイルへ)実行す るときに自動セーブ・ファイルを削除します。これはディスク・スペースを節約し、 あなたのディレクトリが散らからないようにします。

Function: rename-auto-save-file

この関数はカレント・バッファのセーブするファイル名が変更されていれば、自 動セーブ・ファイル名を調節します。また既存の自動セーブ・ファイルの名前も 変えます。セーブするファイル名が変更されていなければ、この関数は何もしま せん。

Variable: buffer-saved-size

このバッファローカル変数の値は、カレント・バッファの最後に読み込まれたか セーブされたか自動セーブされたときの長さです。これは、サイズの大量の減少 を検出するのに使われ、それに応じて自動セーブをオフにします。

これが-1なら、大量の削除のためにこのバッファの自動セーブが一時的に停止さ れていることを意味します。明示的にこのバッファをセーブするとこの変数に正 の値が入れられるので、自動セーブは再びオンになります。自動セーブ・モードを オフしたりオンするとこの変数の値も変更されます。

Variable: auto-save-list-file-name

この変数は(非nilなら)全ての自動セーブ・ファイルの名前を記録するファ イルを指定します。Emacsは自動セーブを行なうたびに、自動セーブがオンになっ ているバッファそれぞれにつき2行をこのファイルに書き込みます。1行目は読み 込んだファイルの名前で(なければ空です)、2行目は自動セーブ・ファイルの名前 です。

Emacsが正常に終了するときは、このファイルを削除します。Emacsがクラッシュ した場合は、下手をすると失われた作業を含むかもしれない自動セーブ・ファイル 全てをそのファイルで見つけることができるでしょう。recover-session コマンドはこれらのファイルを使います。

このファイルのデフォルトの名前はあなたのホーム・ディレクトリにあり `.saves-'で始まります。EmacsのプロセスIDとホスト名も含んでいま す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.3 復帰

ファイルを広範囲に渡って変更してから気が変わった場合、 revert-bufferコマンドでファイルの直前のバージョンを読み込むことに よりその変更を破棄できます。See (emacs)Reverting section `Reverting a Buffer' in The GNU Emacs Manual

Command: revert-buffer &optional check-auto-save noconfirm

このコマンドはバッファのテキストをディスク上の読み込んだファイルのテキス トで置き換えます。この動作はファイルを読み込んだまたはセーブした以降の全 ての変更を取り消します。

引数check-auto-saveが非nilで、最新の自動セーブ・ファイルが読 み込んだファイルよりも新しいなら、revert-bufferはユーザに代わりに それを使うかどうか問い合わせます。そうでなければ常に読み込んだファイル (visited file)自身 のテキストが使われます。対話的に使う場合、数値前置引数があれば check-auto-saveがセットされます。

通常revert-bufferはバッファを変更する前に確認を求めますが、引数 noconfirmが非nilなら確認を求めません。

復帰するときにはそのバッファ中のマーカの位置を、 insert-file-contentsの置換機能を使って保存しようとします。復帰す る前にバッファの内容とファイルの内容が同一なら、全てのマーカが保存され ます。同一でない場合はバッファを変更して、次にバッファの先頭と末尾の変更 されていないテキスト(もしあれば)の中のマーカを保存します。保存された追 加のマーカはどれも信用できません。

これらの変数、ほとんどがバッファローカル変数です、を設定することによって revert-bufferの動作をカスタマイズできます。

Variable: revert-buffer-function

この変数の値はこのバッファを復帰するのに使う関数です。非nilならこ れは、復帰の作業を行なうために関数として引数なしで呼び出されます。値が nilなら、復帰は通常のやり方で行なわれます。

Diredモードのような編集されるテキストがファイルの内容ではないがある別の やり方で再生できるモードでは、この変数に内容を再生する関数をバッファロー カルな値としてセットします。

Variable: revert-buffer-insert-file-contents-function

この変数の値はもし非nilなら、このバッファを復帰するときに新しい内 容を挿入するのに使う関数です。この関数は二つの引数を受けとります。1番目は 使うファイル名で、2番目はユーザが自動セーブ・ファイルを読み込むことを求め たならtになります。

Variable: before-revert-hook

この正規フックは変更された内容が実際に挿入される前に revert-bufferによって実行されます。ただし revert-buffer-functionnilのときだけです。

Font Lockモードはバッファがもうフォント修飾(fontify)されないことを記録す るためにこのフックを使います。

Variable: after-revert-hook

この正規フックは変更された内容が実際に挿入されたあとに revert-bufferによって実行されます。ただし revert-buffer-functionnilのときだけです。

Font Lockモードは更新されたバッファの内容のフォントを再算出するためにこ のフックを使います。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Yasutaka SHINDOH on September, 29 2006 using texi2html 1.76.