[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バックアップファイルと自動保存ファイルは、 クラッシュやユーザー自身の誤りから Emacsがユーザーを保護するための2つの方式です。 自動保存により、現在の編集セッションにおいて、 まえの時点でのテキストを確保します。 バックアップファイルにより、現在のセッション以前の ファイル内容を確保します。
25.1 バックアップファイル | How backup files are made; how their names are chosen. | |
25.2 自動保存 | How auto-save files are made; how their names are chosen. | |
25.3 復元 | revert-buffer , and how to customize what it does. |
バックアップファイル(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. |
save-buffer
がこの関数を呼び出す。
nil
以外であれば、バックアップファイルは作成済みであることを表す。
さもなければ、(バックアップがオンになっていれば)つぎに保存するときに
ファイルのバックアップを作成するべきであることを表す。
これは恒久的にバッファローカルであり、
kill-local-variables
によって変更されない。
nil
以外であると、backup-inhibited
がnil
ならば(下記参照)
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)))) |
nil
を返すと、当該ファイルのバックアップは禁止である。
さもなければ、本節の他の変数が、
バックアップするかどうかやバックアップ方法を指定する。
デフォルト値はつぎのとおりである。
(lambda (name) (or (< (length name) 5) (not (string-equal "/tmp/" (substring name 0 5))))) |
nil
以外であると、バックアップを禁止する。
この変数は、訪問したファイルの名前に対するbackup-enable-predicate
の
検査結果を記録している。
訪問したファイルに基づいてバックアップを禁止する
他の機構でもこの変数を使える。
たとえば、VCはこの変数にnil
以外を設定し、
版管理システムで管理されているファイルに対してバックアップの作成を禁止する。
これは恒久的にバッファローカルであり、
メジャーモードを変更しても値は失われない。
メジャーモードはこの変数に設定するべきではなく、
かわりに、make-backup-files
に設定するべきである。
Emacsは2つの方法でバックアップファイルを作れます。
最初の改名による方式がデフォルトです。
変数backup-by-copying
がnil
以外であると、
2番目の方式、つまり、元ファイルをコピーしてから
バッファの新たな内容で上書きすることを指示します。
変数file-precious-flag
がnil
以外であっても
(その主目的の副作用として)同じ効果があります。
See section 24.2 バッファの保存。
nil
以外であると、
Emacsはつねにコピーしてバックアップファイルを作る。
つぎの2つの変数がnil
以外であると、
特定の場面では2番目の方式を使うことになります。
これらの変数は、特別な場面に該当しないファイルの扱い方には影響しません。
nil
以外の場合、Emacsは、
複数の名前(ハードリンク)を持つファイルはコピーしてバックアップする。
この変数はbackup-by-copying
がnil
以外の場合にのみ意味を持つ。
というのは、その変数がnil
以外の場合にコピーを用いるからである。
nil
以外の場合、Emacsは、
改名するとファイルの所有者やグループを変更してしまう場合に
コピーしてバックアップする。
改名してもファイルの所有者やグループを変更しなければ、 この値は効果を持たない。 つまり、ユーザーが所有しているファイルであり、 そのグループが当該ユーザーが新規作成するファイルのデフォルトに一致する 場合である。
この変数はbackup-by-copying
がnil
以外の場合にのみ意味を持つ。
というのは、その変数がnil
以外の場合にコピーを用いるからである。
ファイル名が`foo'であると、 その番号付きバックアップファイルの名前はvを整数として `foo.~v~'となります。 つまり、`foo.~1~'、`foo.~2~'、`foo.~3~'、...、 `foo.~259~'といった具合です。
nil
never
番号付きバックアップファイルを使うと、 最終的には非常に多くのバックアップファイルができてしまい、 それらは削除しなければなりません。 Emacsはそれらを自動的に削除したり、 削除するかどうかユーザーに問い合わせることができます。
1、2、3、5、7と番号が付いたバックアップがあり、
これらのどちらの変数の値も2であるとすると、
最古のものとして1と2の番号が付いたバックアップを保存し、
最新のものとして5と7の番号が付いたバックアップを保存する。
関数find-backup-file-name
(see section 25.1.4 バックアップファイルの命名方法)は、
どの番号のバックアップを削除すべきかを決定する責任があるが、
それ自身はそれらを削除しない。
nil
以外であると、
ファイルを保存すると黙って範囲外のバックアップを削除する。
さもなければ、それを削除するかどうかユーザーに問い合わせる。
dired-clean-directory
)で
最新のバックアップを何個保存するかを指定する。
これは、新たなバックアップファイルの作成を指示したときに
kept-new-versions
が指定することと同じである。
デフォルト値は2である。
本節の関数は、それらを再定義することでバックアップファイルの命名方法を カスタマイズできるため、ここで述べることにします。 どれか1つを変更すると、残りのものも変更する必要があるでしょう。
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行になる。)
カスタマイズのために再定義しやすいように、 この単純な式を独立した関数にしてある。
ほとんどのオペレーティングシステムでは、 この関数の標準定義はつぎのとおりである。
(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には、 バックアップファイルは`~'で終ると仮定しているものがある。 この慣習に従わない場合、重大な問題には至らないであろうが、 それらのコマンドがあまり望ましくない結果をもたらすかもしれない。
find-backup-file-name
は、
CARに新たなバックアップファイルの名前、
CDRに削除すべきバックアップファイルのリストを持つリストを返す。
2つの変数、kept-old-versions
とkept-new-versions
は、
どのバックアップを保存すべきかを決定する。
この関数は、値のCDRではそれらのバックアップファイルは
除外してある。
see section 25.1.3 番号付きバックアップファイルの作成と削除。
つぎの例の値では、`~rms/foo.~5~'が 新たなバックアップファイルの名前であり、 `~rms/foo.~3~'が『範囲外』のものであり、 呼び出し側で削除するかどうか考慮すべきである。
(find-backup-file-name "~rms/foo") => ("~rms/foo.~5~" "~rms/foo.~3~") |
nil
を返す。
ファイルを比較するコマンドのなかには、 最新のバックアップファイルと自動的に比較できるように この関数を使うものがある。
Emacsは編集中のすべてのファイルを定期的に保存します。 これを自動保存(auto-savign)と呼びます。 自動保存により、システムがクラッシュしても、 一定量以上の作業を失わないようにします。 デフォルトでは、300打鍵ごと、あるいは、30秒間なにもしないと自動保存します。 ユーザー向けの自動保存に関する情報については、 See section `自動保存、不慮の事故に対する備え' in GNU Emacs マニュアル。 ここでは、自動保存を実装するための関数と それらを制御する変数について述べます。
nil
である。
buffer-auto-save-file-name => "/xcssun/users/rms/lewis/#files.texi#" |
t
、空でないリスト、正整数のいずれかであれば、
このコマンドは自動保存をオンにする。
さもなければ自動保存をオフにする。
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
も
それに従って必ず再定義すること。
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
もそれに従って必ず変更すること。
nil
以外であると、
Emacsは訪問しているファイルにバッファを自動保存する。
つまり、読者が編集しているファイルと同じファイルに自動保存を行う。
通常、この変数はnil
であり、自動保存ファイルには
make-auto-save-file-name
で作成した別の名前がある。
この変数の値を変更しても、
バッファの自動保存をつぎにオンにするまで、この値は効果を発揮しない。
自動保存がすでにオンであると、
auto-save-mode
を再度呼び出すまでは、
同じファイルの名前に自動保存し続ける。
t
を返す。
nil
を返す。
nil
以外であると、
ファイルを訪問しているバッファはデフォルトで自動保存をオンにする。
さもなければ、そうしない。
通常、バッファを自動保存すると、
自動保存を実行中にはエコー領域にメッセージ`Auto-saving...'が表示される。
しかし、no-messageがnil
以外であると、
メッセージを表示しない。
current-onlyがnil
以外であると、
カレントバッファのみを自動保存する。
delete-auto-save-files
がnil
以外であると、
カレントバッファの自動保存ファイルを削除する。
バッファを保存するたびに呼び出される。
delete-auto-save-file-if-necessary
が使う。
nil
以外であると、Emacsは(訪問しているファイルに)実際に
保存すると自動保存ファイルを削除する。
これによりディスクスペースを節約し、読者のディレクトリを整頓できる。
この変数が-1であると、 大幅に削除したために一時的に自動保存をオフにしたことを意味する。 明示的にバッファを保存すると、この変数に正の値が保存され、 自動保存が再度オンになる。 自動保存をオフにしたりオンにしても、この変数が変更される。
nil
以外であると)、
すべての自動保存ファイルの名前を記録するファイルを指定する。
Emacsが自動保存を行うたびに、
自動保存がオンである各バッファに関する2行をこのファイルに書き出す。
1行目は訪問しているファイルの名前を与え(訪問していなければ空)、
2行目は自動保存ファイルの名前を与える。
Emacsが正常に終ると、このファイルは削除される。
Emacsがクラッシュしたら、失われてしまう作業内容を含んでいるかもしれない
自動保存ファイルを探すために読者はこのファイルを調べられる。
コマンドrecover-session
はこれらのファイルを使う。
このファイルのデフォルト名は、 読者のホームディレクトリにあり`.saves-'で始まる。 さらに、EmacsのプロセスIDとホスト名も含む。
ファイルを大幅に変更したあとで、そのような変更をやめたい場合には、
コマンドrevert-buffer
でファイルのまえの版を読み込めます。
See section `バッファを復元する' in GNU Emacs マニュアル。
デフォルトでは、最後の自動保存ファイルが
訪問しているファイルよりも新しい場合には、
revert-buffer
は自動保存ファイルを使うかどうか
ユーザーに問い合わせる。
しかし、引数ignore-autoがnil
以外であると、
訪問したファイルのみを使う。
対話的に呼ばれた場合、数値前置引数を指定しない限り、
ignore-autoはt
である。
したがって、対話的な場合のデフォルトでは、自動保存ファイルを検査する。
通常、バッファを変更するまえにrevert-buffer
は確認してくる。
しかし、引数noconfirmがnil
以外であると、
revert-buffer
は確認しない。
復元作業では、
insert-file-contents
の置換機能を用いて
バッファ内のマーカ位置を保存するように努める。
復元操作のまえにバッファの内容とファイルの内容が同一であれば、
すべてのマークが保存される。
同一でなければ、復元によりバッファが変更され、
バッファの先頭と末尾の(あれば)未変更なテキスト内のマーカを保存する。
それ以外のマーカを保存しても問題を引き起こすだけであろう。
以下の変数を典型的にはバッファローカルな変数として設定することで
revert-buffer
の動作をカスタマイズできます。
revert-buffer
はユーザーに確認せずに当該ファイルを復元する。
nil
以外であれば、復元を行う引数なしの関数として呼び出される。
値がnil
であると、復元操作は通常の方法で行われる。
diredモードなどのモードでは、 編集中のテキストはファイルの内容ではなく 別の方法で再生成されたものなので、 この変数のバッファローカルな値には内容を再生成する関数を指定すること。
nil
以外であると、
このバッファを復元するときに更新内容を挿入するために使われる関数である。
当該関数は2つの引数をとる。
第1引数は、使用するファイル名である。
第2引数は、ユーザーが自動保存ファイルを
読むように指示しているとt
である。
revert-buffer-function
がnil
である
場合にのみ、変更内容を実際に挿入するまえにrevert-buffer
が実行する。
フォントロック(font-lock)モードはこのフックを使って、 バッファ内容をこれ以上強調表示しないことを記録する。
revert-buffer-function
がnil
である
場合にのみ、変更内容を実際に挿入したあとにrevert-buffer
が実行する。
フォントロック(font-lock)モードはこのフックを使って、 更新されたバッファ内容に対するフォントを再計算する。
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |