2013-04-14 35 views
5

我的问题建立在this answer by Trey Jacksonthis question from SyntaxT3rr0r之间。emacs运行后选择离开区域

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

+1但请注意,这里粘贴的内容不是宏而是函数。 * defun *在elisp中定义了一个函数,而不是宏:)(我编辑了你的问题,并将“宏”改为“函数”)。请注意,Lisp方言中的宏是完全不同的野兽:) – TacticalCoder

+1

可能是一个愚蠢的建议,但是......即使在第一次调用快捷方式后没有看到所选区域,是不是可以再次调用该方法并且再次?在我的系统上,编号保持不变,并且按原样编写函数。 – TacticalCoder

+0

真的吗?嗯,这不会发生在我身上。我用鼠标突出显示一个区域,然后我用'Mx add-1-to-2-digits'来增加数字,然后再次输入'Mx add-1-to-2-digits',这次什么都没发生。我想知道我们做了什么改变? –

回答

5

这里的的建议在回答您的修改为使用包裹在里面save-excursionlet (deactivate-mark)功能用户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)))))))))