プログラム中から(Emacs の)コマンドループを呼ぶことができます。 (これにより) ユーザーは、コマンドループを呼んだプログラムに戻る前に、(任意の)エディティング を行なうことができます。以下に示す変数及び関数は、リカーシブエディットの呼ばれ うる回数に関する制限とリカーシブエディットへのエントリー及び exit を制御しま す。
recursive-edit は、スタック上に exit という名前のタグを設定します。リカーシ ブエディットを exit する際、これに対し throw を行なうことができます(セクシ ョン12.6 [throw]、ページ 104 参照)。 non-nil 値を throw すると recursive-edit はエラーを出します (どの??)。 exit-recursive-edit, abort-recursive-edit, top-levelを呼んで recursive-edit を exit することもで きます。
recursive-edit の exit のしかたにはよらず、 unwind フォーム unwind-protect が 評価されます。
Command: recursive-edit
この関数は、エディターのコマンドループをリカーシブ(訳注:再帰的)に起動しま す。 (これにより)ユーザーは、関数の中で(その関数の実行を中断し)エディティ ングを行なうことができます。
この関数は、(エディターの初期化で)トップレベルのエディティングを開始するの に呼ばれます。
次の例において、関数 simple-rec は、(最初)ポイントを 1 word 進め、その後リ カーシブエディットに入りエコーエリアにメッセージを出力します。ユーザーは望 むままにエディティングを行なうことができます。リカーシブエディットを exit すると(通常 ESC C-c が exit-recursive-edit にバインドされます)、この関数は ポイントを(また) 1 word 先に進めます。
(defun simple-rec () (forward-word 1)
(message "Recursive edit in progress.") (recursive-edit) (forward-word 1)) => simple-rec (simple-rec) => nil
Command: exit-recursive-edit
この関数は、1 番内部のリカーシブエディトかミニバッファから exit します。こ の定義は、(nil の値を持って) throw を呼び出します。
Command: abort-recursive-edit
この関数は、リカーシブエディットもしくはミニバッファ入力を要求したコマンド をアボートし、エラーを出し(訳注:signal)ます。
Command: top-level
この関数は、リカーシブエディットレベルを(全て) exit します。これは(本質的 に)全ての計算から完全に飛び出し (直接)メインのコマンドループに戻るため、値 は返しません。
Function: recursion-depth
これは、起動されたリカーシブエディットの(カレントの)深さを返します。トップ レベルにおけるコマンドループでは、これは 0 を返します。