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


24.2 Saving Buffers

Emacs内でファイルを編集とき、実際にはそのファイルをvisitしているバッファーにたいして編集を行っています。つまり、ファイルのコンテンツをバッファーにコピーして、編集しているのはそのコピーなのです。そのバッファーにを変更しても、バッファーを保存(save)するまでファイルは変更されません。保存とは、バッファーのコンテンツをファイルにコピーすることを意味します。

Command: save-buffer &optional backup-option

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

save-bufferは、バックアップファイルの作成に責任を負う。通常、backup-optionnilであり、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の場合は、どのバッファーで確認せずに保存するか)を制御する。これがnilの場合、それはファイルをvisitしているバッファーにたいしてのみ確認を求めることを意味する。tの場合、それは、buffer-offer-saveのバッファーローカル値がnilであるような、非ファイルバッファー以外の特定のバッファーの保存も提案することを意味する(Killing Buffersを参照)。ユーザーが、非ファイルバッファーの保存にたいして‘yes’と応えると、保存に使用するファイル名の指定を求める。save-buffers-kill-emacs関数は、predにたいして値tを渡す。

predtnilのどちらでもない場合、それは引数なしの関数であること。その関数は、そのバッファーの保存するを提案するか否かを決定するために、バッファーごとに呼び出されるだろう。これが特定のバッファーで非nil値をリターンした場合は、バッファーの保存を提案することを意味する。

Command: write-file filename &optional confirm

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

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

filenameが既存のディレクトリーであったり、既存のディレクトリーへのシンボリックリンクの場合、write-fileはディレクトリーfilename内でvisitされているファイルの名前を使用する。そのバッファーがファイルをvisitしていない場合は、かわりにバッファーの名前を使用する。

バッファーの保存により、複数のフックが実行される。これはフォーマット変換も処理する(Format Conversionを参照)。

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-hookおよびremove-hookを使用することはできる。Hooksを参照のこと。

Variable: write-contents-functions

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

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

User Option: before-save-hook

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

User Option: after-save-hook

このノーマルフックは、visitしているファイルにバッファーを保存した後に実行される。このフックの使用例の1つは、Fast Lockモードにある。このモードは、キャッシュファイルにハイライト情報を保存するために、このフックを使用している。

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も参照されたい。