Next: インタラクティブな呼び出しの区別, Previous: コマンドの定義, Up: コマンドループ [Contents][Index]
コマンドループはキーシーケンスをコマンドに変換した後、関数command-execute
を使用してその関数を呼び出します。そのコマンドが関数なら、command-execute
は引数を読み取りコマンドを呼び出すcall-interactively
を呼び出します。自分でこれらの関数を呼び出すこともできます。
このコンテキストにおいて用語“command”はインタラクティブにコール可能な関数(または関数likeなオブジェクト)やキーボードマクロを指すことに注意してください。つまりコマンドを呼び出すキーシーケンスのことではありません(キーマップを参照)。
この関数はobjectがコマンドならt
、それ以外はnil
をリターンする。
コマンドには文字列とベクター(キーボードマクロとして扱われる)、トップレベルのinteractive
フォーム(interactive
の使用を参照)を含むラムダ式、そのようなラムダ式から作成されたバイトコンパイル関数オブジェクト、interactiveとして宣言(autoload
の4つ目の引数が非nil
)されたautoloadオブジェクト、およびいくつかのプリミティブ関数が含まれる。interactive-form
プロパティが非nil
のシンボル、および関数定義がcommandp
を満足するシンボルもコマンドとされる。
for-call-interactivelyが非nil
なら、call-interactively
が呼び出すことができるオブジェクトにたいしてのみcommandp
はt
をリターンする。したがってキーボードマクロは該当しなくなる。
commandp
を使用する現実的な例については、ドキュメント文字列へのアクセス内の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
に追加される。それ以外なら引数の読み取りにミニバッファーを使用した場合のみコマンドが追加される。コマンドのヒストリーを参照のこと。
引数keysが与えらたら、それはコマンドを呼び出すためにどのイベントを使用するかコマンドが問い合わせた場合に与えるべきイベントシーケンスを指定するベクターである。keysがnil
または省略された場合のデフォルトは、this-command-keys-vector
のリターン値である。Definition of this-command-keys-vectorを参照のこと。
この関数はfuncall
(関数の呼び出しを参照)と同様に機能するが、インタラクティブな呼び出しのように見える呼び出しを生成する。function内部でのcalled-interactively-p
の呼び出しはt
をリターンするだろう。functionがコマンドでなければ、エラーをシグラルすることなくそれを呼び出す。
この関数はcommandを実行する。引数commandは述語commandp
を満足しなければならない。つまりインタラクティブに呼び出し可能な関数かキーボードマクロでなければならない。
commandが文字列かベクターなら、execute-kbd-macro
により実行される。関数はrecord-flagおよびkeys引数とともにcall-interactively
に渡される(上記参照)。
commandがシンボルなら、その位置にシンボルの関数定義が使用される。autoload
定義のあるシンボルは、インタラクティブに呼び出し可能な関数を意味するよう宣言されていればコマンドとして判断される。そのような宣言は指定されたライブラリーのロードと、シンボル定義の再チェックにより処理される。
引数specialが与えられたら、それはプレフィクス引数を無視して、それをクリアーしないという意味である。これはスペシャルイベント(スペシャルイベントを参照)を実行する場合に使用される。
この関数はcompleting-read
(補完を参照)を使用して、ミニバッファーからコマンド名を読み取る。その後で指定されたコマンドを呼び出すために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
このコマンドはカレントメジャーモード(や有効なマイナーモード)に不適切なコマンドを除外するread-extended-command-predicate
変数を考慮する。この変数の値はデフォルトではnil
であり、除外されるコマンドはない。しかし関数command-completion-default-include-p
を呼び出すようにカスタマイズすることで、モードに応じたフィルタリングを行うようになる。read-extended-command-predicate
には任意の述語関数を指定できる。これはそのコマンドのシンボル、およびカレントバッファーという2つのパラメーターで呼び出される。そのバッファーニオイそのコマンドを補完に含めるなら非nil
をリターンすること。
これはexecute-extended-command
と似ているが、補完にたいしてカレントバッファー(や有効なマイナーモード)と特に関連するものに限定してコマンドを提案する。これらにはそのモードにタグ付けされたコマンド(interactive
の使用を参照)、およびローカルでアクティブなキーマップにバインドされたコマンドも含まれる。このコマンドはM-S-x
(すなわち“meta shift x”)の通常の定義である。
これらのコマンドはいずれもコマンド名の入力を求めますが、補完ルールは異なります。入力を求められた際にM-S-xコマンドを使用することで、2つの補完モードを切り替えることができます。