Различение интерактивных вызовов
Иногда команда должна отображать дополнительную визуальную обратную связь (например, информационное сообщение в области эха) только для интерактивных вызовов. Существует три способа сделать это. Рекомендуемый способ проверить, был ли вызов функции с использованием call-interactively — передать ей необязательный аргумент print-message и использовать спецификацию interactive, чтобы сделать ее не-nil при интерактивных вызовах. Вот пример:
(defun foo (&optional print-message)
(interactive "p")
(when print-message
(message "foo")))
Мы используем "p", потому что аргумент числового префикса никогда не nil. В таком виде функция отображает сообщение, когда вызывается из макроса клавиатуры.
Вышеуказанный метод с дополнительным аргументом обычно лучше всего подходит, поскольку он позволяет вызывающим сторонам указать «обращаться к этому вызову как интерактивному». Но вы также можете выполнить задачу, проверив called-interactively-p.
- Функция: called-interactively-p kind
-
Эта функция возвращает
t, когда вызывающая функция была вызвана с использованиемcall-interactively.Аргумент kind должен быть либо символом
interactive, либо символомany. Если онinteractive, тоcalled-interactively-pвозвращаетtтолько в том случае, если вызов был сделан непосредственно пользователем — например, если пользователь ввел последовательность клавиш, связанную с вызывающей функцией, но не если пользователь запустил макрос клавиатуры, вызвавший функцию (см. Макросы клавиатуры). Если kind равенany,called-interactively-pвозвращаетtдля любого типа интерактивного вызова, включая макросы клавиатуры.В случае сомнений, используйте
any; единственное известное правильное использованиеinteractive— если вам нужно решить, следует ли отображать полезное сообщение во время выполнения функции.Функция никогда не считается вызываемой интерактивно, если она была вызвана через вычисление Lisp (или с
applyилиfuncall).
Вот пример использования called-interactively-p:
(defun foo ()
(interactive)
(when (called-interactively-p 'any)
(message "Interactive!")
'foo-called-interactively))
;; Type M-x foo.
-| Interactive!
(foo)
⇒ nil
Вот еще один пример, который противопоставляет прямые и косвенные вызовы к called-interactively-p.
(defun bar () (interactive) (message "%s" (list (foo) (called-interactively-p 'any))))
;; Type M-x bar.
-| (nil t)
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Distinguish-Interactive.html