如何将current-prefix-arg传递给this-command

时间:2017-10-01 11:47:01

标签: search replace emacs key-bindings

我想在调用current-prefix-arg时重用this-command。我可以想象捕获其价值并将其传递给修改过的函数的方法。但是,这似乎不是一个很好的解决方案。我如何重用它(例如,将其推回到某种调用堆栈,或者emacs使用的任何东西)?

该示例是一个简单的函数,用于递增/递减区域I中的数字,只是在我要暂时绑定 i 以增加或减少(如果使用前缀调用)时。我是否可以在不向函数添加其他参数的情况下执行此操作,但只使用原始前缀?

(defun my-toggle-increment-numbers (start end)
  "Simple function to increment numbers in region. Decrement with prefix."
  (interactive "r")
  (let (deactivate-mark)
    (goto-char start)
    (while (re-search-forward "\\([[:digit:]]+\\)" end 'move)
      (replace-match (number-to-string
                      (+ (if current-prefix-arg -1 1)
                         (string-to-number (match-string 1))))
                     nil nil nil 1))
    ;; what is good way to reused the current-prefix-argument value when
    ;; calling this-command?
    (set-transient-map
     (let ((km (make-sparse-keymap)))
       (define-key km "i" this-command)
       km)
     t)))

2 个答案:

答案 0 :(得分:2)

试试这个:

(defun my-toggle-increment-numbers (start end &optional decrement)
  "Simple function to increment numbers in region. Decrement with prefix."
  (interactive "r\nP")
  (let (deactivate-mark)
    (setq start  (copy-marker start)
          end    (copy-marker end))
    (goto-char start)
    (while (re-search-forward "\\([-]?[[:digit:]]+\\)" end 'move)
      (replace-match (number-to-string (+ (if decrement -1 1)
                                          (string-to-number (match-string 1))))
                     nil nil nil 1))
    (set-transient-map
     (let ((km  (make-sparse-keymap)))
       (define-key km "i" `(lambda ()
                             (interactive)
                             (my-toggle-increment-numbers ',start ',end ',decrement)))
       km)
     t)))
  1. 您忘记在[[:digit:]]前面加上减号。

  2. 您需要使用词法绑定或构建一个绑定startendcurrent-prefix-arg(或decrement的当前值的命令 - 请参阅下一页)。

  3. 如果使用参数而不是current-prefix-arg,它会更简单一些。

    (你问是否可以使用current-prefix-arg而不是为它添加arg。是的。在这种情况下,在构造的命令中绑定current-prefix-arg,以便为后续调用调用它。)

  4. 由于替换可以更改数字中的位数(例如从910,因此您需要使用标记而不是end的数字值后续电话。

答案 1 :(得分:1)

我认为最干净的方法是创建一个命令,调用this-command传递前缀arg:

;; This relies on -*- lexical-binding:t -*-
(defun my-toggle-increment-numbers (start end)
  [...]
  (set-transient-map
   (let ((km (make-sparse-keymap))
         (tc this-command)
         (cpa current-prefix-arg))
     (define-key km "i"
       (lambda () (interactive)
         (let ((current-prefix-arg cpa))
           (call-interactively tc))))
     km)
   t)))

它可能比你想象的更冗长,但我认为它与你所要求的最接近。获得几乎相同结果的更简单方法可能是:

(defun my-toggle-increment-numbers (start end)
  [...]
  (setq prefix-arg current-prefix-arg)
  (set-transient-map
   (let ((km (make-sparse-keymap)))
     (define-key km "i" this-command)
     km)
   t)))