Next: , Previous: , Up: Files   [Contents][Index]


26.2 バッファーの保存

Emacs内でファイルを編集する際には、実際にはそのファイルをvisitしているバッファーにたいして編集を行っています。つまりファイルのコンテンツをバッファーにコピーしてそのコピーを編集しています。そのバッファーを変更してもバッファーを保存(save)するまでファイルは変更されません。保存とはバッファーのコンテンツをファイルにコピーすることを意味します。ファイルをvisitしていないバッファーでも、バッファーローカルんqwrite-contents-functionsの関数を使用することにより“saved(保存済み)”にすることができます。

Command: save-buffer &optional backup-option

この関数はバッファーが最後にvisitされたときや保存されたときから変更されていれば、カレントバッファーのコンテンツをバッファーによってvisitされているファイルに保存、変更されていなければ何も行わない。

save-bufferはバックアップファイルの作成に責任を負う。backup-optionは通常はnilであり、save-bufferはファイルのvisit以降、それが最初の保存の場合のみバックアップファイルを作成する。backup-optionにたいする他の値は、別の条件によるバックアップファイル作成を要求する:

Command: save-some-buffers &optional save-silently-p pred

このコマンドはファイルをvisitしている変更されたバッファーのいくつかを保存する。これは通常は各バッファーごとにユーザーに確認を求める。しかしsave-silently-pが非nilなら、ユーザーに質問せずにファイルをvisitしているすべてのバッファーを保存する。

オプション引数predは、どのバッファーで確認を求めるか(またはsave-silently-pが非nilならどのバッファーで確認せずに保存するか)を制御する。

prednilなら、predのかわりにsave-some-buffers-default-predicateの値を使用することを意味する。その結果がnilならファイルをvisitしているバッファーにたいしてのみ確認を求めることを意味する。tならbuffer-offer-saveのバッファーローカル値がnilであるような非ファイルバッファー以外の特定のバッファーの保存も提案することを意味する(Killing Buffersを参照)。ユーザーが非ファイルバッファーの保存にたいして‘yes’と応えると保存に使用するファイル名の指定を求める。save-buffers-kill-emacs関数はpredにたいして値tを渡す。

述語がtnilのいずれでもなければ引数なしの関数であること。その関数はバッファーの保存を提案するか否かを決定するためにバッファーごとに呼び出される。これが特定のバッファーで非nil値をリターンすればバッファー保存の提案を行うことを意味する。

Command: write-file filename &optional confirm

この関数はカレントバッファーをファイルfilenameに書き込んで、バッファーがそのファイルをvisitしていることにして未変更とマークする。次にfilenameにもとづいてバッファー名をリネームする。バッファー名を一意にするため、必要なら‘<2>’のような文字列を付加する。処理のほとんどはset-visited-file-name (Buffer File Nameを参照)、およびsave-bufferを呼び出すことにより行われる。

confirmが非nilなら、それは既存のファイルを上書きする前に確認を求めることを意味する。ユーザーがプレフィックス引数を与えなければinteractiveに確認が求められる。

filenameがディレクトリー名(Directory Namesを参照)、または既存のディレクトリーへのシンボリックリンクなら、write-fileはディレクトリーfilename内でvisitされているファイルの名前を使用する。そのバッファーがファイルをvisitしていなければ、かわりにバッファーの名前を使用する。

バッファーの保存によりフックがいくつか実行されます。これによりフォーマット変換も処理されます(Format Conversionを参照)。以下で説明するこれらのフックはバッファーのテキストをファイルに書き込むsave-buffer以外の他のプリミティブや関数、とりわけauto-saving (Auto-Savingを参照)では実行されないことに注意してください。

Variable: write-file-functions

この変数の値はvisitされているファイルをバッファーに書き出す前に呼び出される関数のリスト。それらのうちのいずれかが非nilをリターンしたら、そのファイルは書き込み済みだと判断されて残りの関数は呼び出されないし、ファイルを書き込むための通常のコードも実行されない。

write-file-functions内の関数が非nilをリターンしたら、(それが適切なら)その関数はファイルをバックアップする責任を負う。これを行うには以下のコードを実行する:

(or buffer-backed-up (backup-buffer))

