GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Buffer-Modification.html ・ emacs-doc.conao3.com

28.5 バッファの変更

Emacsは各バッファに対して、バッファのテキストを変更したかどうかを記録するための変更フラグというフラグを保持しています。このフラグは、バッファの内容を変更するたびにtに設定され、保存時にnilにクリアされます。したがって、このフラグによって未保存の変更があるかどうかが分かります。フラグの値は通常モードラインに表示され(モードラインで使用される変数を参照)、保存(バッファの保存を参照)および自動保存(自動保存を参照)を制御します。

一部のLispプログラムでは、フラグを明示的に設定します。例えば、関数 set-visited-file-name はフラグを t に設定します。これは、たとえ以前に閲覧したファイルから変更されていなくても、テキストが新たに閲覧したファイルと一致しないためです。

バッファの内容を変更する関数については、Text で説明されています。

関数: buffer-modified-p &optional buffer

この関数は、buffer がファイルから最後に読み込まれた際または保存されて以来変更されている場合は non-nil を、それ以外の場合は nil を返します。buffer が最後に変更されて以来自動保存されている場合、この関数はシンボル autosaved を返します。buffer が nil であるか、または省略されている場合は、現在のバッファがデフォルトとなります。

関数: set-buffer-modified-p flag

この関数は、flag が nil 以外の場合は現在のバッファを変更済みとして、フラグが nil の場合は未変更としてマークします。

この関数を呼び出すことによるもう一つの効果は、現在のバッファのモードラインを無条件に再表示させることです。実際、関数 force-mode-line-update は次のように動作します:

(set-buffer-modified-p (buffer-modified-p))
関数: restore-buffer-modified-p flag

set-buffer-modified-pと同様ですが、モードラインの再表示を強制しません。また、この関数ではflagの値にシンボルautosavedを指定することもでき、これによりバッファが変更済みとしてマークされ、最後の変更後に自動保存されます。

コマンド: not-modified &optional arg

このコマンドは、現在のバッファを未変更としてマークし、保存の必要がない状態にします。arg が nil 以外の場合、バッファを変更済みとしてマークし、次に適切なタイミングで保存されるようにします。対話モードでは、arg はプレフィックス引数となります。

この関数はエコー領域にメッセージを出力するため、プログラム内では使用しないでください。代わりに(上記の)set-buffer-modified-pを使用してください。

関数: buffer-modified-tick &optional buffer

この関数は buffer の変更回数を返します。これは、バッファが変更されるたびにインクリメントされるカウンタです。buffer が nil である(または省略されている)場合は、現在のバッファが使用されます。

関数: buffer-chars-modified-tick &optional buffer

この関数は、buffer の文字変更回数を返します。テキストプロパティの変更によってこのカウンタは変わりませんが、バッファにテキストが挿入または削除されるたびに、カウンタは buffer-modified-tick が返す値にリセットされます。2回の buffer-chars-modified-tick 呼び出しで返された値を比較することで、呼び出しの間にそのバッファで文字変更が発生したかどうかを判定できます。buffer が nil である(または省略されている)場合は、現在のバッファが使用されます。

テキストプロパティのみを変更する場合など、テキスト自体を実質的に変更せずにバッファを修正する必要があることがあります。プログラムで、バッファ変更に反応するフックや機能をトリガーせずにバッファを修正する必要がある場合は、with-silent-modifications マクロを使用してください。

マクロ: with-silent-modifications body…

バッファを変更しないふりをして body を実行します。これには、バッファのファイルがロックされているかの確認(ファイルロック を参照)、バッファ変更フックの実行(変更フック を参照)などが含まれます。なお、body が(テキストプロパティではなく)実際にバッファのテキストを変更する場合、そのアンドゥデータが破損する可能性があります。