【发布时间】:2013-04-14 16:11:24
【问题描述】:
我的问题建立在this answer by Trey Jackson 到this question from SyntaxT3rr0r 之上。
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 和 ↑ 键,我的所有两位数字所选区域将不断增加。)
顺便说一句,我知道this answer by Brian Campbell,它建议使用exchange-point-and-mark 重新选择以前选择的区域。但是,我试过了,但在这种情况下似乎没有帮助。
【问题讨论】:
-
+1 但请注意,您在此处粘贴的不是宏,而是函数。 elisp 中的 defun 定义了一个函数,而不是宏:)(我编辑了您的问题并将“宏”更改为“函数”)。请注意,Lisp 方言中的宏是完全不同的野兽:)
-
可能是一个愚蠢的建议,但是......即使在第一次调用快捷方式后看不到所选区域,您不能一次又一次地调用该方法吗?在我的系统上,使用按原样编写的函数不断增加和增加。
-
哦,真的吗?嗯,这不会发生在我身上。我用鼠标突出显示一个区域,然后我执行
M-x add-1-to-2-digits,这会增加数字,然后我再次输入M-x add-1-to-2-digits,这一次没有任何反应。我想知道我们在做什么不同? -
如果不添加
save-excursion,您的函数将移动指向区域的末尾。因此,如果最初标记位于起点而点位于终点,则可以重复该功能。但是如果点在开头,标记在结尾,那么在第一次调用之后,点和标记都在结尾的同一个字符上,以此类推,下一次调用该区域为空。save-excursion规避了这个问题。 (n.b. 用鼠标点击的位置是标记,拖动到的位置是点。)另外请注意,您可以使用M-x add-1-to-2-digits RET C-x z z z z z...