再帰的編集とは、別のEmacsコマンドの実行中に、Emacsコマンドを用いて任意の編集を行う状態のことです。例えば、query-replace の中で C-r
と入力すると、現在のバッファを変更できる再帰的編集状態に入ります。再帰的編集を抜けると、query-replace に戻ります。クエリ置換を参照してください。
再帰的な編集を終了するとは、未完了のコマンドに戻ることを意味し、そこで実行が継続されます。終了するためのコマンドは C-M-c (exit-recursive-edit) です。
再帰的な編集を中断することもできます。これは終了するのと同様ですが、未完了のコマンドも直ちに終了させます。この操作には C-] (abort-recursive-edit)
コマンドを使用してください。終了と中断を参照してください。
モードラインでは、メジャーモード名とマイナーモード名を常に囲む括弧の周囲に角括弧を表示することで、再帰的な編集状態にあることを知らせます。再帰的な編集状態というのは、特定のウィンドウやバッファではなくEmacs全体に当てはまるため、すべてのウィンドウのモードラインで同様に表示されます。
再帰的な編集の中で、さらに再帰的な編集を行うことが可能です。例えば、query-replace 内で
C-r と入力した後、デバッガに入るコマンドを入力することがあります。これにより、C-r
の再帰的な編集レベルの中で、デバッガ用の再帰的な編集レベルが開始されます。モードラインには、現在進行中の各再帰的な編集レベルについて、一対の角括弧が表示されます。
内部の再帰的編集を終了すると(デバッガの c コマンドなど)、一つ上のレベルで実行中のコマンドが再開されます。そのコマンドが完了すると、C-M-c を使用して別の再帰的編集レベルを終了させることができ、以降も同様に操作できます。終了が適用されるのは最内側のレベルのみです。中断した場合も、再帰的編集の1レベル分だけ抜けることになり、直ちに直前の再帰的編集のコマンドレベルに戻ります。必要に応じて、次の再帰的編集レベルを中断することも可能です。
あるいは、M-x top-level コマンドはすべての階層の再帰的な編集を中断し、直ちに最上位のコマンドリーダーに戻ります。また、ミニバッファがアクティブな場合は、そこからも抜けます。
再帰編集内で編集しているテキストは、トップレベルで編集していたテキストと同じである必要はありません。それは、再帰編集の目的によって異なります。再帰編集を呼び出すコマンドがまず別のバッファを選択した場合、再帰的に編集するのはそのバッファになります。いずれにせよ、再帰編集中でも通常の方法でバッファを切り替えることができます(バッファ切り替えキーが再バインドされていない限り)。ファイルの参照なども含め、それ以外の編集作業はすべて再帰編集内で行うことができるでしょう。しかし、これにより時折、予期せぬ影響(スタックオーバーフローなど)が生じる可能性があります。そのため、再帰編集が不要になった際は、必ず終了または中断するようにしてください。
再帰的な編集を行うと、通常はシングルキーボードモードが有効になります。複数ディスプレイを参照してください。
一般的に、GNU Emacsでは再帰的な編集レベルの使用を最小限に抑えるようにしています。これは、最内層からトップレベルへと、特定の順序で戻らざるを得ないためです。可能な限り、異なる操作を別々のバッファで表示し、自由に切り替えられるようにしています。一部のコマンドは新しいメジャーモードに切り替えますが、そのモードには元のモードに戻るためのコマンドが用意されています。こうした手法により、未完了のタスクへ、任意の順序で戻るための柔軟性が高まります。