是否可以使用代码“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似乎忽略了它。
谢谢。
答案 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)
可以通过两种方式调用函数:
(r 100 200 t)
。在您的情况下,您必须确保参数与交互式规范匹配,在这种情况下,它必须接受两个参数。交互式调用时不会使用第三个(因此它将获得值nil
)。
否I / O意味着它不会提示用户输入(就像它要求输入文件名时一样)。
如果您希望您的功能在区域处于活动状态时采取不同的行动,您可以询问函数(use-region-p)
。