| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
バックアップファイルと自動保存ファイルは、 クラッシュやユーザー自身の誤りから Emacsがユーザーを保護するための2つの方式です。 自動保存により、現在の編集セッションにおいて、 まえの時点でのテキストを確保します。 バックアップファイルにより、現在のセッション以前の ファイル内容を確保します。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
バックアップファイル(backup file)とは、 読者が編集中のファイルの古い内容のコピーです。 バッファを訪問しているファイルに初めて保存するときに、 Emacsはバックアップファイルを作成します。 通常これは、バックアップファイルは 現在の編集セッションよりまえのファイルの内容を保持することを意味します。 バックアップファイルの内容は、通常、それが作られると変更されません。
訪問したファイルを新たな名前に改名することで 通常バックアップは作られます。 訪問したファイルをコピーしてバックアップファイルを作るように 指示することもできます。 どちらを選ぶかによって、複数の名前を持つファイルでは違いがでます。 また、編集したファイルの所有者が元所有者と同じであるか、 それとも編集したユーザーが所有者になるかにも影響します。
デフォルトでは、Emacsは各編集ファイルに1つのバックアップファイルを作ります。 番号付きのバックアップファイルを作るように指示することもでき、 そうすると、新たなバックアップファイルごとに新たな名前が付きます。 古い番号付きバックアップファイルは必要なくなれば削除できますし、 Emacsがそれらを自動的に削除することも可能です。
25.1.1 バックアップファイルの作成 (2003/10/30) How Emacs makes backup files, and when. 25.1.2 改名によるバックアップかコピーによるバックアップか (2003/10/30) Two alternatives: renaming the old file or copying it. 25.1.3 番号付きバックアップファイルの作成と削除 (2003/10/30) Keeping multiple backups for each source file. 25.1.4 バックアップファイルの命名方法 (2003/10/30) How backup file names are computed; customization.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
save-bufferがこの関数を呼び出す。
nil以外であれば、バックアップファイルは作成済みであることを表す。
さもなければ、(バックアップがオンになっていれば)つぎに保存するときに
ファイルのバックアップを作成するべきであることを表す。
これは恒久的にバッファローカルであり、
kill-all-local-variablesによって変更されない。
nil以外であると、backup-inhibitedがnilならば(下記参照)
Emacsは初めて保存するときに各ファイルのバックアップを作成する。
つぎの例は、rmailのバッファでのみ変数make-backup-filesを
変更する方法である。
この変数をnilにすると、
Emacsはそれらのファイルのバックアップを作成しなくなり、
ディスクスペースの節約になる。
(このコードを読者の設定ファイルに入れてもよい。)
(add-hook 'rmail-mode-hook
(function (lambda ()
(make-local-variable
'make-backup-files)
(setq make-backup-files nil))))
|
nilを返すと、当該ファイルのバックアップは禁止である。
さもなければ、本節の他の変数が、
バックアップするかどうかやバックアップ方法を指定する。
この変数のデフォルト値はnormal-backup-enable-predicateであり、
temporary-file-directory や
small-temporary-file-directory にあるファイルを確認し、バックアッ
プを行う。
nil以外であると、バックアップを禁止する。
この変数は、訪問したファイルの名前に対するbackup-enable-predicateの
検査結果を記録している。
訪問したファイルに基づいてバックアップを禁止する
他の機構でもこの変数を使える。
たとえば、VCはこの変数にnil以外を設定し、
版管理システムで管理されているファイルに対してバックアップの作成を禁止する。
これは恒久的にバッファローカルであり、
メジャーモードを変更しても値は失われない。
メジャーモードはこの変数に設定するべきではなく、
かわりに、make-backup-filesに設定するべきである。
(regexp . directory) |
regexpに一致した名前を持つファイルのバックアップは directoryに保存される。directoryが相対パスか絶対パスである。 絶対パスであれば、あるregexpに一致したファイルのバックアップはす べて同じディレクトリにできる。そして、そのバックアップファイルの名前は 衝突を防ぐために、ディレクトリの区切り文字を`!'に変えたフルパスに なる。この方法はファイルシステムがファイル名を短縮して与える場合にはう まく動作しないだろう。
すべてのバックアップが1つのディレクトリにできるようにするには、 `"."'と適切なディレクトリのペアを持つ連想リストであればよい。
この変数がnilかファイル名に一致しなかった場合には、バックアップ
ファイルは元ファイルと同じディレクトリにできる。
この変数は、MS-DOSのように長いファイル名に対応していないシステムでは無 視される。
make-backup-file-name のかわりに使われる。
nilであれば、make-backup-file-name と同じことになる。
ある種のファイルでは特別な処理ができるように、この変数はバッファローカ
ルになっている。もしこれを設定した場合には、backup-file-name-p
や file-name-sans-versions の変更も必要となる場合がある。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
Emacsは2つの方法でバックアップファイルを作れます。
最初の改名による方式がデフォルトです。
変数backup-by-copyingがnil以外であると、
2番目の方式、つまり、元ファイルをコピーしてから
バッファの新たな内容で上書きすることを指示します。
変数file-precious-flagがnil以外であっても
(その主目的の副作用として)同じ効果があります。
See 節 24.2 バッファの保存。
nil以外であると、
Emacsはつねにコピーしてバックアップファイルを作る。
つぎの2つの変数がnil以外であると、
特定の場面では2番目の方式を使うことになります。
これらの変数は、特別な場面に該当しないファイルの扱い方には影響しません。
nil以外の場合、Emacsは、
複数の名前(ハードリンク)を持つファイルはコピーしてバックアップする。
この変数はbackup-by-copyingがnil以外の場合にのみ意味を持つ。
というのは、その変数がnil以外の場合にコピーを用いるからである。
nil以外の場合、Emacsは、
改名するとファイルの所有者やグループを変更してしまう場合に
コピーしてバックアップする。
改名してもファイルの所有者やグループを変更しなければ、 この値は効果を持たない。 つまり、ユーザーが所有しているファイルであり、 そのグループが当該ユーザーが新規作成するファイルのデフォルトに一致する 場合である。
この変数はbackup-by-copyingがnil以外の場合にのみ意味を持つ。
というのは、その変数がnil以外の場合にコピーを用いるからである。
nilでなければ、
backup-by-copying-when-mismatch と同じ動作になる。ただし、ある
ユーザIDの値、すなわちある数以下のIDの場合に限られる。この変数には数整
数を指定する。
そうして、backup-by-copying-when-privileged-mismatch に0を設定
すると、コピーによるバックアップはスーパーユーザで、ファイルの所有者の
変更を破棄する必要がある時にのみ、コピーによるバックアップが行われる。
デフォルトは200である。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
ファイル名が`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 節 25.1.4 バックアップファイルの命名方法 (2003/10/30))は、
どの番号のバックアップを削除すべきかを決定する責任があるが、
それ自身はそれらを削除しない。
tであると、
ファイルを保存すると黙って範囲外のバックアップを削除する。nil
であれば、それを削除するかどうかユーザーに問い合わせる。さもなければ、
すべて削除されない。
dired-clean-directory)で
最新のバックアップを何個保存するかを指定する。
これは、新たなバックアップファイルの作成を指示したときに
kept-new-versionsが指定することと同じである。
デフォルト値は2である。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節の関数は、それらを再定義することでバックアップファイルの命名方法を カスタマイズできるため、ここで述べることにします。 どれか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 節 25.1.3 番号付きバックアップファイルの作成と削除 (2003/10/30)。
つぎの例の値では、`~rms/foo.~5~'が 新たなバックアップファイルの名前であり、 `~rms/foo.~3~'が『範囲外』のものであり、 呼び出し側で削除するかどうか考慮すべきである。
(find-backup-file-name "~rms/foo")
=> ("~rms/foo.~5~" "~rms/foo.~3~")
|
nilを返す。
ファイルを比較するコマンドのなかには、 最新のバックアップファイルと自動的に比較できるように この関数を使うものがある。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
Emacsは編集中のすべてのファイルを定期的に保存します。 これを自動保存(auto-savign)と呼びます。 自動保存により、システムがクラッシュしても、 一定量以上の作業を失わないようにします。 デフォルトでは、300打鍵ごと、あるいは、30秒間なにもしないと自動保存します。 ユーザー向けの自動保存に関する情報については、 See GNU Emacs マニュアル。 ここでは、自動保存を実装するための関数と それらを制御する変数について述べます。
nilである。
buffer-auto-save-file-name
=> "/xcssun/users/rms/lewis/#backups.texi#"
|
t、空でないリスト、正整数のいずれかであれば、
このコマンドは自動保存をオンにする。
さもなければ自動保存をオフにする。
nil以外を返す。
この関数は自動保存ファイルの通常の名前の慣習を仮定する。
つまり、名前がハッシュマーク(`#')で始まりかつ終っていれば、
自動保存ファイルの名前である可能性があると判断する。
ただし、引数filenameにはディレクトリ部分を含まないこと。
(make-auto-save-file-name)
=> "/xcssun/users/rms/lewis/#backups.texi#"
(auto-save-file-name-p "#backups.texi#")
=> 0
(auto-save-file-name-p "backups.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を返す。
この変数が0か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とホスト名も含む。
auto-save-list-file-name
(すでにnil以外を設定していなければ)、この変数を基にホスト名やプ
ロセスIDを加えて初期化される。初期化ファイルでこの変数にnilを設
定すると、Emacsはauto-save-list-file-nameを初期化しない。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
ファイルを大幅に変更したあとで、そのような変更をやめたい場合には、
コマンドrevert-bufferでファイルのまえの版を読み込めます。
See GNU Emacs マニュアル。
デフォルトでは、最後の自動保存ファイルが
訪問しているファイルよりも新しい場合には、
revert-bufferは自動保存ファイルを使うかどうか
ユーザーに問い合わせる。
しかし、引数ignore-autoがnil以外であると、
訪問したファイルのみを使う。
対話的に呼ばれた場合、数値前置引数を指定しない限り、
ignore-autoはtである。
したがって、対話的な場合のデフォルトでは、自動保存ファイルを検査する。
通常、バッファを変更するまえにrevert-bufferは確認してくる。
しかし、引数noconfirmがnil以外であると、
revert-bufferは確認しない。
復元作業では、
insert-file-contentsの置換機能を用いて
バッファ内のマーカ位置を保存するように努める。
復元操作のまえにバッファの内容とファイルの内容が同一であれば、
すべてのマークが保存される。
同一でなければ、復元によりバッファが変更され、
バッファの先頭と末尾の(あれば)未変更なテキスト内のマーカを保存する。
それ以外のマーカを保存しても問題を引き起こすだけであろう。
この節の残りで述べる変数を設定することで、
revert-bufferの動作をカスタマイズできます。
revert-bufferはユーザーに確認せずに当該ファイルを復元する。
あるメジャーモードは これらの関数をバッファローカルで設定することで
、revert-bufferをカスタマイズしています。
nil以外であれば、復元を行う引数なしの関数として呼び出される。
値がnilであると、復元操作は通常の方法で行われる。
diredモードなどのモードでは、 編集中のテキストはファイルの内容ではなく 別の方法で再生成されたものなので、 この変数のバッファローカルな値には内容を再生成する関数を指定することが できます。
nil以外であると、
このバッファを復元するときに更新内容を挿入するために使われる関数である。
当該関数は2つの引数をとる。
第1引数は、使用するファイル名である。
第2引数は、ユーザーが自動保存ファイルを
読むように指示しているとtである。
あるモードでこの変数をrevert-buffer-functionのかわりに設定する
のは、revert-bufferが行う処理の残りが重複したり置き換わってしま
うのを避けるためである。つまり、アンドゥ情報を消去する場合や適当なメ
ジャーモードを決定する場合、以下で述べるフックを走らせる場合に確認を行
う。
revert-buffer-functionがnilである
場合にのみ、変更内容を挿入するまえにrevert-bufferが実行する。
revert-buffer-functionがnilである
場合にのみ、変更内容を挿入したあとにrevert-bufferが実行する。
| [ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |