[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

25. バックアップと自動保存

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Backups%20and%20Auto-Saving"
"elisp/バックアップと自動保存"へのコメント(無し)

バックアップファイルと自動保存ファイルは、 クラッシュやユーザー自身の誤りから Emacsがユーザーを保護するための2つの方式です。 自動保存により、現在の編集セッションにおいて、 まえの時点でのテキストを確保します。 バックアップファイルにより、現在のセッション以前の ファイル内容を確保します。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

25.1 バックアップファイル

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Backup%20Files"
"elisp/バックアップファイル"へのコメント(無し)

バックアップファイル(backup file)とは、 読者が編集中のファイルの古い内容のコピーです。 バッファを訪問しているファイルに初めて保存するときに、 Emacsはバックアップファイルを作成します。 通常これは、バックアップファイルは 現在の編集セッションよりまえのファイルの内容を保持することを意味します。 バックアップファイルの内容は、通常、それが作られると変更されません。

訪問したファイルを新たな名前に改名することで 通常バックアップは作られます。 訪問したファイルをコピーしてバックアップファイルを作るように 指示することもできます。 どちらを選ぶかによって、複数の名前を持つファイルでは違いがでます。 また、編集したファイルの所有者が元所有者と同じであるか、 それとも編集したユーザーが所有者になるかにも影響します。

デフォルトでは、Emacsは各編集ファイルに1つのバックアップファイルを作ります。 番号付きのバックアップファイルを作るように指示することもでき、 そうすると、新たなバックアップファイルごとに新たな名前が付きます。 古い番号付きバックアップファイルは必要なくなれば削除できますし、 Emacsがそれらを自動的に削除することも可能です。

25.1.1 バックアップファイルの作成    How Emacs makes backup files, and when.
25.1.2 改名によるバックアップかコピーによるバックアップか    Two alternatives: renaming the old file or copying it.
25.1.3 番号付きバックアップファイルの作成と削除    Keeping multiple backups for each source file.
25.1.4 バックアップファイルの命名方法    How backup file names are computed; customization.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

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

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Making%20Backups"
"elisp/バックアップファイルの作成"へのコメント(無し)

Function: backup-buffer
この関数は、必要ならば、カレントバッファで訪問しているファイルの バックアップを作成する。 バッファを初めて保存するまえにsave-bufferがこの関数を呼び出す。

Variable: buffer-backed-up
このバッファローカルな変数は、 当該バッファのもとで当該バッファのファイルの バックアップを作成済みかどうかを表す。 nil以外であれば、バックアップファイルは作成済みであることを表す。 さもなければ、(バックアップがオンになっていれば)つぎに保存するときに ファイルのバックアップを作成するべきであることを表す。 これは恒久的にバッファローカルであり、 kill-local-variablesによって変更されない。

User Option: make-backup-files
この変数は、バックアップファイルを作成するかどうかを決定する。 nil以外であると、backup-inhibitednilならば(下記参照) Emacsは初めて保存するときに各ファイルのバックアップを作成する。

つぎの例は、rmailのバッファでのみ変数make-backup-filesを 変更する方法である。 この変数をnilにすると、 Emacsはそれらのファイルのバックアップを作成しなくなり、 ディスクスペースの節約になる。 (このコードを読者のファイル`.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 ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

25.1.2 改名によるバックアップかコピーによるバックアップか

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Rename%20or%20Copy"
"elisp/改名によるバックアップかコピーによるバックアップか"へのコメント(無し)

Emacsは2つの方法でバックアップファイルを作れます。

最初の改名による方式がデフォルトです。

変数backup-by-copyingnil以外であると、 2番目の方式、つまり、元ファイルをコピーしてから バッファの新たな内容で上書きすることを指示します。 変数file-precious-flagnil以外であっても (その主目的の副作用として)同じ効果があります。 See 節 24.2 バッファの保存

Variable: backup-by-copying
この変数がnil以外であると、 Emacsはつねにコピーしてバックアップファイルを作る。

つぎの2つの変数がnil以外であると、 特定の場面では2番目の方式を使うことになります。 これらの変数は、特別な場面に該当しないファイルの扱い方には影響しません。

Variable: backup-by-copying-when-linked
この変数がnil以外の場合、Emacsは、 複数の名前(ハードリンク)を持つファイルはコピーしてバックアップする。

この変数はbackup-by-copyingnil以外の場合にのみ意味を持つ。 というのは、その変数がnil以外の場合にコピーを用いるからである。

Variable: backup-by-copying-when-mismatch
この変数がnil以外の場合、Emacsは、 改名するとファイルの所有者やグループを変更してしまう場合に コピーしてバックアップする。

改名してもファイルの所有者やグループを変更しなければ、 この値は効果を持たない。 つまり、ユーザーが所有しているファイルであり、 そのグループが当該ユーザーが新規作成するファイルのデフォルトに一致する 場合である。

この変数はbackup-by-copyingnil以外の場合にのみ意味を持つ。 というのは、その変数がnil以外の場合にコピーを用いるからである。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

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

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Numbered%20Backups"
"elisp/番号付きバックアップファイルの作成と削除"へのコメント(無し)

ファイル名が`foo'であると、 その番号付きバックアップファイルの名前はvを整数として `foo.~v~'となります。 つまり、`foo.~1~'、`foo.~2~'、`foo.~3~'、...、 `foo.~259~'といった具合です。

User Option: version-control
この変数は、番号なしの1つのバックアップファイルを作るのか 複数の番号付きバックアップファイルを作るのかを制御する。

nil
訪問したファイルにすでに番号付きバックアップファイルがあれば 番号付きバックアップを作る。 さもなければ作らない。

never
番号付きバックアップは作らない。

その他
番号付きバックアップを作る。

番号付きバックアップファイルを使うと、 最終的には非常に多くのバックアップファイルができてしまい、 それらは削除しなければなりません。 Emacsはそれらを自動的に削除したり、 削除するかどうかユーザーに問い合わせることができます。

User Option: kept-new-versions
この変数の値は、新たに番号付きバックアップを作成したときに 保存すべき最新のバックアップの個数である。 新たに作成したバックアップも数える。 デフォルト値は2である。

User Option: kept-old-versions
この変数の値は、新たに番号付きバックアップを作成したときに 保存すべき最古のバックアップの個数である。 デフォルト値は2である。

1、2、3、5、7と番号が付いたバックアップがあり、 これらのどちらの変数の値も2であるとすると、 最古のものとして1と2の番号が付いたバックアップを保存し、 最新のものとして5と7の番号が付いたバックアップを保存する。 関数find-backup-file-name(see 節 25.1.4 バックアップファイルの命名方法)は、 どの番号のバックアップを削除すべきかを決定する責任があるが、 それ自身はそれらを削除しない。

User Option: delete-old-versions
この変数がnil以外であると、 ファイルを保存すると黙って範囲外のバックアップを削除する。 さもなければ、それを削除するかどうかユーザーに問い合わせる。

User Option: dired-kept-versions
この変数は、diredのコマンド.dired-clean-directory)で 最新のバックアップを何個保存するかを指定する。 これは、新たなバックアップファイルの作成を指示したときに kept-new-versionsが指定することと同じである。 デフォルト値は2である。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

25.1.4 バックアップファイルの命名方法

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Backup%20Names"
"elisp/バックアップファイルの命名方法"へのコメント(無し)

本節の関数は、それらを再定義することでバックアップファイルの命名方法を カスタマイズできるため、ここで述べることにします。 どれか1つを変更すると、残りのものも変更する必要があるでしょう。

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以外の値を返す。 (説明文字列を2行に分けるためにバックスラッシュを使っているが、 文字列としては1行になる。)

カスタマイズのために再定義しやすいように、 この単純な式を独立した関数にしてある。

Function: make-backup-file-name filename
この関数は、ファイルfilenameに対する 番号なしバックアップファイルに使う名前を表す文字列を返す。 UNIXでは、単にfilenameの末尾にティルダを付加したものである。

ほとんどのオペレーティングシステムでは、 この関数の標準定義はつぎのとおりである。

 
(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)
  (expand-file-name
    (concat "." (file-name-nondirectory filename) "~")
    (file-name-directory filename)))

(make-backup-file-name "backups.texi")
     => ".backups.texi~"

diredコマンドを含めてEmacsには、 バックアップファイルは`~'で終ると仮定しているものがある。 この慣習に従わない場合、重大な問題には至らないであろうが、 それらのコマンドがあまり望ましくない結果をもたらすかもしれない。

Function: find-backup-file-name filename
この関数は、filenameに対する新たなバックアップファイルの ファイル名を計算する。 さらに、削除すべき既存のバックアップファイルも計算する。 find-backup-file-nameは、 CARに新たなバックアップファイルの名前、 CDRに削除すべきバックアップファイルのリストを持つリストを返す。

2つの変数、kept-old-versionskept-new-versionsは、 どのバックアップを保存すべきかを決定する。 この関数は、値のCDRではそれらのバックアップファイルは 除外してある。 see 節 25.1.3 番号付きバックアップファイルの作成と削除

つぎの例の値では、`~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 ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

25.2 自動保存

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Auto-Saving"
"elisp/自動保存"へのコメント(無し)

Emacsは編集中のすべてのファイルを定期的に保存します。 これを自動保存(auto-savign)と呼びます。 自動保存により、システムがクラッシュしても、 一定量以上の作業を失わないようにします。 デフォルトでは、300打鍵ごと、あるいは、30秒間なにもしないと自動保存します。 ユーザー向けの自動保存に関する情報については、 See 節 `自動保存、不慮の事故に対する備え' in

GNU Emacs マニュアル
。 ここでは、自動保存を実装するための関数と それらを制御する変数について述べます。

Variable: buffer-auto-save-file-name
このバッファローカルな変数は、カレントバッファの自動保存に 用いるファイル名である。 当該バッファを自動保存しない場合にはnilである。

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

コマンド: auto-save-mode arg
引数なしに対話的に呼ばれると、 このコマンドは自動保存機能をトグルする。 つまり、カレントバッファの自動保存がオンであるとオフにし、 オフならばオンにする。 引数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) "#"))))

