次: Defining Commands, 前: Command Loop, 上: Command Loop
コマンドループがまず始めに行うことはキー列、
つまり、コマンドへ変換されるイベント列を読むことです。
これには関数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)。
エディタコマンドループは、各コマンドのまえにこのノーマルフックを実行する。 その際、
this-commandにはこれから実行するコマンドが保持され、last-commandには直前のコマンドがある。 see Hooks。
エディタコマンドループは、 (中断やエラーのために完了しなかったコマンドを含めて) 各コマンドのあとにこのノーマルフックを実行する。 初めてコマンドループに入ったときにも実行する。 その際、
this-commandには実行し終えたばかりのコマンドがあり、last-commandにはその前のコマンドがある。 see Hooks。
pre-command-hookやpost-command-hookの実行中は、
中断を禁止します。
これらのフックの1つを実行中にエラーが起きると、
エラーの無限ループを防ぐために、
フックの実行を終了しフック変数をnilにします。