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


20.3 interactiveな呼び出し

コマンドループはキーシーケンスをコマンドに変換した後、関数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