我想在调用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)))
答案 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)))
您忘记在[[:digit:]]
前面加上减号。
您需要使用词法绑定或构建一个绑定start
,end
和current-prefix-arg
(或decrement
的当前值的命令 - 请参阅下一页)。
如果使用参数而不是current-prefix-arg
,它会更简单一些。
(你问是否可以使用current-prefix-arg
而不是为它添加arg。是的。在这种情况下,在构造的命令中绑定current-prefix-arg
,以便为后续调用调用它。)
由于替换可以更改数字中的位数(例如从9
到10
,因此您需要使用标记而不是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)))