2013-04-14 3 views
5

La mia domanda si basa su this answer by Trey Jackson a this question from SyntaxT3rr0r.Lasciare la regione selezionata dopo l'operazione emacs

Trey propone la seguente funzione per l'incremento di ciascun numero a due cifre nell'area selezionata di un buffer 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))))))) 

Vorrei utilizzare questa funzione per i miei scopi. Tuttavia, vorrei aumentare i numeri più volte in successione. Il problema con la funzione, nella sua forma attuale, è che prima di ogni invocazione, devo selezionare nuovamente la regione con il mio mouse.

La mia domanda è: Come si può modificare la funzione di Trey in modo che lasci la regione selezionata dopo l'invocazione? (Il mio obiettivo finale è quello di assegnare questa funzione ad un tasto di scelta rapida (si parla di Ctrl + ) in modo che io, se tengo la ctrl e tasti premuti, tutti i numeri a due cifre in la mia regione selezionata aumenterà continuamente.)

A proposito, sono a conoscenza di this answer by Brian Campbell, che suggerisce di utilizzare nuovamente exchange-point-and-mark per selezionare una regione selezionata in precedenza. Tuttavia, l'ho provato, e in questo caso non sembra essere d'aiuto.

+1

+1 ma si noti che ciò che è stato incollato qui non è una macro ma una funzione. * defun * in elisp definisce una funzione, non una macro:) (Ho modificato la tua domanda e cambiato "macro" in "funzione"). Nota che le macro nei dialetti Lisp sono una bestia diversa del tutto:) – TacticalCoder

+1

forse un suggerimento stupido ma ... Anche se non vedi la regione selezionata dopo la prima chiamata al tuo collegamento, non puoi semplicemente chiamare di nuovo il metodo e ancora? Sul mio sistema i numeri continuano a salire e in su con la funzione scritta così com'è. – TacticalCoder

+0

Oh davvero? Hm, questo non succede per me. Metto in evidenza una regione con il mio mouse, poi faccio 'Mx add-1-to-2-digit', che incrementa i numeri, e poi digito' Mx add-1-to-2-digit' di nuovo, e questa volta non accade nulla. Cosa stiamo facendo in modo diverso, mi chiedo? –

risposta

5

Ecco la tua funzione modificati per utilizzare let (deactivate-mark) avvolto all'interno save-excursion come suggerito nella risposta utente event_jr collegato a:

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)))))))))