Next: , Up: Fixit   [Contents][Index]


16.1 Undo(取り消し)

undo(取り消し)コマンドは、バッファーのテキストにたいする最後の変更を無効にします。バッファーはそれぞれ変更を個別に記録しており、undoコマンドは常にカレントバッファーに適用されます。バッファーのレコードにより、バッファーにたいするすべての変更をundoできます。通常、個々の変種コマンドは、undoレコードに個別のエントリーを作成しますが、query-replaceのようないくつかのコマンドは、undo操作に柔軟性をもたせるために、コマンドによる変更を複数のエントリーに分割します。連続した文字の挿入コマンドは、undo操作の冗長性をなくすために、通常1つのundoレコードにまとめられます。

C-/
C-x u
C-_

カレントバッファーのundoレコードの、1エントリーでundoします(undo)。

undoを開始するには、C-/(またはエイリアスのC-_C-x u)をタイプします6。これは一番最近のバッファーにたいする変更を取り消して、バッファーが変更される前の位置にポイントを戻します。連続してC-/(またはそれのエイリアス)を繰り返すと、現在のバッファーにたいする変更を、前へ前へとさかのぼって取り消します。すでに記録されている変更がすべて取り消されているとき、undoコマンドはエラーをシグナルします。

undo以外のコマンドは、undoコマンドの順序性を損ないます。undo以外のコマンドを開始した時点から、undoしてきた一連のundoコマンド全体が、1つの変更としてundoレコードとして記録されます。したがってundoした変更を再適用するには、undoの順序性を損なわないようなC-fのようなコマンドをタイプしてから、C-/でundoコマンドをundoします。

以前のundoコマンドを再実行せずにundoを再開したいときは、かわりにM-x undo-onlyを使います。これはundoと同様ですが、すでにundoした変更を再実行しません。

バッファーをうっかり変更してしまったのに気付いたら、モードラインのアスタリスクが表示されなくなるまでC-/を繰り返しタイプするのが、もっとも簡単な復旧方法です。undoコマンドによりモードラインのアスタリスクが消えたとき、それはバッファーの内容がファイルを最後に読み込んだとき、または保存したときと同じ内容だということを意味します。バッファーを意図して変更したか覚えていないときは、C-/を1回タイプします。最後の変更がundoされたのを確認して、それが意図した変更なのか確かめます。もしそれが意図しない変更だったならundoしたままにします。意図した変更だった場合、上で説明した方法で変更を再実行します。

アクティブなリージョンがあるとき、undo選択的なundo(selective undo)を行います。これはバッファー全体ではなく、リージョンにたいして一番最近の変更をundoします。しかしTransient Markモードがオフのとき(Disabled Transient Markを参照してください)、C-/は、リージョンではなく、常にバッファー全体を操作します。この場合undoコマンドにプレフィクス引数を指定(C-u C-/)することにより、選択的なundoができます。同じリージョンにたいしてさらに変更をundoしたいときは、undoコマンドを繰り返します(プレフィクス引数は必要ありません)。

undoレコードを作らない、特別なバッファーがいくつかあります。それは名前がスペースで始まるバッファーです。これらのバッファーはEmacsにより内部的に使用されており、通常ユーザーが閲覧したり編集しないテキストを保持します。

バッファーにたいするundo情報が大きくなりすぎたとき、Emacsは一番古いレコードを、時々(ガベージコレクション(garbage collection)の間)廃棄します。変数undo-limitundo-strong-limitundo-outer-limitをセットすることにより、どれだけのundo情報を保持するか指定することができます。これらの値はバイト数で指定します。

変数undo-limitは、ソフトリミットをセットします。Emacsはこのサイズに達するまでのコマンドのundoデータを保持します。制限を超えることもあり得ますが、これを超える古いデータは保持しません。デフォルト値は80000です。変数undo-strong-limitは、厳密なリミット(stricter limit)をセットします。この制限を超えるような以前のコマンド(一番最近のコマンドではない)は記憶されません。undo-strong-limitのデフォルト値は120000です。

これらの変数の値にかかわらず、一番最近の変更はundo情報がundo-outer-limit(通常は12,000,000)より大きくならない限り、廃棄されることはありません。もしこれを超えるような場合、Emacsはundoデータを廃棄して、それにたいする警告を発します。これは一番最近のコマンドをundoできない唯一の状況です。これが発生した場合、将来同じことが起こらないようにundo-outer-limitの値を増やすことができます。しかしコマンドがそのような大きなundoデータを作るとは考えられない場合、それは多分バグなので、それを報告すべきです。Reporting Bugsを参照してください。


Footnotes

(6)

C-/以外に、undoコマンドはC-x uにもバインドされています。なぜならこれは初心者が記憶するのが簡単だからです。‘u’は“undo”に由来しています。このコマンドはC-_にもバインドされています。なぜならいくつかのテキスト端末では、C-/とタイプすることにより、C-_が入力されるからです。