[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

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

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


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

25.1 バックアップファイル

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

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

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


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

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

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に設定するべきである.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

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

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

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

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

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以外の場合にコピーを用いるからである.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

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

ファイル名が‘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 section バックアップファイルの命名方法)は, どの番号のバックアップを削除すべきかを決定する責任があるが, それ自身はそれらを削除しない.

User Option: delete-old-versions

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

User Option: dired-kept-versions

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


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

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

本節の関数は, それらを再定義することでバックアップファイルの命名方法を カスタマイズできるため, ここで述べることにします. どれか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 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を返す.

ファイルを比較するコマンドのなかには, 最新のバックアップファイルと自動的に比較できるように この関数を使うものがある.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

25.2 自動保存

Emacsは編集中のすべてのファイルを定期的に保存します. これを自動保存(auto-savign)と呼びます. 自動保存により, システムがクラッシュしても, 一定量以上の作業を失わないようにします. デフォルトでは, 300打鍵ごと, あるいは, 30秒間なにもしないと自動保存します. ユーザー向けの自動保存に関する情報については, See (不慮の事故に対する備え)Auto Save section ‘自動保存’ in emacs-ja, 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とホスト名も含む.



[ << ] [ >> ]           [冒頭] [目次] [見出し] [ ? ]

この文書は新堂 安孝によって2009年9月22日texi2html 1.82を用いて生成されました。