元に戻すコマンドは、バッファのテキストに対する直近の変更を取り消します。各バッファは変更内容を個別に記録しており、元に戻すコマンドは常に現在のバッファに適用されます。バッファの記録がある限り、過去のすべての変更を取り消すことができます。通常、各編集コマンドは元に戻す記録に個別のエントリを作成しますが、query-replaceなどの一部のコマンドは、取り消しの柔軟性を高めるために変更を複数のエントリに分割します。連続した文字挿入コマンドは、取り消しの手間を軽減するため、通常は単一の元に戻す記録にまとめられます。
現在のバッファのアンドゥ記録 (undo) から1件アンドゥします。
元に戻す操作を開始するには、C-/(またはそのエイリアスであるC-_やC-x u)を入力してください8。これにより、バッファ内の直近の変更が取り消され、ポイントがその変更前の位置に戻ります。C-/(またはそのエイリアス)を繰り返し入力すると、現在のバッファにおけるより古い変更が次々と取り消されます。記録されたすべての変更がすでに取り消されている場合、undoコマンドはエラーを通知します。
アンドゥコマンド以外のコマンドを実行すると、アンドゥコマンドのシーケンスが途切れます。その瞬間から、直前に行ったアンドゥコマンドのシーケンス全体が、そのままアンドゥレコードに記録されます。したがって、アンドゥした変更を再適用するには、C-f またはアンドゥシーケンスを安全に中断できるその他のコマンドを入力し、その後 C-/ を1回以上入力して、一部のアンドゥコマンドを元に戻してください。
あるいは、以前の元に戻すコマンドをやり直さずに、元に戻す操作を再開したい場合は、M-x undo-only
を使用してください。これは undo
と同様ですが、直前に元に戻した変更をやり直すことはありません。これを補完するものとして、M-x
undo-redo は以前の元に戻すコマンドを元に戻します(また、自身を元に戻せるコマンドとして記録しません)。
バッファが誤って変更されたことに気づいた場合、最も簡単な復元方法は、モードラインの先頭から星印が消えるまで C-/ を繰り返し入力することです(モードライン を参照)。アンドゥコマンドによってモードラインから星印が消えるたびに、バッファの内容がファイルを最後に読み込んだ際、あるいは保存した際の状態と同じになったことを意味します。意図的にバッファを変更したかどうか記憶にない場合は、C-/ を1回入力してください。直前の変更がアンドゥされると、それが意図的な変更であったかどうかが分かります。誤って変更した場合は、そのままアンドゥされた状態にしておいてください。意図的に変更した場合は、前述の手順で変更をやり直してください。
あるいは、バッファが最後に参照または保存されて以降の変更をすべて M-x revert-buffer で破棄することもできます(バッファの復元を参照)。
アクティブ領域がある場合、undo を使用すると 選択的アンドゥ
が実行されます。つまり、バッファ全体ではなく、領域内における直近の変更が取り消されます。ただし、一時マークモードがオフの場合(一時マークモードの無効化を参照)、C-/ は常に領域を無視してバッファ全体で動作します。この場合、undo コマンドにプレフィックス引数を指定することで、選択的アンドゥを実行できます:C-u C-/。同じ領域内のさらなる変更を取り消すには、undo
コマンドを繰り返し実行してください(プレフィックス引数は不要です)。
一部の特殊なバッファは、元に戻す記録を作成しません。名前がスペースで始まるバッファは決して記録を作成しません。これらのバッファは、ユーザーが通常目にしたり編集したりすることのないテキストを保持するために、Emacs内部で使用されています。
バッファのアンドゥ情報が大きくなりすぎると、Emacsは適宜(ガベージコレクションの際に)最も古いレコードを破棄します。変数 undo-limit、undo-strong-limit、undo-outer-limit
を設定することで、保持するアンドゥ情報の量を指定できます。これらの値はバイト単位で指定します。
変数 undo-limit は緩やかな制限を設けます。Emacs
は、このサイズに達し、場合によってはそれを超えるのに十分な数のコマンドのアンドゥデータを保持しますが、それ以前のコマンドのデータは保持しません。デフォルト値は
160000 です。変数 undo-strong-limit
はより厳格な制限を設けます。サイズをこの値以上に増加させた過去のコマンド(直近のものを除く)は破棄されます。undo-strong-limit のデフォルト値は 240000 です。
これらの変数の値にかかわらず、直近の変更は undo-outer-limit(通常は
24,000,000)を超えるまで破棄されることはありません。その時点になると、Emacs
はアンドゥデータを破棄し、その旨を警告します。直近のコマンドをアンドゥできないのは、この場合のみです。もしこのような状況になった場合は、undo-outer-limit
の値を大きくすることで、今後同様のことが起こる可能性をさらに低くできます。ただし、そのコマンドがこれほど大量のアンドゥデータを生成すると想定していなかったのであれば、それはおそらくバグであり、報告してください。バグの報告を参照してください。
C-/ のほか、undo コマンドも C-x u に割り当てられています。その方が初心者にとっても覚えやすいためです。‘u’ は “undo” を意味します。また、一部のテキストターミナルでは
C-/ と入力すると実際には C-_
が入力されるため、C-_ にも割り当てられています。