Next: , Previous: , Up: コマンドループ   [Contents][Index]


22.3 インタラクティブな呼び出し

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

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

Function: commandp object &optional for-call-interactively

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

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

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

commandpを使用する現実的な例については、ドキュメント文字列へのアクセス内の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に追加される。それ以外なら引数の読み取りにミニバッファーを使用した場合のみコマンドが追加される。コマンドのヒストリーを参照のこと。

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

Function: funcall-interactively function &rest arguments

この関数はfuncall (関数の呼び出しを参照)と同様に機能するが、インタラクティブな呼び出しのように見える呼び出しを生成する。function内部でのcalled-interactively-pの呼び出しはtをリターンするだろう。functionがコマンドでなければ、エラーをシグラルすることなくそれを呼び出す。

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

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

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

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

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

Command: execute-extended-command prefix-argument

この関数はcompleting-read(補完を参照)を使用して、ミニバッファーからコマンド名を読み取る。その後で指定されたコマンドを呼び出すために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

このコマンドはカレントメジャーモード(や有効なマイナーモード)に不適切なコマンドを除外するread-extended-command-predicate変数を考慮する。この変数の値はデフォルトではnilであり、除外されるコマンドはない。しかし関数command-completion-default-include-pを呼び出すようにカスタマイズすることで、モードに応じたフィルタリングを行うようになる。read-extended-command-predicateには任意の述語関数を指定できる。これはそのコマンドのシンボル、およびカレントバッファーという2つのパラメーターで呼び出される。そのバッファーニオイそのコマンドを補完に含めるなら非nilをリターンすること。

Command: execute-extended-command-for-buffer prefix-argument

これはexecute-extended-commandと似ているが、補完にたいしてカレントバッファー(や有効なマイナーモード)と特に関連するものに限定してコマンドを提案する。これらにはそのモードにタグ付けされたコマンド(interactiveの使用を参照)、およびローカルでアクティブなキーマップにバインドされたコマンドも含まれる。このコマンドはM-S-x (すなわち“meta shift x”)の通常の定義である。

これらのコマンドはいずれもコマンド名の入力を求めますが、補完ルールは異なります。入力を求められた際にM-S-xコマンドを使用することで、2つの補完モードを切り替えることができます。