Интерактивный r elisp defun с дополнительными аргументами?

Можно ли написать интерактивный defun с кодом «r», который имеет дополнительный необязательный аргумент (чтобы он выполнял действия в выбранной области, но с другим аргументом)? Я хотел бы что-то вроде следующего:

(defun my-function (start end &optional arg)
  "Do something with selected region"
  (interactive "r")
  (if arg
      (setq val arg)
    (setq val 2))
  (do things...))

Глядя на документацию, говорит

'r': точка и метка, как два числовых аргумента, сначала наименьший. Это единственная кодовая буква, которая указывает два последовательных аргумента, а не один. Нет ввода-вывода.

Я не уверен, что «Нет ввода-вывода» и «два последовательных аргумента» означают, что он принимает 2 и только 2 аргумента (т. Е. Ограничивается начальной и конечной точкой региона в качестве аргументов). Хотя это позволяет мне оценивать и запускать определение с дополнительным аргументом, Emacs, похоже, его игнорирует.

Спасибо.


person beardc    schedule 09.04.2011    source источник


Ответы (2)


Чтобы interactive запрашивал несколько параметров, разделите их символом новой строки. Например, если вы хотите, чтобы ваш третий параметр был привязан к значению аргумента префикса, определите свою функцию следующим образом:

(defun my-function (start end &optional arg)
  "Do something with selected region"
  (interactive "r\np")
  (if arg
      (setq val arg)
    (setq val 2))
  (do things...))

M-x describe-function interactive дает вам дополнительную информацию.

person Thomas    schedule 09.04.2011

Функцию можно вызвать двумя способами:

  • Интерактивно: это то, что происходит, когда пользователь вызывает команду, например. когда он был привязан к ключу.
  • Из лиспа: Когда функция вызывается из другой функции лиспа. например (r 100 200 t).

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

NO I/O означает, что он не будет запрашивать у пользователя ввод (как это происходит, когда он запрашивает имя файла).

Если вы хотите, чтобы ваша функция действовала по-разному в зависимости от того, когда регион активен, вы можете задать функцию (use-region-p).

person Lindydancer    schedule 09.04.2011