Next: Defining Commands, Up: Command Loop [Contents][Index]
コマンドループが最初に行わなければならないのはキーシーケンスの読み取りです。キーシーケンスほコマンドに変換される入力イベントのシーケンスです。これは関数read-key-sequence
を呼び出すことにより行われます。Lispプログラムもこの関数を呼び出すことができます(Key Sequence Inputを参照)。これらはより低レベルのread-key
やread-event
(Reading One Event)で入力を読み取ったり、discard-input
(Event Input Miscを参照)で保留中の入力を無視することもできます。
キーシーケンスはカレントでアクティブなキーマップを通じてコマンドに変換されます。これが行われる方法については、See 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を参照)。
このノーマルフックはコマンドを実行する前に、エディターコマンドループにより実行される。その際、this-command
には実行しようとするコマンドが含まれ、last-command
には前のコマンドが記述される。Command Loop Infoを参照のこと。
このノーマルフックはコマンドを実行した後(quitやエラーにより早期に終了させられたコマンドを含む)に、エディターコマンドループにより実行される。その際、this-command
は正に実行されたコマンドを参照し、last-command
は前に実行されたコマンドを参照する。
このフックはEmacsが最初にコマンドループにエンターしたときにも実行される(その時点ではthis-command
とlast-command
はどちらもnil
)。
pre-command-hook
およびpost-command-hook
の実行中、quitは抑制されます。これらのフックのどれか1つを実行中にエラーが発生した場合、そのエラーはフックの実行を終了させません。そのかわりにエラーは黙殺され、エラーが発生した関数はそのフックから取り除かれます。
Emacsサーバー(Emacs Server in The GNU Emacs Manualを参照)に届くリクエストは、キーボードコマンドが行うのと同じように、これらの2つのフックを実行します。