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コマンド全体が、undoレコードとして記録されます。したがってundoした変更を再適用するには、undoの順序性を損なわないようなC-fのようなコマンドをタイプしてから、C-/を1回以上タイプして、undoコマンドをundoしていきます。
以前のundoコマンドを再実行せずにundoを再開したいときは、かわりにM-x
undo-onlyを使います。これはundo
と同様ですが、すでにundoした変更をredo(再実行)しません。これを補うために、M-x
undo-redoは前のundoコマンドをundoします(そしてそのコマンド自身をアンドゥ可能なコマンドとして記録しない)。
バッファーをうっかり変更してしまったのに気付いたら、モードラインのアスタリスクが表示されなくなるまでC-/を繰り返しタイプするのが、もっとも簡単な復旧方法です。undoコマンドによりモードラインのアスタリスクが消えたとき、それはバッファーの内容がファイルを最後に読み込んだとき、または保存したときと同じ内容だということを意味します。バッファーを意図して変更したか覚えていないときは、C-/を1回タイプします。最後の変更がundoされたのを確認して、それが意図した変更なのか確かめます。もしそれが意図しない変更だったならundoしたままにします。意図した変更だった場合、上で説明した方法で変更を再実行します。
かわりにM-x revert-bufferを使用して、そのバッファーが最後にvisitされたとき、または最後に保存されたとき以降のすべての変更を破棄できます(バッファーのリバートを参照)。
アクティブなリージョンがあるとき、undo
は選択的なundo(selective
undo)を行います。これはバッファー全体ではなく、リージョンにたいして一番最近の変更をundoします。しかしTransient
Markモードがオフのとき(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データを保持します。制限を超えることもあり得ますが、これを超える古いデータは保持しません。デフォルト値は160000です。変数undo-strong-limit
は、厳密なリミット(stricter
limit)をセットします。この制限を超えるような以前のコマンド(一番最近のコマンドではない)は記憶されません。undo-strong-limit
のデフォルト値は240000です。
これらの変数の値にかかわらず、一番最近の変更はundo情報がundo-outer-limit
(通常は24,000,000)より大きくならない限り、廃棄されることはありません。もしこれを超えるような場合、Emacsはundoデータを廃棄して、それにたいする警告を発します。これは一番最近のコマンドをundoできない唯一の状況です。これが発生した場合、将来同じことが起こらないようにundo-outer-limit
の値を増やすことができます。しかしコマンドがそのような大きなundoデータを作るとは考えられない場合、それは多分バグなので、それを報告すべきです。Reporting Bugsを参照してください。
C-/以外に、undo
コマンドはC-x
uにもバインドされています。なぜならこれは初心者が記憶するのが簡単だからです。‘u’は“undo”に由来しています。このコマンドはC-_にもバインドされています。なぜならいくつかのテキスト端末では、C-/とタイプすることにより、C-_が入力されるからです。