5

我的问题建立在Trey JacksonSyntaxT3rr0r 的这个问题的回答之上

Trey 提出了以下函数,用于在 Emacs 缓冲区的选定区域中递增每个两位数。

(defun add-1-to-2-digits (b e)
  "add 1 to every 2 digit number in the region"
  (interactive "r")
  (goto-char b)
  (while (re-search-forward "\\b[0-9][0-9]\\b" e t)
    (replace-match (number-to-string (+ 1 (string-to-int (match-string 0)))))))

我想将此功能用于我自己的目的。但是,我想连续多次增加数字。当前形式的函数的问题在于,在每次调用之前,我必须用鼠标再次选择该区域。

我的问题是:如何修改 Trey 的函数,以便在调用后保留选定的区域?(我的最终目标是将此功能分配给键盘快捷键(类似于ctrl+↑</kbd>) so that I if I keep the ctrl and ↑</kbd> keys held down, all the two-digit numbers in my selected region will continuously increase.)

顺便说一句,我知道Brian Campbell 的这个答案,它建议使用exchange-point-and-mark重新选择以前选择的区域。但是,我试过了,在这种情况下似乎没有帮助。

4

2 回答 2

5

这是您的函数修改为使用let (deactivate-mark)Wrapped inside save-excursion,如链接到的答案用户 event_jr 中所建议:

https://stackoverflow.com/a/11080667/903943

(defun add-1-to-2-digits (b e)
  "add 1 to every 2 digit number in the region"
  (interactive "r")
  (save-excursion
    (let (deactivate-mark) 
      (goto-char b)
      (while (re-search-forward "\\b[0-9][0-9]\\b" e t)
        (replace-match (number-to-string (+ 1 (string-to-int (match-string 0)))))))))
于 2013-04-14T18:53:11.253 回答
4

您需要绑定 deactivate-mark 以防止它被设置见:

https://stackoverflow.com/a/11080667/903943

手册:http ://www.gnu.org/software/emacs/manual/html_node/elisp/The-Mark.html#index-deactivate_002dmark-2801

于 2013-04-14T16:56:48.487 回答