如何在universal-arguments
之前找到用于调用命令的numeric-argument
的数量。
例如,我如何在以下(错误)函数中区分arg1
和arg2
?
(defun my-func (&optional arg1 arg2)
(interactive "P\nP")
(message "arg1: %S, arg2: %S, value: %S"
arg1 arg2 (prefix-numeric-value current-prefix-arg)))
用例,透明地将数字前缀值传递给建议的命令,具体取决于先前的universal-arguments
的数量,例如。 dired
在使用C-u 2的当前dired缓冲区中的2
文件之后重命名,或者用C-u C-u 2重命名为其他dired缓冲区。
以下建议的内容,但实际上将2
正确地传递给dired-do-rename
而不是1
或4
。
(define-advice dired-do-rename (:around (fun &rest args) "defer-dwim")
(let ((dired-dwim-target (equal '(4) current-prefix-arg)))
(apply fun (list (max 1 (prefix-numeric-value current-prefix-arg))))))
我看到有一个prefix-command-preserve-state-hook
,但似乎是做出这项工作的重要额外努力。
对不起,但你的问题对我来说还不清楚 - 所以这可能无法回答。
你说“我怎样才能找到用于在数字参数之前调用命令的通用参数的数量。”我会回答的。
在"P"
字符串规范中写interactive
多少次并不重要。每次都是相同的值,多次这样的事件并不对应于C-u
的多次使用。
所以(interactive "P\nP\nP")
只生成三个都具有相同值的参数 - 来自单次使用前缀参数键序列的值,无论该序列是C-u
,C-9
,M--3
,C-u 360
还是C-u C-u C-u
。
如果你希望你的函数区分C-u
,C-u C-u
和C-u C-u C-u
,那么它需要测试原始前缀参数("P"
为interactive
指定的内容)。
C-u
对应于原始前缀arg (4)
,即只有数字4的列表。C-u C-u
对应于原始前缀arg (16)
。C-u C-u C-u
对应于原始前缀arg (64)
。(prefix-numeric-value '(4))
返回4; (prefix-numeric-value '(16))
返回16;和(prefix-numeric-value '(64))
返回64。
请参阅Elisp手册,节点Prefix Command Arguments。
您可以使用此命令之类的操作来练习,以便在键入不同的prefix-arg键序列时查看生成的原始和数字前缀参数:
(defun foo (arg narg)
(interactive "P\np")
(message "ARG: %S, NARG: %S" arg narg))
你的其余问题对我来说完全不清楚。我不明白你要用“dired-do-rename
做什么。如果我是对的,请考虑发布两个单独的问题:一个问如何区分C-u
和C-u C-u
,另一个问什么(什么?)关于dired-do-rename
。