Emacs内でファイルを編集する際には、実際にはそのファイルをvisitしているバッファーにたいして編集を行っています。つまりファイルのコンテンツをバッファーにコピーしてそのコピーを編集しています。そのバッファーを変更してもバッファーを保存(save)するまでファイルは変更されません。保存とはバッファーのコンテンツをファイルにコピーすることを意味します。ファイルをvisitしていないバッファーでも、バッファーローカルんqwrite-contents-functions
の関数を使用することにより“saved(保存済み)”にすることができます。
この関数はバッファーが最後にvisitされたときや保存されたときから変更されていれば、カレントバッファーのコンテンツをバッファーによってvisitされているファイルに保存、変更されていなければ何も行わない。
save-buffer
はバックアップファイルの作成に責任を負う。backup-optionは通常はnil
であり、save-buffer
はファイルのvisit以降、それが最初の保存の場合のみバックアップファイルを作成する。backup-optionにたいする他の値は、別の条件によるバックアップファイル作成を要求する:
save-buffer
はバッファーの次回保存時にこのバージョンのファイルがバックアップされるようマークする。
save-buffer
関数はそれを保存する前に前バージョンのファイルを無条件にバックアップする。
このコマンドはファイルをvisitしている変更されたバッファーのいくつかを保存する。これは通常は各バッファーごとにユーザーに確認を求める。しかしsave-silently-pが非nil
なら、ユーザーに質問せずにファイルをvisitしているすべてのバッファーを保存する。
オプション引数predは、どのバッファーで確認を求めるか(またはsave-silently-pが非nil
ならどのバッファーで確認せずに保存するか)を制御する。
predがnil
なら、predのかわりにsave-some-buffers-default-predicate
の値を使用することを意味する。その結果がnil
ならファイルをvisitしているバッファーにたいしてのみ確認を求めることを意味する。t
ならbuffer-offer-save
のバッファーローカル値がnil
であるような非ファイルバッファー以外の特定のバッファーの保存も提案することを意味する(バッファーのkillを参照)。ユーザーが非ファイルバッファーの保存にたいして‘yes’と応えると保存に使用するファイル名の指定を求める。save-buffers-kill-emacs
関数はpredにたいして値t
を渡す。
述語がt
とnil
のいずれでもなければ引数なしの関数であること。その関数はバッファーの保存を提案するか否かを決定するためにバッファーごとに呼び出される。これが特定のバッファーで非nil
値をリターンすればバッファー保存の提案を行うことを意味する。
この関数はカレントバッファーをファイルfilenameに書き込んで、バッファーがそのファイルをvisitしていることにして未変更とマークする。次にfilenameにもとづいてバッファー名をリネームする。バッファー名を一意にするため、必要なら‘<2>’のような文字列を付加する。処理のほとんどはset-visited-file-name
(バッファーのファイル名を参照)、およびsave-buffer
を呼び出すことにより行われる。
confirmが非nil
なら、それは既存のファイルを上書きする前に確認を求めることを意味する。ユーザーがプレフィックス引数を与えなければinteractiveに確認が求められる。
filenameがディレクトリー名(ディレクトリーの名前を参照)、または既存のディレクトリーへのシンボリックリンクなら、write-file
はディレクトリーfilename内でvisitされているファイルの名前を使用する。そのバッファーがファイルをvisitしていなければ、かわりにバッファーの名前を使用する。
バッファーの保存によりフックがいくつか実行されます。これによりフォーマット変換も処理されます(ファイルのフォーマット変換を参照)。以下で説明するこれらのフックはバッファーのテキストをファイルに書き込むsave-buffer
以外の他のプリミティブや関数、とりわけauto-saving
(自動保存を参照)では実行されないことに注意してください。
この変数の値はvisitされているファイルをバッファーに書き出す前に呼び出される関数のリスト。それらのうちのいずれかが非nil
をリターンしたら、そのファイルは書き込み済みだと判断されて残りの関数は呼び出されないし、ファイルを書き込むための通常のコードも実行されない。
write-file-functions
内の関数が非nil
をリターンしたら、(それが適切なら)その関数はファイルをバックアップする責任を負う。これを行うには以下のコードを実行する:
(or buffer-backed-up (backup-buffer))
backup-buffer
によりリターンされるファイルモードの値を保存して、(もし非nil
なら)書き込むファイルのモードビットをセットしたいと思うかもしれない。これは正にsave-buffer
が通常行うことである。Making Backup Filesを参照のこと。
write-file-functions
内のフック関数は、データのエンコード(が望ましければ)にも責任を負う。これらは適切なコーディングシステムと改行規則(Lispでのコーディングシステムを参照)を選択してエンコード(明示的なエンコードとデコードを参照)を処理して、使用されていたコーディングシステム(エンコーディングとI/Oを参照)をlast-coding-system-used
にセットしなければならない。
バッファー内でこのフックをローカルにセットすると、バッファーはそのファイル、またはバッファーのコンテンツを取得したファイルに類するものに関連付けられる。このようにして変数は恒久的にローカルとマークされるので、メジャーモードの変更がバッファーローカルな値を変更することはない。その一方でset-visited-file-name
を呼び出すことによって変数はリセットされるだろう。これを望まなければ、かわりにwrite-contents-functions
を使用したいと思うかもしれない。
たとえこれがノーマルフックでなくても、このリストを操作するためにadd-hook
とremove-hook
を使用することはできる。フックを参照のこと。
これは正にwrite-file-functions
と同様に機能するが、こちらはvisitしている特定のファイルやファイルの場所ではなくバッファーのコンテンツに関連するフックを意図しており、実際にはファイルをvisitしていないバッファーにたいして任意の保存処理を作成するために使用できる。そのようなフックは、この変数にたいするバッファーローカルなバインディングとして、通常はメジャーモードにより作成される。この変数はセットされた際には常に自動的にバッファーローカルになる。新たなメジャーモードへの切り替えは常にこの変数をリセットするが、set-visited-file-name
の呼び出しではリセットされない。
このフック内の関数のいずれかが非nil
をリターンすると、そのファイルはすでに書き込み済みとみなされて、残りの関数は呼び出されずwrite-file-functions
内の関数も呼び出されない。
(スペシャルモードのバッファーのような)ファイルをvisitしていないバッファーを保存するためにこのフックを利用する際には、その関数が正常に保存することに失敗してnil
値をリターンすると、save-buffer
がユーザーにたいしてバッファーを保存するファイルの入力を求めることに留意。これが望ましくなければエラーのレイズによる関数の失敗を考慮されたい。
このノーマルフックはvisitしているファイルにバッファーが保存される前に実行される。保存が通常の方法で行われるか、あるいは上述のフックのいずれかで行われたかは問題ではない。たとえばcopyright.elプログラムは、ファイルの保存においてそれの著作権表示が今年であることを確認するためにこのフックを使用する。
これはバッファーをvisitするファイルに保存後に実行されるノーマルフック。
この変数が非nil
なら、save-buffer
は保存ファイルがもつ名前のかわりに一時的な名前で新たなファイルに書き込み、エラーがないことが明確になった後にファイルを意図する名前にリネームすることによって保存中のI/Oエラーから防御する。この手順は無効なファイルが原因となるディスク容量逼迫のような問題を防ぐ。
副作用としてバックアップ作成にコピーが必要になる。リネームかコピーのどちらでバックアップするか?を参照のこと。しかし同時にこの高価なファイル保存によって保存したファイルと他のファイル名との間のすべてのハードリンクは切断される。
いくつかのモードは特定のバッファーにおいてこの変数に非nil
のバッファーローカル値を与える。
この変数はファイルが改行で終わらないように書き込まれるかどうかを決定する。変数の値がt
なら、save-buffer
はバッファーの終端に改行がなければ暗黙理に改行を追加する。値がvisit
なら、Emacsはファイルをvisitした直後に不足している改行を追加する。値がvisit-save
なら、Emacsはvisitと保存の両方のタイミングで不足している改行を追加する。その他の非nil
値にたいしては、そのようなケースが生じるたびに改行を追加するかどうかsave-buffer
がユーザーに尋ねる。
変数の値がnil
ならsave-buffer
は改行を追加しない。デフォルト値はnil
だが、特定のバッファーでこれをt
にセットするメジャーモードも少数存在する。
バッファーのファイル名の関数set-visited-file-name
も参照されたい。