Функция Emacs Lisp часто начинается следующим образом:
(lambda () (interactive) ...
Что означает "(интерактивный)"?
Функция Emacs Lisp часто начинается следующим образом:
(lambda () (interactive) ...
Что означает "(интерактивный)"?
Просто чтобы уточнить (это в цитированных документах которые цитирует Чарли) (interactive)
- это не только функции с привязкой к ключу, но и для любой функции. Без (interactive)
он может быть вызван только программным способом, а не из M-x
(или с помощью связывания ключей).
РЕДАКТИРОВАТЬ: Обратите внимание, что просто добавление "(интерактивного)" к функции не обязательно заставит ее работать таким образом: либо может быть много причин, по которым функции не являются интерактивными. Scoping, зависимости, параметры и т.д.
Я имею в виду, что вы включаете какой-то код для того, что вам нужно, чтобы вызвать функцию, связанную с ключом - например, получить аргумент из CTRL-u.
Посмотрите CTRL-h f interactive
для деталей:
interactive is a special form in `C source code'. (interactive args) Specify a way of parsing arguments for interactive use of a function. For example, write (defun foo (arg) "Doc string" (interactive "p") ...use arg...) to make ARG be the prefix argument when `foo' is called as a command. The "call" to `interactive' is actually a declaration rather than a function; it tells `call-interactively' how to read arguments to pass to the function. When actually called, `interactive' just returns nil. The argument of `interactive' is usually a string containing a code letter followed by a prompt. (Some code letters do not use I/O to get the argument and do not need prompts.) To prompt for multiple arguments, give a code letter, its prompt, a newline, and another code letter, etc. Prompts are passed to format, and may use % escapes to print the arguments that have already been read.
Более того, стоит упомянуть, что interactive
основная цель в интерактивном контексте (например, когда пользователь вызывает функцию с привязкой ключа), позволяет пользователю указывать аргументы функции, которые иначе могли бы выдаваться программно.
Например, рассмотрим функцию sum
возвращает сумму двух чисел.
(defun sum (a b)
(+ a b))
Вы можете называть его (sum 1 2)
, но вы можете сделать это только в программе Lisp (или в REPL). Если вы используете специальную форму interactive
в своей функции, вы можете попросить пользователя аргументы.
(defun sum (a b)
(interactive
(list
(read-number "First num: ")
(read-number "Second num: ")))
(+ a b))
Теперь M-x sum
позволит вам ввести два числа в минибуфере, и вы все равно можете сделать (sum 1 2)
.
interactive
должен возвращать список, который будет использоваться в качестве списка аргументов, если функция называется интерактивно.
(интерактивный) предназначен для функций, предназначенных для взаимодействия с пользователем, будь то через M-x или через привязки клавиш.
M-x описать-функцию RET interactive RET для подробной информации о том, как ее использовать, включая параметр для улавливания строк, целых чисел, имен буферов и т.д.