在数字参数之前计算通用参数的数量

问题描述 投票:0回答:1

如何在universal-arguments之前找到用于调用命令的numeric-argument的数量。

例如,我如何在以下(错误)函数中区分arg1arg2

(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而不是14

(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,但似乎是做出这项工作的重要额外努力。

emacs key-bindings calling-convention
1个回答
0
投票

对不起,但你的问题对我来说还不清楚 - 所以这可能无法回答。

你说“我怎样才能找到用于在数字参数之前调用命令的通用参数的数量。”我会回答的。

"P"字符串规范中写interactive多少次并不重要。每次都是相同的值,多​​次这样的事件并不对应于C-u的多次使用。

所以(interactive "P\nP\nP")只生成三个都具有相同值的参数 - 来自单次使用前缀参数键序列的值,无论该序列是C-uC-9M--3C-u 360还是C-u C-u C-u

如果你希望你的函数区分C-uC-u C-uC-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-uC-u C-u,另一个问什么(什么?)关于dired-do-rename

© www.soinside.com 2019 - 2024. All rights reserved.