次: 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
にします。