自動保存ファイルの名前の慣習をカスタマイズするために 関数を再定義できるように1つの関数にしてある。 関数auto-save-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以外であると、 ファイルを訪問しているバッファはデフォルトで自動保存をオンにする。 さもなければ、そうしない。

コマンド: do-auto-save &optional no-message current-only
この関数は、自動保存する必要があるすべてのバッファを自動保存する。 自動保存がオンになっていて、かつ、以前の自動保存からあとで 変更されているすべてのバッファを自動保存する。

通常、バッファを自動保存すると、 自動保存を実行中にはエコー領域にメッセージ`Auto-saving...'が表示される。 しかし、no-messagenil以外であると、 メッセージを表示しない。

current-onlynil以外であると、 カレントバッファのみを自動保存する。

Function: delete-auto-save-file-if-necessary
この関数は、delete-auto-save-filesnil以外であると、 カレントバッファの自動保存ファイルを削除する。 バッファを保存するたびに呼び出される。

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 ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

25.3 復元

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Reverting"
"elisp/復元"へのコメント(無し)

ファイルを大幅に変更したあとで、そのような変更をやめたい場合には、 コマンドrevert-bufferでファイルのまえの版を読み込めます。 See 節 `バッファを復元する' in

GNU Emacs マニュアル

コマンド: revert-buffer &optional ignore-auto noconfirm
このコマンドは、バッファのテキストを ディスク上の訪問しているファイルのテキストで置き換える。 これにより、ファイルを訪問したり保存してから行った変更をすべて取り消せる。

