Emacsは各バッファに対して、バッファのテキストを変更したかどうかを記録するための変更フラグというフラグを保持しています。このフラグは、バッファの内容を変更するたびにtに設定され、保存時にnilにクリアされます。したがって、このフラグによって未保存の変更があるかどうかが分かります。フラグの値は通常モードラインに表示され(モードラインで使用される変数を参照)、保存(バッファの保存を参照)および自動保存(自動保存を参照)を制御します。
一部のLispプログラムでは、フラグを明示的に設定します。例えば、関数 set-visited-file-name はフラグを t
に設定します。これは、たとえ以前に閲覧したファイルから変更されていなくても、テキストが新たに閲覧したファイルと一致しないためです。
バッファの内容を変更する関数については、Text で説明されています。
この関数は、buffer がファイルから最後に読み込まれた際または保存されて以来変更されている場合は
non-nil を、それ以外の場合は nil
を返します。buffer が最後に変更されて以来自動保存されている場合、この関数はシンボル autosaved を返します。buffer が nil であるか、または省略されている場合は、現在のバッファがデフォルトとなります。
この関数は、flag が nil
以外の場合は現在のバッファを変更済みとして、フラグが nil の場合は未変更としてマークします。
この関数を呼び出すことによるもう一つの効果は、現在のバッファのモードラインを無条件に再表示させることです。実際、関数 force-mode-line-update は次のように動作します:
(set-buffer-modified-p (buffer-modified-p))
set-buffer-modified-pと同様ですが、モードラインの再表示を強制しません。また、この関数ではflagの値にシンボルautosavedを指定することもでき、これによりバッファが変更済みとしてマークされ、最後の変更後に自動保存されます。
このコマンドは、現在のバッファを未変更としてマークし、保存の必要がない状態にします。arg が nil
以外の場合、バッファを変更済みとしてマークし、次に適切なタイミングで保存されるようにします。対話モードでは、arg はプレフィックス引数となります。
この関数はエコー領域にメッセージを出力するため、プログラム内では使用しないでください。代わりに(上記の)set-buffer-modified-pを使用してください。
この関数は buffer
の変更回数を返します。これは、バッファが変更されるたびにインクリメントされるカウンタです。buffer が
nil である(または省略されている)場合は、現在のバッファが使用されます。
この関数は、buffer
の文字変更回数を返します。テキストプロパティの変更によってこのカウンタは変わりませんが、バッファにテキストが挿入または削除されるたびに、カウンタは
buffer-modified-tick が返す値にリセットされます。2回の buffer-chars-modified-tick
呼び出しで返された値を比較することで、呼び出しの間にそのバッファで文字変更が発生したかどうかを判定できます。buffer が nil
である(または省略されている)場合は、現在のバッファが使用されます。
テキストプロパティのみを変更する場合など、テキスト自体を実質的に変更せずにバッファを修正する必要があることがあります。プログラムで、バッファ変更に反応するフックや機能をトリガーせずにバッファを修正する必要がある場合は、with-silent-modifications マクロを使用してください。