コマンドループが最初に行うべきことは、コマンドに変換される入力イベントのシーケンスであるキーシーケンスを読み取ることです。これは、関数 read-key-sequence
を呼び出すことで行われます。Lispプログラムでもこの関数を呼び出すことができます(キーシーケンス入力を参照)。また、read-key や read-event
を用いてより低いレベルで入力を読み取ったり(単一イベントの読み取りを参照)、discard-input を用いて保留中の入力を破棄したりすることも可能です(イベント入力のその他の機能を参照)。
キーシーケンスは、現在有効なキーマップを通じてコマンドに変換されます。その仕組みについては、キールックアップを参照してください。結果として、キーボードマクロまたはインタラクティブに呼び出し可能な関数が生成されます。キーがM-xの場合、別のコマンド名を読み取り、そのコマンドを呼び出します。これはexecute-extended-commandコマンドによって行われます(インタラクティブ呼び出しを参照)。
コマンドを実行する前に、Emacsはundo-boundaryを実行してアンドゥ境界を作成します。アンドゥリストの管理を参照してください。
コマンドを実行する際、Emacsはまず command-execute
を呼び出してその引数を読み込みます(インタラクティブ呼び出しを参照)。Lispで記述されたコマンドの場合、interactive の仕様で引数の読み込み方法が規定されています。これにはプレフィックス引数(プレフィックスコマンド引数を参照)を使用する場合や、ミニバッファでのプロンプティングによって読み込む場合(ミニバッファを参照)があります。例えば、コマンド find-file の interactive
仕様では、ミニバッファを使用してファイル名を読み込むよう規定されています。find-file
の関数本体ではミニバッファを使用しないため、Lispコードから関数として find-file
を呼び出す場合は、ファイル名の文字列を通常のLisp関数引数として渡す必要があります。
コマンドがキーボードマクロ(すなわち文字列またはベクトル)である場合、Emacs は execute-kbd-macro を用いてそれを実行します(キーボードマクロを参照)。
この通常のフックは、エディタのコマンドループによって各コマンドが実行される前に呼び出されます。このとき、this-command には実行直前のコマンドが、last-command には直前のコマンドが格納されています。コマンドループからの情報を参照してください。
この通常のフックは、エディタのコマンドループが各コマンド(終了やエラーによって途中で中断されたコマンドを含む)を実行した後に呼び出されます。このとき、this-commandは直前に実行されたコマンドを、last-commandはその前のコマンドを指します。
このフックは、Emacsが最初にコマンドループに入った際にも実行されます(この時点では this-command と last-command
はともに nil となります)。
pre-command-hook および post-command-hook
の実行中は、終了処理が抑制されます。これらのフックのいずれかの実行中にエラーが発生しても、フックの実行は終了せず、代わりにエラーは抑制され、エラーが発生した関数はフックから削除されます。
Emacsサーバーに届くリクエスト(The GNU Emacs ManualのEmacs Serverを参照)は、キーボードコマンドと同様に、これら2つのフックを実行します。
なお、バッファテキストに非常に長い行が含まれている場合、これら2つのフックは、with-restriction形式(Narrowingを参照)であるかのように呼び出され、long-line-optimizations-in-command-hooksラベルが付与され、バッファはポイント周辺の範囲に狭められます。