Next: Command Loop Info, Previous: Interactive Call, Up: Command Loop [Contents][Index]
interactive呼び出しのときは、コマンドが(エコーエリア内の情報メッセージなどのような)視覚的な追加フィードバックを表示すべきときがあります。これを行うためには、3つの方法があります。その関数がcall-interactively
を使用して呼び出されたかどうかテストするには、オプション引数print-message
を与えるとともに、interactive呼び出しで非nil
となるようにinteractive
仕様を使うのが推奨される方法です。以下は例です:
(defun foo (&optional print-message) (interactive "p") (when print-message (message "foo")))
数プレフィクス引数は決してnil
にならないので、わたしたちは"p"
を使用します。この方法で定義された関数は、キーボードマクロから呼び出されたときにメッセージを表示します。
追加引数による上記の手法は、呼び出し側に“この呼び出しをinteractiveとして扱うように”伝えることができるので、通常は最善です。しかし、called-interactively-p
.をテストすることにより、これを行うこともできます。
この関数は、呼び出された関数がcall-interactively
を使用して呼び出された場合はt
をリターンする。
引数kindはシンボルinteractive
かシンボルany
のどちらかである。これがinteractive
の場合、called-interactively-p
はユーザーから直接呼び出しが行われたとき
—
たとえば関数呼び出しにバインドされたキーシーケンスをユーザーがタイプした場合がそれに該当するが、ユーザーがその関数を呼び出すキーボードマクロ(Keyboard Macrosを参照)を実行中した場合は該当しない —
だけt
をリターンするkindがany
の場合、called-interactively-p
はキーボードマクロを含む任意の種類のinteractive呼び出しにたいしてt
をリターンする。
疑わしい場合はany
を使用すること。interactive
の使用が正しいと解っているのは、関数が実行中に役に立つメッセージを表示するかどうか判断が必要な場合だけである。
Lisp評価(またはapply
やfuncall
))を通じて呼び出された、または場合、関数は決してインタラクティブに呼び出されたとは判断されない。
以下はcalled-interactively-p
を使用する例である:
(defun foo () (interactive) (when (called-interactively-p 'any) (message "Interactive!") 'foo-called-interactively))
;; M-x fooとタイプする
-| Interactive!
(foo) ⇒ nil
以下はcalled-interactively-p
の直接呼び出しと間接呼び出しを比較した例である。
(defun bar () (interactive) (message "%s" (list (foo) (called-interactively-p 'any))))
;; M-x barとタイプする
-| (nil t)