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


20.3 Interactive Call

コマンドループはキーシーケンスをコマンドに翻訳した後、関数command-executeを使用してその関数を呼び出します。そのコマンドが関数の場合、command-executeは引数を読み取りコマンドを呼び出すcall-interactivelyを呼び出します。自分でこれらの関数を呼び出すこともできます。

このコンテキストにおいて用語“command”はインタラクティブにコール可能な関数(または関数likeなオブジェクト)やキーボードマクロを指すことに注意してください。つまりコマンドを呼び出すキーシーケンスのことではありません(Keymapsを参照)。

Function: commandp object &optional for-call-interactively

この関数はobjectがコマンドの場合はt、それ以外はnilをリターンする。

コマンドには文字列とベクター(キーボードマクロとして扱われる)、トップレベルinteractiveフォーム(Using Interactiveを参照)を含むラムダ式、そのようなラムダ式から作成されたバイトコンパイル関数オブジェクト、interactiveとして宣言(autoloadの4つ目の引数が非nil)されたautoloadオブジェクト、およびいくつかのプリミティブ関数が含まれる。interactive-formプロパティが非nilのシンボル、および関数定義がcommandpを満足するシンボルもコマンドとされる。

for-call-interactivelyが非nilの場合は、call-interactivelyが呼び出すことができるオブジェクトにたいしてのみcommandptをリターンする。したがってキーボードマクロは該当しなくなる。

commandpを使用する現実的な例は、Accessing Documentation内のdocumentationを参照のこと。

Function: call-interactively command &optional record-flag keys

この関数はinteractive呼び出し仕様にしたがって引数を取得し、インタラクティブに呼び出し可能な関数commandを呼び出す。これはcommandがリターンするものが何であれ、それをリターンする。

たとえば、もし以下の署名をもつ関数がある場合:

(defun foo (begin end)
  (interactive "r")
  ...)

以下を行うと

(call-interactively 'foo)

これはリージョン(pointmark)を引数としてfooを呼び出すだろう。

commandが関数でない、またはインタラクティブに呼び出せない(コマンドでない)場合は、エラーをシグナルする。たとえコマンドだとしても、キーボードマクロ(文字列かベクター)は、関数ではないので、許されないことに注意。commandがシンボルの場合、call-interactivelyはそれの関数定義を使用する。

record-flagが非nilの場合は、このコマンドとコマンドの引数は無条件にリストcommand-historyに追加される。それ以外では、引数の読み取りにミニバッファーを使用した場合のみコマンドが追加される。Command Historyを参照のこと。

引数keysが与えられた場合、それはコマンドを呼び出すためにどのイベントを使用するかコマンドが問い合わせた場合に与えるべき、イベントシーケンスを指定するベクターである。keysnil、または省略された場合のデフォルトは、this-command-keys-vectorのリターン値である。Definition of this-command-keys-vectorを参照のこと。

Function: command-execute command &optional record-flag keys special

この関数はcommandを実行する。引数commandは述語commandpを満足しなければならない。つまりインタラクティブに呼び出し可能な関数かキーボードマクロでなければならない。

commandが文字列かベクターの場合は、execute-kbd-macroにより実行される。関数はrecord-flagおよびkeys引数とともにcall-interactivelyに渡される(上記参照)。

commandがシンボルの場合、その位置にシンボルの関数定義が使用される。autoload定義のあるシンボルは、インタラクティブに呼び出し可能な関数お意味するよう宣言されている場合は、コマンドとして判断される。そのような宣言は、指定されたライブラリーのロードと、シンボル定義の再チェックにより処理される。

引数specialが与えられた場合、それはプレフィクス引数を無視して、それをクリアーしないという意味である。これはスペシャルイベント(Special Eventsを参照)を実行する場合に使用される。

Command: execute-extended-command prefix-argument

この関数はcompleting-read(Completionを参照)を使用して、ミニバッファーからコマンド名を読み取る。その後、指定されたコマンドを呼び出すためにcommand-executeを使用する。そのコマンドがリターンするのが何であれ、それがexecute-extended-commandの値となる。

そのコマンドがプレフィクス引数を求める場合は、prefix-argumentのの値を受け取る。execute-extended-commandがインタラクティブに呼び出された場合は、カレントのrawプレフィクス引数がprefix-argumentに使用され、それが何であれ実行するコマンドに渡される。

通常、execute-extended-commandM-xの定義なので、プロンプトとして文字列‘M-x を使用する(execute-extended-commandを呼び出したイベントからプロンプトを受け取るほうが良いのだろうが、実装は骨が折れる)。プレフィクス引数の値の説明が、もしあれば、それもプロンプトの一部となる。

(execute-extended-command 3)
---------- Buffer: Minibuffer ----------
3 M-x forward-word RET
---------- Buffer: Minibuffer ----------
     ⇒ t