次: Command Loop Info, 前: Defining Commands, 上: Command Loop
コマンドループでは、キー列をコマンドへ変換し終えると、
関数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になりません。