再帰編集(recursive
edit)とは、あるEmacsコマンドの途中で、別のEmacsコマンドを使用して自由に編集を行なうような状況を指します。たとえばquery-replace
の途中でC-rをタイプすると、カレントバッファーを変更することができる再帰編集に入ります。再帰編集から抜けると、query-replace
に戻ります。問い合わせつき置換を参照してください。
再帰編集を抜ける(exit)とは、実行を継続中の、終了していないコマンドに戻ることを意味します。再帰編集を抜けるコマンドはC-M-c
(exit-recursive-edit
)です。
再帰編集を中断(abort)することもできます。これはexitと似ていますが、終了していないコマンドも即座に終了します。これを行なうには、コマンドC-]
(abort-recursive-edit
)を使用します。中止と中断を参照してください
モードラインで常にメジャーモードとマイナーモードの周りを囲む丸カッコ(parentheses)を、さらに角カッコ(square brackets)で囲んで表示することにより、再帰編集中であることが示されます。再帰編集は特定のウィンドウやバッファーにたいするものではなく、Emacs全体が再帰編集中であるため、すべてのウィンドウのモードラインは同じように表示されます。
再帰編集中に、さらに再帰編集に入ることも可能です。たとえばquery-replace
の途中でC-rとタイプした後、デバッガーに入るコマンドをタイプしたとします。これはC-rにたいする再帰編集レベルから、デバッガーにたいする再帰編集を開始します。モードラインには、現在進行中の再帰編集レベルが角カッコのペアで表示されます。
(デバッガーでのcコマンドのように)内側の再帰編集を抜けると、次に上のレベルのコマンドの実行が再開されます。コマンドが終了したら、他の再帰編集レベルに抜けるためにC-M-cを使用することができます。exitは最内レベルだけに適用されます。abortも1レベルの再帰編集だけを抜けて、前の再帰編集レベルのコマンドに即座に戻ります。もし望むなら次の再帰編集レベルもabortできます。
かわりにコマンドM-x top-levelは、すべてのレベルの再帰編集をabortして、即座にトップレベルのコマンドリーダーに戻ります。ミニバッファーがアクティブなときは、ミニバッファーも抜けます。
再帰編集の中で編集されるテキストは、トップレベルで編集しているテキストと同じである必要はありません。これは、何にたいしての再帰編集かに依存します。再帰編集を呼び出したコマンドが最初に別のバッファーを選択する場合、そのバッファーが再帰編集を行なうバッファーになります。どんな場合でも再帰編集中に、(バッファーを切り替えるキーがリバインドされていないかぎり)通常の方法でバッファーを切り替えることができます。再帰編集の中で、ファイルをvisitしたりその他のことを行ない、残りのすべての編集を行なうことも、おそらく可能です。しかしこれは、(スタックオーバーフローのような)驚くべき効果をもたらすことがあります。そのため必要なくなったときは、再帰編集をexitまたはabortすることを忘れないでください。
一般的に、わたしたちはGNU Emacsでは再帰編集レベルを最小限にしようと努めています。これは、特定の順 — 最内のレベルからトップレベルに向かって — で戻ることをあなたに強いるからです。可能な場合は、異なる作業には別のバッファーを供し、それらを切り替えられるようにします。いくつかのコマンドは、元のメジャーモードに戻るコマンドを提供する、新しいメジャーモードに切り替えます。これらの試みは、あなたの選択にしたがい、まだ終了していないタスクにもどる、柔軟性を与えます。