2013-04-14 9 views
5

Meine Frage baut auf this answer by Trey Jackson zu this question from SyntaxT3rr0r.Verlassen Region nach Emacs Betrieb

Trey schlägt die folgende Funktion vor, um jede zweistellige Zahl in der ausgewählten Region eines Emacs-Puffers zu inkrementieren.

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

Ich möchte diese Funktion für meine eigenen Zwecke verwenden. Allerdings würde ich gerne die Zahlen mehrmals nacheinander erhöhen. Das Problem mit der Funktion in ihrer aktuellen Form ist, dass ich vor jedem Aufruf die Region mit meiner Maus erneut auswählen muss.

Meine Frage ist: Wie kann Trey-Funktion geändert werden, so dass es die Region nach dem Aufruf ausgewählt bleibt? (Mein Ziel ist diese Funktion eine Tastenkombination zuweisen (so etwas wie ctrl + ), so dass ich, wenn ich halten die ctrl und Tasten gedrückt gehalten wird, werden alle zweistellige Zahlen in Meine ausgewählte Region wird kontinuierlich zunehmen.)

Übrigens ist mir bekannt, this answer by Brian Campbell, die unter Verwendung exchange-point-and-mark vorschlägt, eine zuvor ausgewählte Region erneut auszuwählen. Allerdings habe ich das versucht, und es scheint in diesem Fall nicht zu helfen.

+1

+1 aber beachte, dass das, was du hier eingefügt hast, kein Makro ist, sondern eine Funktion. * defun * in elisp definiert eine Funktion, kein Makro:) (Ich habe Ihre Frage bearbeitet und "Makro" in "Funktion" geändert). Beachten Sie, dass Makros in Lisp-Dialekten insgesamt ein anderes Biest sind:) – TacticalCoder

+1

vielleicht ein dummer Vorschlag aber ... Auch wenn Sie die gewählte Region nach dem ersten Aufruf Ihrer Verknüpfung nicht sehen, können Sie die Methode nicht einfach nochmal aufrufen und nochmal? Auf meinen System-Nummern gehen weiter und weiter mit der geschriebenen Funktion wie es ist. – TacticalCoder

+0

Oh wirklich? Hm, das passiert mir nicht. Ich markiere eine Region mit meiner Maus, dann mache ich "Mx add-1-to-2-digits", was die Zahlen inkrementiert, und dann tippe ich noch einmal 'Mx add-1-to-2-digits' und diesmal nichts passiert. Was machen wir anders, frage ich mich? –

Antwort

5

Hier ist Ihre Funktion let (deactivate-mark) innerhalb save-excursion gewickelt verwenden modifiziert, wie in der Antwort vorgeschlagen user event_jr verknüpft mit:

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