コマンドループでは、キー列をコマンドへ変換し終えると、
関数command-execute
を用いてそのコマンドを起動します。
コマンドが関数であれば、command-execute
は引数を読み取り、
コマンドを呼び出すcall-interactively
を呼びます。
読者自身がこれらの関数を呼び出してもかまいません。
objectが対話的呼び出しに適していれば、 つまり、objectがコマンドであれば
t
を返す。 さもなければnil
を返す。対話的呼び出しが可能なオブジェクトには、 (キーボードマクロとして扱われる)文字列やベクトル、 トップレベルで
interactive
を呼び出しているラムダ式、 そのようなラムダ式をコンパイルしたバイトコード関数オブジェクト、 対話的(autoload
の4番目の引数がnil
以外) と宣言された自動ロードオブジェクト、 一部の基本関数が含まれる。シンボルの関数定義が
commandp
を満たせば、 シンボルもcommandp
を満たす。キーやキーマップはコマンドではない。 それらはコマンドを探すために使われる(see Keymaps)。
commandp
の実用的な使用例については、 Accessing Documentationのdocumentation
を参照。
この関数は、対話的呼び出し可能な関数commandを その対話指定に従って引数を読み取り呼び出す。 commandが関数でなかったり、 対話的に呼び出せない(つまり、コマンドでない)場合には、 エラーを通知する。 キーボードマクロ(文字列やベクトル)はコマンドとみなすが、 それらは関数でないため、この関数はキーボードマクロを受け付けない。
record-flagが
nil
以外であると、 コマンドとその引数を無条件にリストcommand-history
に追加する。 さもなければ、引数を読むために コマンドがミニバッファを使った場合にのみ追加する。 see Command History。もし引数keysを指定すると、コマンドがそれを起動したイベントを 問い合わせたときに与えるイベント列を指定する。
この関数はcommandを実行する。 引数commandは
commandp
を満たすこと。 つまり、対話的呼び出し可能な関数かキーボードマクロであること。
command
が文字列やベクトルであると、execute-kbd-macro
で実行される。 関数であると、省略可能なrecord-flagとともに関数をcall-interactively
に渡す。シンボルは、その関数定義を使って処理する。
autoload
で定義されたシンボルは、 対話的呼び出し可能な関数と宣言されていればコマンドとみなす。 そのような定義では、指定されたライブラリをロードしてから シンボルの定義を再検査して処理する。もし引数keysを指定すると、コマンドがそれを起動したイベントを 問い合わせたときに与えるイベント列を指定する。
この関数は
completing-read
(see 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 1) ---------- Buffer: Minibuffer ---------- 1 M-x forward-word RET ---------- Buffer: Minibuffer ---------- ⇒ t
この関数は、これ(
interactive-p
の呼び出し)を含んだ関数がcall-interactively
で対話的に呼び出されるとt
を返す。 (Lispからcall-interactively
が呼び出されても、 エディタコマンドループが直接呼び出しても違いはない。) これを含んだ関数がLispの評価(あるいはapply
やfuncall
)で 呼び出された場合は、対話的呼び出しではない。
interactive-p
のもっとも一般的な用途は、
情報メッセージを表示するかどうか決めることです。
特別な例外として、キーボードマクロを実行中にはいつでも、
interactive-p
はnil
を返します。
これは情報メッセージを省いてマクロの実行を速くするためです。
つぎのように使います。
(defun foo () (interactive) (when (interactive-p) (message "foo"))) ⇒ foo (defun bar () (interactive) (setq foobar (list (foo) (interactive-p)))) ⇒ bar ;; M-x fooと打つ -| foo ;; M-x barと打つ ;; これはなにも表示しない foobar ⇒ (nil t)
この種のことを行う別の方法は、コマンドを
対話的呼び出しではnil
以外の値になる引数print-message
を
取るようにし、その引数がnil
以外になるようなinteractive
指定を
使うことです。
つぎのようにします。
(defun foo (&optional print-message) (interactive "p") (when print-message (message "foo")))
‘p’で与えられる数値前置引数はけっしてnil
になりません。