Answers:
很难相信人们在这里描述了这一点,却没有给您链接到Emacs自己的描述:
在Emacs手册中,节点参数。
在Elisp手册中,节点Prefix Command Arguments。
“问Emacs!” : C-h i
,选择一个手册,i prefix argument RET
。
简而言之,尽管这里的其他答案已经足够说明了这一点,并且在手册中对其进行了详细说明:
该“原始”前缀ARG提供不同种类的Lisp的值,并且特别地,其区分用户是否实际使用(任何种类的)前缀参数。
使用它,程序可以区分用户是否使用{一个-
,M--
,C--
}或{一个M-- 1
, C-- 1
,C-u -1
}(两者都具有的相同的数字前缀值-1
),并区分S是否?他用C-u C-u
或之一{ M-16
,C-16
,C-u 16
}(两者均具有数值16)-在许多其他区别中。
但是最重要的区别是nil
vs非nil
:许多命令的作用取决于用户是否使用前缀arg。
在“数字”前缀arg是真的只是函数值prefix-numeric-value
返回时应用到原始前缀ARG。IOW,最好将其视为从实际原始用户交互到整数的映射。
它不能告诉你用户是否实际使用前缀的说法,因为没有前缀参数的默认值映射到整数1,就像不使用C-u 1
,M-1
或C-1
。
使用原始前缀Interactive Code时 "P"
,参数按原样传递,而"p"
将arg转换为数字。
在评估以下elisp之后,尝试一下C-u M-x my/fn-with-num-arg
,然后C-u M-x my/fn-with-raw-arg
查看差异,因为C-u
传递了list参数(4)
。
(defun my/debug-fn (arg)
(let ((msg))
(if (numberp arg)
(setq msg (format "Argument is number %s. " (pp arg)))
(setq msg "Argument is not a number. "))
(if (listp arg)
(setq msg (concat msg (format "Arg is %s." (pp arg))))
(setq msg (concat msg "Argument is not a list.")))
(message msg)))
(defun my/fn-with-num-arg (arg)
(interactive "p")
(my/debug-fn arg))
;; Result of C-u M-x my/fn-with-num-arg :
;; Argument is number 4. Argument is not a list.
(defun my/fn-with-raw-arg (arg)
(interactive "P")
(my/debug-fn arg))
;; Result of C-u M-x my/fn-with-raw-arg :
;; Argument is not a number. Arg is (4)
;; .
同样,参数默认1
为数字参数("p"
),但默认为nil
或()
原始参数("P"
)。
我的几分钱:有时,决定是否使用"p"
或的决定因素"P"
是您是否要将默认参数设为1
或nil
。
;; Result of M-x my/fn-with-num-arg :
;; Argument is number 1. Argument is not a list.
;; Result of M-x my/fn-with-raw-arg :
;; Argument is not a number. Arg is nil.
nil
存在)来判断用户是否使用了前缀arg 。
只是为@kaushalmodi的答案(和有用的测试用例)添加更多细节:
raw参数可让您区分universal-argument
和提供的参数digit-argument
。
如果使用数字前缀arg,则无法将通用参数C-u
与前缀arg 4(即C-4
)区分开。与原始参数不同的是:(4)
vs 4
。
同样适用于negative-argument
。作为原始参数,您可以区分C--
和C-- 1
:第一个会给您-
而第二个会给您-1
。转换为数字参数时,它们都将是-1
。
因此,使用原始参数的好处是可以为您提供更多可能的值。您可以编写命令,这些命令的行为取决于指定参数的方式。
举例来说,请查看的文档字符串yank
。此命令对待C-u
和C-4
区别对待:
仅以Cu作为参数,将点放在开始处,并在结尾处进行标记。使用参数N,重新插入第N个最近的杀死对象。
nil
比1
,但从来没有,有一个包裹int
是最好的展开int
。(顺便说一句,直到我得到15分,才能投票)。