Next: , Previous: Defining Commands, Up: Command Loop


20.3 対話的呼び出し

コマンドループでは、キー列をコマンドへ変換し終えると、 関数command-executeを用いてそのコマンドを起動します。 コマンドが関数であれば、command-executeは引数を読み取り、 コマンドを呼び出すcall-interactivelyを呼びます。 読者自身がこれらの関数を呼び出してもかまいません。

— Function: commandp object

objectが対話的呼び出しに適していれば、 つまり、objectがコマンドであればtを返す。 さもなければnilを返す。

対話的呼び出しが可能なオブジェクトには、 (キーボードマクロとして扱われる)文字列やベクトル、 トップレベルでinteractiveを呼び出しているラムダ式、 そのようなラムダ式をコンパイルしたバイトコード関数オブジェクト、 対話的(autoloadの4番目の引数がnil以外) と宣言された自動ロードオブジェクト、 一部の基本関数が含まれる。

シンボルの関数定義がcommandpを満たせば、 シンボルもcommandpを満たす。

キーやキーマップはコマンドではない。 それらはコマンドを探すために使われる(see Keymaps)。

commandpの実用的な使用例については、 Accessing Documentationdocumentationを参照。

— Function: call-interactively command &optional record-flag keys

この関数は、対話的呼び出し可能な関数commandを その対話指定に従って引数を読み取り呼び出す。 commandが関数でなかったり、 対話的に呼び出せない(つまり、コマンドでない)場合には、 エラーを通知する。 キーボードマクロ(文字列やベクトル)はコマンドとみなすが、 それらは関数でないため、この関数はキーボードマクロを受け付けない。

record-flagnil以外であると、 コマンドとその引数を無条件にリストcommand-historyに追加する。 さもなければ、引数を読むために コマンドがミニバッファを使った場合にのみ追加する。 see Command History

もし引数keysを指定すると、コマンドがそれを起動したイベントを 問い合わせたときに与えるイベント列を指定する。

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

この関数はcommandを実行する。 引数commandcommandpを満たすこと。 つまり、対話的呼び出し可能な関数かキーボードマクロであること。

commandが文字列やベクトルであると、 execute-kbd-macroで実行される。 関数であると、省略可能なrecord-flagとともに関数を call-interactivelyに渡す。

シンボルは、その関数定義を使って処理する。 autoloadで定義されたシンボルは、 対話的呼び出し可能な関数と宣言されていればコマンドとみなす。 そのような定義では、指定されたライブラリをロードしてから シンボルの定義を再検査して処理する。

もし引数keysを指定すると、コマンドがそれを起動したイベントを 問い合わせたときに与えるイベント列を指定する。

— コマンド: execute-extended-command prefix-argument

この関数は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
— Function: interactive-p

この関数は、これ(interactive-pの呼び出し)を含んだ関数が call-interactivelyで対話的に呼び出されるとtを返す。 (Lispからcall-interactivelyが呼び出されても、 エディタコマンドループが直接呼び出しても違いはない。) これを含んだ関数がLispの評価(あるいはapplyfuncall)で 呼び出された場合は、対話的呼び出しではない。

interactive-pのもっとも一般的な用途は、 情報メッセージを表示するかどうか決めることです。 特別な例外として、キーボードマクロを実行中にはいつでも、 interactive-pnilを返します。 これは情報メッセージを省いてマクロの実行を速くするためです。

つぎのように使います。

     (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になりません。