Подтвердить что ты не робот

Что означает (интерактивное) значение в функции Emacs Lisp?

Функция Emacs Lisp часто начинается следующим образом:

(lambda () (interactive) ...

Что означает "(интерактивный)"?

4b9b3361

Ответ 1

Просто чтобы уточнить (это в цитированных документах которые цитирует Чарли) (interactive) - это не только функции с привязкой к ключу, но и для любой функции. Без (interactive) он может быть вызван только программным способом, а не из M-x (или с помощью связывания ключей).

РЕДАКТИРОВАТЬ: Обратите внимание, что просто добавление "(интерактивного)" к функции не обязательно заставит ее работать таким образом: либо может быть много причин, по которым функции не являются интерактивными. Scoping, зависимости, параметры и т.д.

Ответ 2

Я имею в виду, что вы включаете какой-то код для того, что вам нужно, чтобы вызвать функцию, связанную с ключом - например, получить аргумент из 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.

Ответ 3

Более того, стоит упомянуть, что 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 должен возвращать список, который будет использоваться в качестве списка аргументов, если функция называется интерактивно.

Ответ 4

(интерактивный) предназначен для функций, предназначенных для взаимодействия с пользователем, будь то через M-x или через привязки клавиш.

M-x описать-функцию RET interactive RET для подробной информации о том, как ее использовать, включая параметр для улавливания строк, целых чисел, имен буферов и т.д.