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


20.1 Command Loop Overview

コマンドループが最初に行わなければならないのはキーシーケンスの読み取りです。キーシーケンスほコマンドに変換される入力イベントのシーケンスです。これは関数read-key-sequenceを呼び出すことにより行われます。Lispプログラムもこの関数を呼び出すことができます(Key Sequence Inputを参照)。これらはより低レベルのread-keyread-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を参照)。

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-hookおよびpost-command-hookの実行中、quitは抑制されます。これらのフックのどれか1つを実行中にエラーが発生した場合、そのエラーはフックの実行を終了させません。そのかわりにエラーは黙殺され、エラーが発生した関数はそのフックから取り除かれます。

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