Next: Distinguish Interactive, Previous: Defining Commands, Up: Command Loop [Contents][Index]
コマンドループはキーシーケンスをコマンドに翻訳した後、関数command-execute
を使用してその関数を呼び出します。そのコマンドが関数の場合、command-execute
は引数を読み取りコマンドを呼び出すcall-interactively
を呼び出します。自分でこれらの関数を呼び出すこともできます。
このコンテキストにおいて用語“command”はインタラクティブにコール可能な関数(または関数likeなオブジェクト)やキーボードマクロを指すことに注意してください。つまりコマンドを呼び出すキーシーケンスのことではありません(Keymapsを参照)。
この関数はobjectがコマンドの場合はt
、それ以外はnil
をリターンする。
コマンドには文字列とベクター(キーボードマクロとして扱われる)、トップレベルinteractive
フォーム(Using Interactiveを参照)を含むラムダ式、そのようなラムダ式から作成されたバイトコンパイル関数オブジェクト、interactiveとして宣言(autoload
の4つ目の引数が非nil
)されたautoloadオブジェクト、およびいくつかのプリミティブ関数が含まれる。interactive-form
プロパティが非nil
のシンボル、および関数定義がcommandp
を満足するシンボルもコマンドとされる。
for-call-interactivelyが非nil
の場合は、call-interactively
が呼び出すことができるオブジェクトにたいしてのみcommandp
はt
をリターンする。したがってキーボードマクロは該当しなくなる。
commandp
を使用する現実的な例は、Accessing Documentation内のdocumentation
を参照のこと。
この関数はinteractive呼び出し仕様にしたがって引数を取得し、インタラクティブに呼び出し可能な関数commandを呼び出す。これはcommandがリターンするものが何であれ、それをリターンする。
たとえば、もし以下の署名をもつ関数がある場合:
(defun foo (begin end) (interactive "r") ...)
以下を行うと
(call-interactively 'foo)
これはリージョン(point
とmark
)を引数としてfoo
を呼び出すだろう。
commandが関数でない、またはインタラクティブに呼び出せない(コマンドでない)場合は、エラーをシグナルする。たとえコマンドだとしても、キーボードマクロ(文字列かベクター)は、関数ではないので、許されないことに注意。commandがシンボルの場合、call-interactively
はそれの関数定義を使用する。
record-flagが非nil
の場合は、このコマンドとコマンドの引数は無条件にリストcommand-history
に追加される。それ以外では、引数の読み取りにミニバッファーを使用した場合のみコマンドが追加される。Command Historyを参照のこと。
引数keysが与えられた場合、それはコマンドを呼び出すためにどのイベントを使用するかコマンドが問い合わせた場合に与えるべき、イベントシーケンスを指定するベクターである。keysがnil
、または省略された場合のデフォルトは、this-command-keys-vector
のリターン値である。Definition of this-command-keys-vectorを参照のこと。
この関数はcommandを実行する。引数commandは述語commandp
を満足しなければならない。つまりインタラクティブに呼び出し可能な関数かキーボードマクロでなければならない。
commandが文字列かベクターの場合は、execute-kbd-macro
により実行される。関数はrecord-flagおよびkeys引数とともにcall-interactively
に渡される(上記参照)。
commandがシンボルの場合、その位置にシンボルの関数定義が使用される。autoload
定義のあるシンボルは、インタラクティブに呼び出し可能な関数お意味するよう宣言されている場合は、コマンドとして判断される。そのような宣言は、指定されたライブラリーのロードと、シンボル定義の再チェックにより処理される。
引数specialが与えられた場合、それはプレフィクス引数を無視して、それをクリアーしないという意味である。これはスペシャルイベント(Special Eventsを参照)を実行する場合に使用される。
この関数はcompleting-read
(Completionを参照)を使用して、ミニバッファーからコマンド名を読み取る。その後、指定されたコマンドを呼び出すためにcommand-execute
を使用する。そのコマンドがリターンするのが何であれ、それがexecute-extended-command
の値となる。
そのコマンドがプレフィクス引数を求める場合は、prefix-argumentのの値を受け取る。execute-extended-command
がインタラクティブに呼び出された場合は、カレントのrawプレフィクス引数がprefix-argumentに使用され、それが何であれ実行するコマンドに渡される。
通常、execute-extended-command
はM-xの定義なので、プロンプトとして文字列‘M-x ’を使用する(execute-extended-command
を呼び出したイベントからプロンプトを受け取るほうが良いのだろうが、実装は骨が折れる)。プレフィクス引数の値の説明が、もしあれば、それもプロンプトの一部となる。
(execute-extended-command 3) ---------- Buffer: Minibuffer ---------- 3 M-x forward-word RET ---------- Buffer: Minibuffer ---------- ⇒ t