Next: , Previous: , Up: Text   [Contents][Index]


31.9 アンドゥ

ほとんどのバッファーは、バッファーのテキストにたいして行われた変更をundoできるように、すべての変更を記録するundoリスト(undo list)をもっています(undoリストをもたないバッファーとは通常はEmacsがundoを有用とみなさない特殊用途のバッファーである。特に名前がスペースで始まるバッファーはすべてundoの記録がデフォルトでオフになっている。Buffer Namesを参照)。バッファー内でテキストを変更するすべてのプリミティブはundoリストの先頭に自動的に要素を追加して、それは変数buffer-undo-listに格納されます。

Variable: buffer-undo-list

このバッファーローカル変数の値は、カレントバッファーのundoリスト。値がtならundo情報の記録を無効にする。

以下はundoリストが保有可能な要素の種類です:

position

この種の要素は前のポイント値を記録する。この要素をundoすることによりポイントはpositionに移動する。通常のカーソル移動はどのような類のundo記録も作成しないが、削除操作はそのコマンド以前にポイントがあった場所を記録するためにこのエントリーを使用する。

(beg . end)

この種の要素は挿入されたテキストを削除する方法を示す。挿入においてそのテキストはバッファー内の範囲begからendを占める。

(text . position)

この種の要素は削除されたテキストを再度挿入する方法を示す。文字列textは削除されたテキストそのもの。削除されたテキストを再挿入する位置は(abs position)positionが正ならポイントがあったのは削除されたテキストの先頭、それ以外では末尾。この要素の直後に0個以上の(marker . adjustment)要素が続く。

(t . time-flag)

この種の要素は未変更のバッファーが変更されたことを示す。(sec-high sec-low microsec picosec)という形式のtime-flagは、visitされたファイルにたいしてそれが以前にvisitや保存されたときの更新時刻(modification time)を、current-timeと同じ形式を用いて表す。Time of Dayを参照のこと。time-flagが0ならそのバッファーに対応するファイルがないことを、-1ならvisitされたファイルは以前は存在しなかったことを意味する。primitive-undoはバッファーを再度未変更とマークするかどうかを判断するために、これらの値を使用する(ファイルの状態がtime-flagのそれとマッチする場合のみ未変更とマーク)。

(nil property value beg . end)

この種の要素はテキストプロパティの変更を記録する。変更をundoする方法は以下のようになる:

(put-text-property beg end property value)
(marker . adjustment)

この種の要素はマーカーmarkerがそれを取り囲むテキストの削除により再配置されて、adjustment文字位置を移動したということを記録する。undoリスト内の前にある要素(text . position)とマーカーの位置が一致する場合には、この要素をundoすることによりmarker - adjustment文字移動する。

(apply funname . args)

これは拡張可能なundoアイテムであり、引数argsとともにfunnameを呼び出すことによりundoが行われる。

(apply delta beg end funname . args)

これは拡張可能なundoアイテムであり、begからendまでに限定された範囲にたいして、そのバッファーのサイズをdelta文字増加させる変更を記録する。これは引数argsとともにfunnameを呼び出すことによりundoが行われる。

この種の要素は、それがリージョンと関係するか否かを判断することによりリージョンに限定されたundoを有効にする。

nil

この要素は境界(boundary)である。2つの境界の間にある要素を変更グループ(change group)と呼び、それぞれの変更グループは通常1つのキーボードコマンドに対応するとともに、undoコマンドは通常はグループを1つの単位として全体をundoを行う。

Function: undo-boundary

この関数はundoリスト内に境界を配置する。このような境界ごとにundoコマンドは停止して、連続するundoコマンドは、より以前の境界へとundoを行っていく。この関数はnilをリターンする。

エディターコマンドループは、各キーシーケンス実行の直前に、1つのundoごとに通常は1つのコマンドがundoされるよう、自動的にundo-boundaryを呼び出す。例外として、入力文字の自己挿入を引き起こすコマンドself-insert-command(Commands for Insertionを参照)は、コマンドループにより挿入された境界を削除するかもしれない。そのような自己挿入文字の1つ目の境界は許容されるが、後続する19個の自己挿入する入力文字は境界をもたず、20個目の自己挿入文字は境界をもつ。そして、自己挿入文字が続くかぎり、これが繰り返される。したがって、連続する文字挿入シーケンスは、グループとしてundoすることが可能である。

他のバッファーに行われたundo可能な以前の変更が何であれ、すべてのバッファー変更は境界を追加する。これは各バッファー内で変更を行なった箇所で、すべてのコマンドが境界を作成することを保証する。

この関数を明示的に呼び出すことは、あるコマンドの効果を複数単位に分割するために有用である。たとえばquery-replaceはユーザーが個別に置換をundoできるように、それぞれの置換後にundo-boundaryを呼び出している。

Variable: undo-in-progress

この変数は通常はnilだが、undoコマンドはこれをtにバインドする。これによりさまざまな種類の変更フックがundoにより呼び出された際に、それを告げることが可能になる。

Function: primitive-undo count list

これはundoリストの要素のundoにたいする基本的な関数。これはlistの最初のcount要素をundoしてlistの残りをリターンする。

primitive-undoはバッファー変更時に、そのバッファーのundoリストに要素を追加する。undoコマンドは混乱を避けるためにundo操作シーケンス冒頭にundoリストの値を保存する。その後でundo操作は保存された値の使用と更新を行う。undoにより追加された新たな要素はこの保存値の一部でないので継続するundoと干渉しない。

この関数はundo-in-progressをバインドしない。