undo(取り消し)コマンドは、バッファーのテキストにたいする最後の変更を無効にします。バッファーはそれぞれ変更を個別に記録しており、undoコマンドは常にカレントバッファーに適用されます。バッファーのレコードにより、バッファーにたいするすべての変更をundoできます。通常、個々の変種コマンドは、undoレコードに個別のエントリーを作成しますが、query-replace
のようないくつかのコマンドは、undo操作に柔軟性をもたせるために、コマンドによる変更を複数のエントリーに分割します。連続した文字の挿入コマンドは、undo操作の冗長性をなくすために、通常1つのundoレコードにまとめられます。
カレントバッファーの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-limit
、undo-strong-limit
、undo-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を参照してください。
C-/以外に、undo
コマンドはC-x
uにもバインドされています。なぜならこれは初心者が記憶するのが簡単だからです。‘u’は“undo”に由来しています。このコマンドはC-_にもバインドされています。なぜならいくつかのテキスト端末では、C-/とタイプすることにより、C-_が入力されるからです。