Next: , Up: Command Loop   [Contents][Index]


20.1 コマンドループの概要

コマンドループが最初に行わなければならないのはキーシーケンスの読み取りです。キーシーケンスはコマンドに変換される入力イベントのシーケンスです。これは関数read-key-sequenceを呼び出すことによって行われます。Lispプログラムもこの関数を呼び出すことができます(Key Sequence Inputを参照)。これらはより低レベルのread-keyread-event (Reading One Event)で入力を読み取ったり、discard-input (Event Input Miscを参照)で保留中の入力を無視することもできます。

キーシーケンスはカレントでアクティブなキーマップを通じてコマンドに変換されます。これが行われる方法についてはKey Lookupを参照してください。結果はキーボードマクロかインタラクティブに呼び出し可能な関数になります。キーがM-xなら他のコマンドの名前を読み取って、それを呼び出します。これはコマンドexecute-extended-command (Interactive Callを参照)により行われます。

コマンドの実行に先立ち、Emacsはアンドゥ境界(undo boundary)を作成するためにundo-boundaryを実行します。Maintaining Undoを参照してください。

コマンドを実行するために、Emacsはまずcommand-executeを呼び出してコマンドの引数を読み取ります(Interactive Callを参照)。Lispで記述されたコマンドについては、interactive指定で引数を読み取る方法を指定します。これはプレフィクス引数(Prefix Command Argumentsを参照)を使用したり、ミニバッファー内(Minibuffersを参照)で確認を求めて読み取りを行うかもしれません。たとえばコマンドfind-fileにはinteractive指定があり、これはミニバッファーを使用してファイル名を読み取ることを指定します。find-fileの関数bodyはミニバッファーを使用しないので、Lispコードから関数としてfind-fileを呼び出す場合には、通常のLisp関数引数としてファイル名を文字列で与えなければなりません。

コマンドがキーボードマクロ(文字列やベクター)なら、Emacsはexecute-kbd-macroを使用してそれを実行します(Keyboard Macrosを参照)。

Variable: pre-command-hook

このノーマルフックはコマンドを実行する前に、エディターコマンドループにより実行される。その際、this-commandには実行しようとするコマンドが含まれ、last-commandには前のコマンドが記述される。Command Loop Infoを参照のこと。

Variable: post-command-hook

このノーマルフックはコマンドを実行した後(quitやエラーにより早期に終了させられたコマンドを含む)に、エディターコマンドループにより実行される。その際、this-commandは正に実行されたコマンド、last-commandは前に実行されたコマンドを参照する。

このフックはEmacsが最初にコマンドループにエンターしたときにも実行される(その時点ではthis-commandlast-commandはいずれもnil)。

pre-command-hookpost-command-hookの実行中は、quitは抑制されます。これらのフックのいずれかを実行中にエラーが発生しても、そのエラーはフックの実行を終了させません。そのかわりにエラーは黙殺されて、エラーが発生した関数はそのフックから取り除かれます。

Emacsサーバー(Emacs Server in The GNU Emacs Manualを参照)に届くリクエストは、キーボードコマンドが行うのと同じように、これらの2つのフックを実行します。