在emacs操作后保留选中的区域

在emacs操作后保留选中的区域,emacs,elisp,Emacs,Elisp,我的问题建立在你的基础上 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-strin

我的问题建立在你的基础上

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)+↑) 如果我保持ctrl和↑ 按住键,我所选区域中的所有两位数将持续增加。)


顺便说一句,我知道,这建议使用
交换点和标记来重新选择以前选择的区域。但是,我尝试了,在这种情况下似乎没有帮助。

您需要绑定deactivate mark以防止设置它。请参阅:


手动操作:

这是您的功能,已修改为使用
let(deactivate mark)
包装在
保存偏移
中,如回答用户事件中建议的那样链接到:


+1但请注意,您在此处粘贴的不是宏而是函数。elisp中的defun定义了函数,而不是宏:)(我编辑了您的问题,并将“macro”更改为“function”)。请注意,Lisp方言中的宏是一种完全不同的野兽:)可能是一个愚蠢的建议,但。。。即使在第一次调用快捷方式后没有看到所选区域,也不能一次又一次地调用该方法吗?在我的系统中,随着函数按原样编写,数字不断增加。哦,真的吗?嗯,这对我来说是不可能的。我用鼠标突出显示一个区域,然后我做
M-x add-1-to-2-digits
,这会增加数字,然后我再次键入
M-x add-1-to-2-digits
,这一次什么也没发生。我想知道我们的做法有什么不同?如果不添加
保存偏移
,您的函数将移动到区域的末尾。因此,如果最初标记位于起点,点位于终点,则可以重复该功能。但如果point在开始,mark在结束,那么在第一个调用point和mark在结束时都位于同一个字符上,因此下一个调用区域为空<代码>保存偏移
可避免此问题。(注意,用鼠标单击的位置是标记,拖动到的位置是点。)还请注意,您可以使用
M-x add-1-to-2-digits RET C-x z
。。。
(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)))))))))