デフォルトでは、最後の自動保存ファイルが 訪問しているファイルよりも新しい場合には、 revert-bufferは自動保存ファイルを使うかどうか ユーザーに問い合わせる。 しかし、引数ignore-autonil以外であると、 訪問したファイルのみを使う。 対話的に呼ばれた場合、数値前置引数を指定しない限り、 ignore-autotである。 したがって、対話的な場合のデフォルトでは、自動保存ファイルを検査する。

通常、バッファを変更するまえにrevert-bufferは確認してくる。 しかし、引数noconfirmnil以外であると、 revert-bufferは確認しない。

復元作業では、 insert-file-contentsの置換機能を用いて バッファ内のマーカ位置を保存するように努める。 復元操作のまえにバッファの内容とファイルの内容が同一であれば、 すべてのマークが保存される。 同一でなければ、復元によりバッファが変更され、 バッファの先頭と末尾の(あれば)未変更なテキスト内のマーカを保存する。 それ以外のマーカを保存しても問題を引き起こすだけであろう。

以下の変数を典型的にはバッファローカルな変数として設定することで revert-bufferの動作をカスタマイズできます。

Variable: revert-without-query
この変数は、問い合わせずに復元すべきファイルのリストを保持する。 値は、正規表現のリストである。 ファイル名がこれらの正規表現の1つに一致すると、 ディスク上のファイルが変更されていて当該バッファが未変更であれば、 revert-bufferはユーザーに確認せずに当該ファイルを復元する。

Variable: revert-buffer-function
この変数の値は、このバッファを復元するために使う関数である。 nil以外であれば、復元を行う引数なしの関数として呼び出される。 値がnilであると、復元操作は通常の方法で行われる。

diredモードなどのモードでは、 編集中のテキストはファイルの内容ではなく 別の方法で再生成されたものなので、 この変数のバッファローカルな値には内容を再生成する関数を指定すること。

Variable: revert-buffer-insert-file-contents-function
この変数の値がnil以外であると、 このバッファを復元するときに更新内容を挿入するために使われる関数である。 当該関数は2つの引数をとる。 第1引数は、使用するファイル名である。 第2引数は、ユーザーが自動保存ファイルを 読むように指示しているとtである。

Variable: before-revert-hook
このノーマルフックは、revert-buffer-functionnilである 場合にのみ、変更内容を実際に挿入するまえにrevert-bufferが実行する。

フォントロック(font-lock)モードはこのフックを使って、 バッファ内容をこれ以上強調表示しないことを記録する。

Variable: after-revert-hook
このノーマルフックは、revert-buffer-functionnilである 場合にのみ、変更内容を実際に挿入したあとにrevert-bufferが実行する。

フォントロック(font-lock)モードはこのフックを使って、 更新されたバッファ内容に対するフォントを再計算する。


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]