本セクションでは、特定のバッファに対してアンドゥ情報の有効化・無効化を行う方法について説明します。また、アンドゥリストが大きくなりすぎないよう、自動的に切り詰められる仕組みについても解説します。
新規に作成されたバッファへのアンドゥ情報の記録は、通常、初期状態で有効になっています。ただし、バッファ名がスペースで始まる場合、アンドゥ記録は初期状態で無効になります。以下の2つの関数を使用するか、buffer-undo-list を自身で設定することで、アンドゥ記録を明示的に有効または無効にできます。
このコマンドは、バッファ buffer-or-name
のアンドゥ情報の記録を有効にし、後続の変更を元に戻せるようにします。引数が指定されない場合は、現在のバッファが使用されます。バッファで既にアンドゥ記録が有効になっている場合、この関数は何も行いません。nil を返します。
インタラクティブコールでは、buffer-or-name が現在のバッファとなります。他のバッファを指定することはできません。
この関数は buffer-or-name の元に戻すリストを破棄し、以降の元に戻す情報の記録を無効にします。その結果、過去の変更およびそれ以降の変更のいずれも元に戻せなくなります。buffer-or-name の元に戻すリストが既に無効になっている場合、この関数は効果を持ちません。
対話型コールでは、BUFFER-OR-NAME は現在のバッファです。他のバッファを指定することはできません。この関数は nil を返します。
編集を続けるにつれて、アンドゥリストはどんどん長くなります。利用可能なメモリ空間をすべて使い果たさないよう、ガベージコレクションによって、設定可能なサイズ制限までリストが切り詰められます。(この際、アンドゥリストのサイズは、リストを構成するconsセルと、削除されたテキストの文字列の合計として計測されます。)許容されるサイズの範囲は、undo-limit、undo-strong-limit、undo-outer-limitという3つの変数によって制御されます。これらの変数において、サイズは保存済みテキストとその他のデータの両方を含む、占有バイト数としてカウントされます。
これは、アンドゥリストの許容サイズのソフトリミットです。このサイズを超えた時点の変更グループが、最後に保持されます。
これは、アンドゥリストの許容サイズの上限です。このサイズを超えた変更グループ自体(およびそれ以前のすべての変更グループ)は破棄されます。ただし、1点例外があります。最新の変更グループは、undo-outer-limitを超えた場合にのみ破棄されます。
ガベージコレクション時に、現在のコマンドのアンドゥ情報がこの制限を超えると、Emacsはその情報を破棄し、警告を表示します。これは、メモリオーバーフローを防ぐための最終手段となる制限です。
この変数が nil 以外の場合、アンドゥ情報が undo-outer-limit を超えると、Emacs
はエコーエリアでその情報を破棄するかどうかを尋ねます。デフォルト値は nil
で、これは自動的に破棄することを意味します。
このオプションは主にデバッグを目的としています。質問が行われている間はガベージコレクションが抑制されるため、ユーザーが回答するまで長時間待機すると、Emacsでメモリリークが発生する可能性があります。