コマンドループが最初に行わなければならないのはキーシーケンスの読み取りです。キーシーケンスはコマンドに変換される入力イベントのシーケンスです。これは関数read-key-sequence
を呼び出すことによって行われます。Lispプログラムもこの関数を呼び出すことができます(キーシーケンス入力を参照)。これらはより低レベルのread-key
やread-event
(単一イベントの読み取り)で入力を読み取ったり、discard-input
(その他のイベント入力の機能を参照)で保留中の入力を無視することもできます。
キーシーケンスはカレントでアクティブなキーマップを通じてコマンドに変換されます。これが行われる方法についてはキーの照合を参照してください。結果はキーボードマクロかインタラクティブに呼び出し可能な関数になります。キーがM-xなら他のコマンドの名前を読み取って、それを呼び出します。これはコマンドexecute-extended-command
(インタラクティブな呼び出しを参照)により行われます。
コマンドの実行に先立ち、Emacsはアンドゥ境界(undo
boundary)を作成するためにundo-boundary
を実行します。アンドゥリストの保守を参照してください。
コマンドを実行するために、Emacsはまずcommand-execute
を呼び出してコマンドの引数を読み取ります(インタラクティブな呼び出しを参照)。Lispで記述されたコマンドについては、interactive
指定で引数を読み取る方法を指定します。これはプレフィクス引数(プレフィクスコマンド引数を参照)を使用したり、ミニバッファー内(ミニバッファーを参照)で確認を求めて読み取りを行うかもしれません。たとえばコマンドfind-file
にはinteractive
指定があり、これはミニバッファーを使用してファイル名を読み取ることを指定します。find-file
の関数bodyはミニバッファーを使用しないので、Lispコードから関数としてfind-file
を呼び出す場合には、通常のLisp関数引数としてファイル名を文字列で与えなければなりません。
コマンドがキーボードマクロ(文字列やベクター)なら、Emacsはexecute-kbd-macro
を使用してそれを実行します(キーボードマクロを参照)。
このノーマルフックはコマンドを実行する前に、エディターコマンドループにより実行される。その際、this-command
には実行しようとするコマンドが含まれ、last-command
には前のコマンドが記述される。コマンドループからの情報を参照のこと。
このノーマルフックはコマンドを実行した後(quitやエラーにより早期に終了させられたコマンドを含む)に、エディターコマンドループにより実行される。その際、this-command
は正に実行されたコマンド、last-command
は前に実行されたコマンドを参照する。
このフックはEmacsが最初にコマンドループにエンターしたときにも実行される(その時点ではthis-command
とlast-command
はいずれもnil
)。
pre-command-hook
とpost-command-hook
の実行中は、quitは抑制されます。これらのフックのいずれかを実行中にエラーが発生しても、そのエラーはフックの実行を終了させません。そのかわりにエラーは黙殺されて、エラーが発生した関数はそのフックから取り除かれます。
Emacsサーバー(Emacs Server in The GNU Emacs Manualを参照)に届くリクエストは、キーボードコマンドが行うのと同じように、これらの2つのフックを実行します。