交互式“r”elisp与另外的args一起定义?

时间:2011-04-09 07:34:32

标签: function emacs elisp interactive

是否可以使用代码“r”编写一个具有附加可选参数的交互式defun(以便它在所选区域内执行某些操作,但使用另一个参数)?我想要以下内容:

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

查看documentation它说

  

'r':点和标记,为两个数字   争论,最小的。这是   只有指定两个的代码字母   连续的论证而不是一个。   没有I / O.

我不确定'无I / O'和'两个连续的参数'是否意味着它需要2个且只有2个参数(即,将区域的起点和终点限制为args)。虽然它允许我用额外的参数来评估和运行defun,但Emacs似乎忽略了它。

谢谢。

2 个答案:

答案 0 :(得分:7)

要使interactive请求多个参数,请使用换行符分隔它们。例如,如果您希望将第三个参数绑定到prefix参数的值,请按以下方式定义您的函数:

(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 :(得分:1)

可以通过两种方式调用函数:

  • 交互式:这是用户调用命令时发生的情况,例如:当它被绑定到一把钥匙时。
  • 来自lisp:从另一个lisp函数调用该函数时。例如(r 100 200 t)

在您的情况下,您必须确保参数与交互式规范匹配,在这种情况下,它必须接受两个参数。交互式调用时不会使用第三个(因此它将获得值nil)。

否I / O意味着它不会提示用户输入(就像它要求输入文件名时一样)。

如果您希望您的功能在区域处于活动状态时采取不同的行动,您可以询问函数(use-region-p)