什么是原始前缀参数?(互动中的大写字母P)


9

它们可以用来做什么?

(interactive "p")universal argument右边接受数值论证?通用论证只是一个int方式,那么资本(interactive "P")做什么呢?

Answers:


11

很难相信人们在这里描述了这一点,却没有给您链接到Emacs自己的描述:

“问Emacs!” : C-h i,选择一个手册,i prefix argument RET

简而言之,尽管这里的其他答案已经足够说明了这一点,并且在手册中对其进行了详细说明:

  • “原始”前缀ARG提供不同种类的Lisp的值,并且特别地,其区分用户是否实际使用(任何种类的)前缀参数。

    使用它,程序可以区分用户是否使用{一个-M--C--}或{一个M-- 1C-- 1C-u -1}(两者都具有的相同的数字前缀值-1),并区分S是否?他用C-u C-u或之一{ M-16C-16C-u 16}(两者均具有数值16)-在许多其他区别中。

    但是最重​​要的区别是nilvs非nil:许多命令的作用取决于用户是否使用前缀arg。

  • “数字”前缀arg是真的只是函数值prefix-numeric-value返回时应用到原始前缀ARG。IOW,最好将其视为从实际原始用户交互到整数的映射。

    它不能告诉你用户是否实际使用前缀的说法,因为没有前缀参数的默认值映射到整数1,就像不使用C-u 1M-1C-1


9

使用原始前缀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"是您是否要将默认参数设为1nil

;; 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.

谢谢。我得到的有时是更好地得到nil1,但从来没有,有一个包裹int是最好的展开int。(顺便说一句,直到我得到15分,才能投票)。
24HrRevengeTherapist 2015年

@ 24HrRevengeTherapist:刚刚投票赞成,让您超越了神奇的15分门槛。出去做一些对你有帮助的项目吧!

这与包装和未包装的整数无关。根本不是关于整数。+1表示@kaushalmodi,以强调您可以仅通过使用原始arg(通过检查值是否nil存在)来判断用户是否使用了前缀arg 。
画了

7

只是为@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-uC-4区别对待:

仅以Cu作为参数,将点放在开始处,并在结尾处进行标记。使用参数N,重新插入第N个最近的杀死对象。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.