GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Command-Overview.html ・ emacs-doc.conao3.com

22.1 コマンドループの概要

コマンドループが最初に行うべきことは、コマンドに変換される入力イベントのシーケンスであるキーシーケンスを読み取ることです。これは、関数 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 を用いてそれを実行します(キーボードマクロを参照)。

変数: pre-command-hook

この通常のフックは、エディタのコマンドループによって各コマンドが実行される前に呼び出されます。このとき、this-command には実行直前のコマンドが、last-command には直前のコマンドが格納されています。コマンドループからの情報を参照してください。

変数: post-command-hook

この通常のフックは、エディタのコマンドループが各コマンド(終了やエラーによって途中で中断されたコマンドを含む)を実行した後に呼び出されます。このとき、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ラベルが付与され、バッファはポイント周辺の範囲に狭められます。