Next: , Previous: Command Loop, Up: Command Loop


20.1 コマンドループの概要

コマンドループがまず始めに行うことはキー列、 つまり、コマンドへ変換されるイベント列を読むことです。 これには関数read-key-sequenceを呼び出します。 読者のLispコードでもこの関数を呼び出せます(see Key Sequence Input)。 Lispプログラムでは、read-event(see Reading One Event)で 低レベルの入力を行ったり、 discard-input(see Event Input Misc)で 処理待ち中の入力を破棄できます。

キー列は現在活性なキーマップを介してコマンドに変換されます。 この処理方法についてはSee Key Lookup。 この結果は、キーボードマクロであるか、 対話的に呼び出し可能な関数であるはずです。 キーがM-xであると、別のコマンドの名前を読み取り、 そのコマンドを呼び出します。 これはコマンドexecute-extended-command(see Interactive Call)で 処理されます。

コマンドを実行するには、まず、その引数を読む必要があります。 これは、command-execute(see Interactive Call)を呼び出して 行います。 Lispで書かれたコマンドでは、 interactive指定が引数の読み方を指示します。 前置引数(see Prefix Command Arguments)を使ったり、 プロンプトを表示してミニバッファ(see Minibuffers)から読みます。 たとえば、コマンドfind-fileには、 ミニバッファからファイル名を読むことを指示した interactive指定があります。 コマンドの関数本体ではミニバッファを使いません。 このコマンドをLispコードから関数として呼び出す場合、 通常のLisp関数の引数としてファイル名文字列を指定する必要があります。

コマンドが文字列やベクトル(つまり、キーボードマクロ)である場合、 execute-kbd-macroを用いてそれらを実行します。 読者自身がこの関数を呼び出してもかまいません(see Keyboard Macros)。

動作中のコマンドの実行を止めるには、C-gを打ちます。 この文字は中断(quitting)を引き起こします(see Quitting)。

— Variable: pre-command-hook

エディタコマンドループは、各コマンドのまえにこのノーマルフックを実行する。 その際、this-commandにはこれから実行するコマンドが保持され、 last-commandには直前のコマンドがある。 see Hooks

— Variable: post-command-hook

エディタコマンドループは、 (中断やエラーのために完了しなかったコマンドを含めて) 各コマンドのあとにこのノーマルフックを実行する。 初めてコマンドループに入ったときにも実行する。 その際、this-commandには実行し終えたばかりのコマンドがあり、 last-commandにはその前のコマンドがある。 see Hooks

pre-command-hookpost-command-hookの実行中は、 中断を禁止します。 これらのフックの1つを実行中にエラーが起きると、 エラーの無限ループを防ぐために、 フックの実行を終了しフック変数をnilにします。