如何使用kill-ring的内容作为universal-argument的prefix-arg?

时间:2013-11-01 17:20:07

标签: emacs arguments argument-passing

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

“C-u xxx ......”

其中xxx是我最后输入kill-ring的整数(通过在我的缓冲区中删除一个数字)。

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

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

请注意,我想在几个函数中使用它,所以我真的希望它像Cu一样工作(但不是手动输入数字,我希望它从kill环中获取)。

2 个答案:

答案 0 :(得分:4)

这是一个粗略的尝试:

(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)))))

一个更有原则的实施将检查杀戮的文本,并做一些合理的事情,如果它不是一个数字。

答案 1 :(得分:1)

使用digit-argument作为模板,我写了这个,似乎运作得很好:

(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)

安排将被杀死的数字显示在迷你缓冲区中,就像你直接输入它一样,留作练习。