backup-bufferによりリターンされるファイルモードの値を保存して、(もし非nilなら)書き込むファイルのモードビットをセットしたいと思うかもしれない。これは正にsave-bufferが通常行うことである。Making Backup Filesを参照のこと。

write-file-functions内のフック関数は、データのエンコード(が望ましければ)にも責任を負う。これらは適切なコーディングシステムと改行規則(Lisp and Coding Systemsを参照)を選択してエンコード(Explicit Encodingを参照)を処理して、使用されていたコーディングシステム(Encoding and I/Oを参照)をlast-coding-system-usedにセットしなければならない。

バッファー内でこのフックをローカルにセットすると、バッファーはそのファイル、またはバッファーのコンテンツを取得したファイルに類するものに関連付けられる。このようにして変数は恒久的にローカルとマークされるので、メジャーモードの変更がバッファーローカルな値を変更することはない。その一方でset-visited-file-nameを呼び出すことによって変数はリセットされるだろう。これを望まなければ、かわりにwrite-contents-functionsを使用したいと思うかもしれない。

たとえこれがノーマルフックでなくても、このリストを操作するためにadd-hookremove-hookを使用することはできる。Hooksを参照のこと。

Variable: write-contents-functions

これは正にwrite-file-functionsと同様に機能するが、こちらはvisitしている特定のファイルやファイルの場所ではなくバッファーのコンテンツに関連するフックを意図しており、実際にはファイルをvisitしていないバッファーにたいして任意の保存処理を作成するために使用できる。そのようなフックは、この変数にたいするバッファーローカルなバインディングとして、通常はメジャーモードにより作成される。この変数はセットされた際には常に自動的にバッファーローカルになる。新たなメジャーモードへの切り替えは常にこの変数をリセットするが、set-visited-file-nameの呼び出しではリセットされない。

このフック内の関数のいずれかが非nilをリターンすると、そのファイルはすでに書き込み済みとみなされて、残りの関数は呼び出されずwrite-file-functions内の関数も呼び出されない。

(スペシャルモードのバッファーのような)ファイルをvisitしていないバッファーを保存するためにこのフックを利用する際には、その関数が正常に保存することに失敗してnil値をリターンすると、save-bufferがユーザーにたいしてバッファーを保存するファイルの入力を求めることに留意。これが望ましくなければエラーのレイズによる関数の失敗を考慮されたい。

User Option: before-save-hook

このノーマルフックはvisitしているファイルにバッファーが保存される前に実行される。保存が通常の方法で行われるか、あるいは上述のフックのいずれかで行われたかは問題ではない。たとえばcopyright.elプログラムは、ファイルの保存においてそれの著作権表示が今年であることを確認するためにこのフックを使用する。

User Option: after-save-hook

これはバッファーをvisitするファイルに保存後に実行されるノーマルフック。

User Option: file-precious-flag

この変数が非nilなら、save-bufferは保存ファイルがもつ名前のかわりに一時的な名前で新たなファイルに書き込み、エラーがないことが明確になった後にファイルを意図する名前にリネームすることによって保存中のI/Oエラーから防御する。この手順は無効なファイルが原因となるディスク容量逼迫のような問題を防ぐ。

副作用としてバックアップ作成にコピーが必要になる。Rename or Copyを参照のこと。しかし同時にこの高価なファイル保存によって保存したファイルと他のファイル名との間のすべてのハードリンクは切断される。

いくつかのモードは特定のバッファーにおいてこの変数に非nilのバッファーローカル値を与える。

User Option: require-final-newline

この変数はファイルが改行で終わらないように書き込まれるかどうかを決定する。変数の値がtなら、save-bufferはバッファーの終端に改行がなければ暗黙理に改行を追加する。値がvisitなら、Emacsはファイルをvisitした直後に不足している改行を追加する。値がvisit-saveなら、Emacsはvisitと保存の両方のタイミングで不足している改行を追加する。その他の非nil値にたいしては、そのようなケースが生じるたびに改行を追加するかどうかsave-bufferがユーザーに尋ねる。

変数の値がnilならsave-bufferは改行を追加しない。デフォルト値はnilだが、特定のバッファーでこれをtにセットするメジャーモードも少数存在する。

Buffer File Nameの関数set-visited-file-nameも参照されたい。