Emacs 如何使用kill环的内容作为通用参数的前缀arg?

Emacs 如何使用kill环的内容作为通用参数的前缀arg?,emacs,arguments,argument-passing,Emacs,Arguments,Argument Passing,有时我希望能够做到以下几点: “C-u xxx…” 其中xxx是我最后一次放入kill环的整数(通过杀死缓冲区中的一个数字) 这是我想和宏一起使用的东西,所以我不能手动输入那个整数 那么我如何才能弹出kill环并(解析并)将弹出的数字传递给“C-u” 请注意,我想将其与多个函数一起使用,因此我真的希望它能像C-u一样工作(但不必手动输入数字,我希望它能从压井环中取出)。这里有一个粗略的尝试: (defun prefix-argument-from-kill-ring () "Set the

有时我希望能够做到以下几点:

“C-u xxx…”

其中xxx是我最后一次放入kill环的整数(通过杀死缓冲区中的一个数字)

这是我想和宏一起使用的东西,所以我不能手动输入那个整数

那么我如何才能弹出kill环并(解析并)将弹出的数字传递给“C-u”


请注意,我想将其与多个函数一起使用,因此我真的希望它能像C-u一样工作(但不必手动输入数字,我希望它能从压井环中取出)。

这里有一个粗略的尝试:

(defun prefix-argument-from-kill-ring ()
  "Set the numeric argument for the following command to the
number that was the previous kill."
  (interactive)
  (setq prefix-arg (list (string-to-number (current-kill 0)))))

一个更有原则的实现将检查kill的文本,如果它不是一个数字,则执行一些合理的操作。

使用
数字参数
作为模板,我写了以下内容,似乎效果很好:

(defun yank-universal-digits (arg)
  (interactive "P")
  (let* ((digits (current-kill 0))
         (digits (if (string-match "\\`0*\\([1-9][0-9]*\\)\\'" digits)
                     (match-string 1 digits)
                   (error "Current kill is not a positive integer")))
         (num (string-to-number digits)))
    (cond ((integerp arg)
           (setq prefix-arg (+ (* arg (expt 10 (length digits)))
                               (* num (if (< arg 0) -1 +1)))))
          ((eq arg '-)
           (setq prefix-arg (- num)))
          (t
           (setq prefix-arg num)))
    (setq universal-argument-num-events (length (this-command-keys)))
    (save&set-overriding-map universal-argument-map)))

(define-key universal-argument-map [?\C-y] 'yank-universal-digits)
(defun-yank通用数字(arg)
(交互式“P”)
(let*((数字(当前终止0))
(数字(如果(字符串匹配“\\`0*\\([1-9][0-9]*\\)\”)数字)
(匹配字符串1位)
(错误“当前终止不是正整数”))
(num(字符串到数字的比例)))
(条件((整型参数)
(setq前缀arg(+(*arg(expt 10(长度数字)))
(*num(如果(

安排删除的数字显示在微型缓冲区中,就像您直接键入一样,这是一个练习。

+1也留给您!老实说,当我看到simple.el(我想)里面的数字参数代码时,我感到很失落,于是来到这里问应该如何做。您能解释一下您的解决方案与gsg给出的解决方案(除了整数检查)有什么不同吗?它与
数字参数
基本相同,只是该函数处理一个单个数字(存储在名为
数字
的变量中),而我的函数处理一个可能的多位数,我将其存储在变量
num
中。由于
num
可能大于10,因此我需要将现有前缀乘以位数的幂(即
(expt 10(长度位数))
表达式),而不是像
数字参数那样总是简单地乘以10。