Что (интерактивный) означает в функции Emacs Lisp? - PullRequest
28 голосов
/ 18 декабря 2008

Функция Emacs Lisp часто запускается так:

(lambda () (interactive) ...

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

Ответы [ 4 ]

24 голосов
/ 18 декабря 2008

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

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

19 голосов
/ 18 декабря 2008

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

Более того, стоит отметить, что основное назначение interactive в интерактивном контексте (например, когда пользователь вызывает функцию с привязкой клавиш) позволяет пользователю указывать аргументы функции, которые в противном случае могли бы быть заданы только программно.

Например, рассмотрим функцию sum, которая возвращает сумму двух чисел.

(defun sum (a b)
  (+ a b))

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

3 голосов
/ 17 марта 2012

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

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

...