Интерактивный "r" elisp defun с дополнительными аргументами? - PullRequest
3 голосов
/ 09 апреля 2011

Можно ли написать интерактивный 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 аргумента (т. Е. Ограничен началом регионаи конечная точка как аргументы).Хотя это позволяет мне оценить и запустить defun с дополнительным аргументом, Emacs, похоже, игнорирует его.

Спасибо.

Ответы [ 2 ]

7 голосов
/ 09 апреля 2011

Чтобы заставить 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 дает вам дополнительную информацию.

1 голос
/ 09 апреля 2011

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

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

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

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

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

...