2013-04-14 45 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)))))))))