Next: , Previous: , Up: バッファー   [Contents][Index]


28.5 バッファーの変更

Emacsは各バッファーにたいしてバッファーのテキストを変更したかどうかを記録するために、変更フラグ(modified flag)と呼ばれるフラグを管理しています。このフラグはバッファーのコンテンツを変更すると常にtにセットされ、バッファーを保存したときnilにクリアーされます。したがってこのフラグは保存されていない変更があるかどうかを表します。フラグの値は通常はモードライン内(モードラインで使用される変数を参照)に表示され、保存(バッファーの保存を参照)と自動保存(自動保存を参照)を制御します。

いくつかのLispプログラムは、このフラグを明示的にセットします。たとえば、関数set-visited-file-nameは、このフラグをtにセットします。なぜなら、たとえその前にvisitしていたファイルが変更されていなくても、テキストは新たにvisitされたファイルとマッチしないからです。

バッファーのコンテンツを変更する関数はテキストで説明されています。

Function: buffer-modified-p &optional buffer

この関数はバッファーbufferが最後に読み込まれた、あるいは保存されて以降に変更されていればt、そうでなければnilをリターンする。bufferが与えられなければカレントバッファーをテストする。

Function: set-buffer-modified-p flag

この関数はflagが非nilならカレントバッファーを変更済みとして、nilなら未変更としてマークする。

この関数を呼び出すことによる別の効果は、それがカレントバッファーのモードラインの無条件な再表示を引き起こすことである。実際のところ関数force-mode-line-updateは以下を行うことにより機能する:

(set-buffer-modified-p (buffer-modified-p))
Function: restore-buffer-modified-p flag

set-buffer-modified-pと同様だがモードラインの再表示は強制しない。

Command: not-modified &optional arg

このコマンドはカレントバッファーが変更されておらず保存する必要がないとマークする。argが非nilなら変更されているとマークするので、次回の適切なタイミングでバッファーは保存されるだろう。interactiveに呼び出された場合には、argはプレフィックス引数。

この関数はエコーエリア内にメッセージをプリントするのでプログラム内で使用してはならない。かわりにset-buffer-modified-p (上述)を使用すること。

Function: buffer-modified-tick &optional buffer

この関数はbufferの変更カウント(modification-count)をリターンする。これはバッファーが変更されるたびに増加されるカウンター。buffernil (または省略)ならカレントバッファーが使用される。

Function: buffer-chars-modified-tick &optional buffer

この関数はbufferの文字変更に関わる変更カウントをリターンする。テキストプロパティを変更してもこのカウンターは変化しない。しかしそのバッファーにテキストが挿入または削除されるたびに、このカウンターはbuffer-modified-tickによりリターンされるであろう値にリセットされる。buffer-chars-modified-tickを2回呼び出してリターンされる値を比較することにより、その呼び出しの間にバッファー内で文字変更があったかどうかを知ることができる。buffernil (または省略)ならカレントバッファーが使用される。

テキストプロパティの変更の等、バッファーのテキストを実際には変更しない方法でバッファーを変更することを要する場合があります。プログラムがフックやバッファー変更にたいするリアクションを何もトリガーせずにバッファーを変更する必要がある場合には、with-silent-modificationsマクロを使用します。

Macro: with-silent-modifications body…

バッファーを変更しないように装ってbodyを実行する。これにはバッファーのファイルがロックされているかどうかのチェック(ファイルのロックを参照)、バッファーの変更フック(フックの変更を参照)等が含まれる。(バッファーのテキストプロパティとは対照的に)bodyが実際にバッファーテキストを変更する場合にはアンドゥするデータが破損するかもしれないことに注意。