After the command loop has translated a key sequence into a command, it
invokes that command using the function command-execute. If the command is a function, command-execute calls call-interactively, which reads the arguments and calls
the command. You can also call these functions yourself.
なお、この文脈における「コマンド」という用語は、対話的に呼び出し可能な関数(または関数のようなオブジェクト)、あるいはキーボードマクロを指します。コマンドの実行に使用されるキーシーケンスを指すものではありません(キーマップを参照してください)。
この関数は、object がコマンドである場合に t
を返します。そうでない場合は、nil を返します。
コマンドには、文字列やベクトル(キーボードマクロとして扱われる)、トップレベルの interactive 形式を含むラムダ式(interactive の使用
を参照)、こうしたラムダ式から生成されたバイトコード関数オブジェクト、インタラクティブとして宣言されたオートロードオブジェクト(autoload の第4引数が nil
ではないもの)、およびいくつかのプリミティブ関数が含まれます。また、シンボルが nil 以外の
interactive-form プロパティを持つか、あるいはその関数定義が commandp を満たす場合、そのシンボルはコマンドとみなされます。
for-call-interactively が nil でない場合、commandp は call-interactively が呼び出せるオブジェクトに対してのみ t を返します。つまり、キーボードマクロに対しては返されません。
commandp の具体的な使用例については、ドキュメント文字列へのアクセス の documentation を参照してください。
この関数は、対話的に呼び出し可能な関数 command を、その対話的呼び出し仕様に従って引数を渡して呼び出します。そして、command が返す値をそのまま返します。
例えば、次のようなシグネチャを持つ関数があるとします。
(defun foo (begin end) (interactive "r") ...)
それから言って
(call-interactively 'foo)
リージョン(point および mark)を引数として will call foo
を呼び出します。
command
が関数でない場合、または対話的に呼び出せない(すなわちコマンドではない)場合は、エラーが報告されます。なお、キーボードマクロ(文字列やベクトル)はコマンドとみなされますが、関数ではないため受け付けられません。command がシンボルである場合、call-interactively はその関数定義を使用します。
record-flag が nil
でない場合、このコマンドとその引数は無条件にリスト command-history
に追加されます。そうでない場合は、ミニバッファを使用して引数を読み取る場合に限り、コマンドが追加されます。コマンド履歴 を参照してください。
引数 keys
が指定された場合、コマンドが呼び出しに使用されたイベントを問い合わせた際に提供すべきイベントのシーケンスを指定するベクトルである必要があります。keys が省略された場合、または nil
が指定された場合、デフォルト値は this-command-keys-vector
の戻り値となります。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 を用いてミニバッファからコマンド名を読み込みます(Completion を参照)。次に、command-execute を使用して指定されたコマンドを呼び出します。そのコマンドが返す値が、execute-extended-command の値となります。
コマンドがプレフィックス引数を要求した場合、prefix-argument
という値が渡されます。execute-extended-command
が対話的に呼び出された場合、現在の生のプレフィックス引数が 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」)の通常の定義です。
これら2つのコマンドはいずれもコマンド名の入力を求めますが、補完ルールが異なります。入力中に M-S-x コマンドを使用することで、これら2つのモードを切り替えることができます。