Next: , Previous: Erasing, Up: Basic


3.4 変更をアンドゥする(もとに戻す)

バッファのテキストに対する変更は、ある時点まで遡って、 すべてアンドゥ(もとに戻すことが)できます。 各バッファでは個々の変更をそれぞれ記録していて、 アンドゥコマンドは、つねにカレントバッファに作用します。 通常、各編集コマンドはアンドゥ記録に別々の項目を作成しますが、 query-replaceのようなコマンドは一度に多くの項目を作りますし、 自己挿入文字のように非常に単純なコマンドは、 もとに戻すのを単純にするために、まとめられます。

C-x u
一塊の変更をもとに戻す。 普通、1つのコマンドに相当する(undo)。
C-_
同じ。
C-u C-x u
リージョン内で、一塊の変更をもとに戻す。

変更をもとに戻すには、コマンド、C-x uC-_を使います。 始めにこのコマンドを実行すると、直前の変更をもとに戻します。 ポイントは、もとに戻されたコマンドを実行するまえの位置に戻ります。

C-_C-x uを連続して実行すると、 アンドゥ情報の限界に達するまで、 次々に以前の変更をもとに戻していきます。 記録されているすべての変更をもとに戻してしまうと、 アンドゥコマンドはその旨エラーメッセージを表示します。

アンドゥコマンド以外の他のコマンドを実行すると、 アンドゥコマンドの連続実行系列が断ち切られます。 これ以後、これよりまえのアンドゥコマンドの実行自体が、 もとに戻すことが可能な一般の変更として扱われます。 したがって、もとに戻してしまった変更をやはりそのとおりに 変更しておきたい場合には、 C-fと打つか、あるいは、無害なコマンドを実行して アンドゥの連続実行系列を断ち切ってから、さらにアンドゥコマンドを打ちます。

普通のアンドゥは、カレントバッファにおけるすべての変更に作用します。 カレントリージョン内に制限した選択的なアンドゥ(selective undo)を 行うこともできます。 これには、リージョンを設定してから、数引数(値は関係ない)を指定して undoコマンドを、つまり、C-u C-x uC-u C-_を実行します。 これにより、リージョン内のもっとも最近の変更がもとに戻ります。 同じリージョン内の変更をさらにもとに戻すには、 undoコマンドを繰り返します(これには数引数は必要ない)。 暫定マーク(transient-mark)モードでは、 リージョンが活性のときにundoを使うと選択的なアンドゥを行います。 つまり、数引数は必要ありません。

バッファを誤って変更してしまった場合、 もとに戻すもっとも簡単な方法は、モード行の先頭部分から星印が 消えるまでC-_を繰り返し打つことです。 そうすれば、すべての修正を取り消したことになります。 アンドゥコマンドによりモード行から星印が消えた場合はつねに、 バッファの内容がファイルを訪問したときと同じであるか、 最後に保存したときと同じであることを意味します。

意図してバッファを変更したかどうかあやふやなときは、 一度だけC-_を打ちます。 もとに戻すことで最後の変更箇所がわかりますから、 それが意図した変更かどうか判断できるでしょう。 意図した変更でなければ、もとに戻したままにしておきます。 意図した変更であったなら、上記の方法で変更し直します。

すべてのバッファでアンドゥ情報を記録するわけではありません。 空白で始まる名前のバッファでは記録しません。 これらのバッファは、 Emacsやその拡張部分が内部的に使用するもので、 ユーザーが通常見たり編集したりしないテキストを保持しています。

単なるカーソル移動はアンドゥできません。 バッファの内容を変更したときだけアンドゥ情報が保存されます。 ただし、いくつかのカーソル移動コマンドはマークを設定しますから、 これらのコマンドをときどき使えば、 マークリング(see Mark Ring)から取り出しながら、 通ってきたそれぞれの箇所へ戻ることができます。

バッファに関するアンドゥ情報が大きくなると、 Emacsはもっとも古いアンドゥ情報から順に(ガベッジコレクション中に) 破棄していきます。 保持すべきアンドゥ情報の量を指定するには、 2つの変数undo-limitundo-strong-limitを設定します。 これらの変数の値は、保存領域のバイト数です。

変数undo-limitは緩い限界(soft limit)を設定します。 Emacsは、このサイズに達するまでのコマンド分のアンドゥデータを保持します。 データ量がこのサイズを超える場合もありますが、 このデータ量を超えるような古いコマンド分のデータは保持しません。 デフォルトは、20000です。 変数undo-strong-limitは、厳密な限界(stricter limit)を設定します。 この量を超えるデータに対応するコマンドのデータは破棄します。 初期値は30000です。

これらの変数の値に関わらず、最新の変更を破棄することはありませんので、 意図しない大きな変更を加えてしまった直後に ガベッジコレクションが発生しても、 その変更をアンドゥできないというようなことはありません。

アンドゥコマンドを実行するキーがC-x uC-_と2つある理由は、 1文字キーにするほど重要なのですが、どうやってC-_を打つか自明でない キーボードもあるからです。 C-x uは、どの端末でも素直に打てる代替手段なのです。