次: Maintaining Undo, 前: The Kill Ring, 上: Text
ほとんどのバッファには、バッファのテキストに対する変更をアンドゥ(もとに戻す)
できるようにすべての変更を記録する
アンドゥリスト(undo list)があります。
(アンドゥリストのないバッファは、
Emacsがアンドゥは有用ではないと仮定する特殊目的のバッファである。)
バッファのテキストを変更するすべての基本関数は、
変数buffer-undo-list
に収めたアンドゥリストの先頭に
自動的に要素を追加します。
アンドゥリストの要素として可能なものをつぎに示します。
(
beg .
end)
(
text .
position)
(abs
position)
である。
(t
high .
low)
primitive-undo
はこれらの値を用いて、
バッファを再度未変更と印を付けるかどうか判定する。
ファイルの更新時刻がこれに一致するときにのみ再度未変更とする。
(nil
property value beg .
end)
(put-text-property beg end property value)
(
marker .
adjustment)
nil
この関数は、アンドゥリストに境界要素を置く。 アンドゥコマンドはそのような境界で停止し、 連続したアンドゥコマンドはよりまえの境界までアンドゥする。 この関数は
nil
を返す。エディタコマンドループは、 各キー列を実行するまえにアンドゥの境界を自動的に作る。 したがって、各アンドゥは、1つのコマンドの効果を普通は取り消す。 自己挿入の入力文字は例外である。 コマンドループはそのような最初の文字に境界を作り、 つぎの19個の連続する自己挿入の入力文字では境界を作らず、 20番目で境界を作るということを自己挿入の入力文字が続く限り行う。
別のバッファでアンドゥ可能な変更を行うたびに バッファのすべての変更で境界を追加する。 これは、各コマンドが変更した箇所で各バッファに境界を作ることを 保証するためである。
1つのコマンドの効果を複数に分けるためにこの関数を直接呼ぶことは有用である。 たとえば、
query-replace
は各置換のあとでundo-boundary
を呼び出し、 ユーザーが個々の置換を1つ1つアンドゥできるようにする。
これは、アンドゥリストの要素をアンドゥする基本的な関数である。 listの先頭のcount個の要素をアンドゥし、listの残りを返す。 この関数をLispで書くこともできるが、Cで書いたほうが便利である。
primitive-undo
は、バッファを変更すると バッファのアンドゥリストに要素を追加する。 アンドゥコマンドは一連のアンドゥ操作を始めるときに アンドゥリストを保存して混乱を避ける。 アンドゥ操作では、保存しておいた値を使い更新する。 アンドゥによって追加される新たな要素はこの保存された値の一部ではないので、 それらはアンドゥを続行しても干渉しない。