Spec-Zone.ru › Elisp

Различение интерактивных вызовов

Иногда команда должна отображать дополнительную визуальную обратную связь (например, информационное сообщение в области эха) только для интерактивных вызовов. Существует три способа сделать это. Рекомендуемый способ проверить, был ли вызов функции с использованием 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API