再帰編集とは、あるEmacsコマンドの実行途中で
任意のEmacsコマンドを使って編集を行う状況をいいます。
たとえば、query-replace
の途中でC-rを打つと、
再帰編集に入りカレントバッファを自由に変更できます。
再帰編集から抜けると、query-replace
の続きに戻ります。
再帰編集から脱出するとは、
実行途中のコマンドに戻ってその続きを行うことを意味します。
脱出のためのコマンドはC-M-c(exit-recursive-edit
)です。
再帰編集をアボートすることもできます。
これは脱出と似ていますが、実行途中だったコマンドも一緒に中断します。
アボートするには、
C-](abort-recursive-edit
)を使います。
See Quitting。
再帰編集中は、モード行のメジャー/マイナモード名を 囲む丸括弧の外側に中括弧‘[...]’が表示されます。 各ウィンドウのモード行すべてにこのように表示されます。 というのは、特定のウィンドウやバッファではなくEmacs全体が再帰編集に 入っているからです。
再帰編集中にさらに再帰編集に入ることもできます。
たとえば、query-replace
の途中でC-rを打ってから
デバッガを起動するコマンドを打ったとします。
すると、C-rによる再帰編集の中でさらにデバッガのための再帰編集に
入ることになります。
モード行には、現在の再帰編集レベルの数だけ中括弧の対が表示されます。
内側の再帰編集を(たとえばデバッガのコマンドcで)脱出すると、 1つ上のレベルでのコマンドが再開されます。 そのコマンドが終わったところでC-M-cを使うと そのレベルの再帰編集を脱出する、 というようにして再帰編集を終わらせていくことができます。 脱出はつねにもっとも内側のレベルに対して起こります。 また、アボートも1つのレベルの再帰編集から脱出し、 1つまえの再帰編集のコマンドレベルに戻ります。 必要ならそこでつぎの再帰編集レベルをアボートする、 というように続けることができます。
あるいは、 コマンドM-x top-levelですべてのレベルの再帰編集をアボートし、 ただちにトップレベルのコマンド入力に戻ることができます。
再帰編集の中で編集しているテキストは トップレベルで編集しているテキストと同じであるとは限りません。 再帰編集の目的によって変わってきます。 再帰編集を起動するコマンドがまず別のバッファに切り替えるものなら、 そのバッファを再帰的に編集することになるでしょう。 いずれにせよ、再帰編集の内側でも (バッファを切り替えるキーが再定義されていない限り) 通常どおりバッファを切り替えることができます。 残りの編集作業をすべて再帰編集の内側でやってしまい、 別のファイルを訪問したりもできます。 しかしそのようなことをすると、 ときどき(スタックオーバーフローなどの)痛い目に合う可能性があります。 ですから、再帰編集が不要になったら忘れずに脱出かアボートしてください。
一般に、GNU Emacsでは再帰編集レベルを最小限に抑えるように努めています。 というのは、再帰編集では特定の順、つまり、 最内側レベルからトップレベルに向かう順で戻るように強いられるからです。 このため、別の作業は別のバッファでするようにして、 ユーザーがそれらの間を自由に行き来できるようにしています。 たとえば、あるコマンドは新しいメジャーモードに切り替えますが、 もとのモードに戻るコマンドを用意しておきます。 このようにしたほうが、やりかけの作業に戻る順番を自由に選べ、 柔軟性を提供できます。