Emacs abfrage ersetzen mit Text Transformation
Frage
Ich möchte einen beliebigen Text in einer Datei zu finden, die einen regulären Ausdruck des Formulars übereinstimmt t [A-Z]
u (dh ein Spiel t gefolgt von einem Großbuchstaben und ein anderes Spiel u , und verwandelt den gefundenen Text, so dass der Großbuchstabe Klein ist z. B. für die regexp x[A-Z]y
xAy
wird
xay
und
xZy
wird
xzy
Emacs' query-replace
Funktion erlaubt es zurück Verweise, aber AFAIK nicht die Transformation des angepassten Text. Gibt es eine eingebaute Funktion, die dies tut? Hat jemand eine kurze Elisp Funktion, die ich verwenden könnte?
UPDATE
@Marcel Levy hat es: \,
in einem Ersatz Ausdruck führt einen (willkürlichen?) Elisp Ausdruck. Zum Beispiel die Lösung des oben ist
M-x replace-regexp <RET> x\([A-Z]\)z <RET> x\,(downcase \1)z
Lösung
Es sieht aus wie Steve Yegge tatsächlich geschrieben bereits die Antwort auf diese ein paar Jahre zurück: "Shiny und Neu: Emacs 22." Blättern Sie nach unten zu „Ändern Fall in Ersatz Strings“ und Sie werden seinen Beispielcode mit der replace-regexp
Funktion sehen.
Die allgemeine Antwort ist, dass Sie „\“ verwenden, um all Lisp-Ausdruck als Teil der Ersatzzeichenfolge zu nennen, wie in \,(capitalize \1)
. Lesen Hilfetext, es sieht aus wie es nur im interaktiven Modus ist, aber das scheint wie der Ort, wo dies wäre nötigsten.
Andere Tipps
Eine Alternative in diesem Fall zu QRR ist die Aufnahme eines Makros und Wiedergabe es. (Isearch-forward-regexp, wählen Sie den Charakter, downcase-Region.) Ich on the fly Makros einfacher finden, da Sie sofort Feedback erhalten, wenn Ihr regexp falsch ist.
Ich würde tun dies mit einem Makro als gut, aber nur, weil Code innerhalb einer Ersatz-String für einen regulären Ausdruck Ausführung ist mir sehr intuitiv. Wenn Sie ein Batch-Skript oder etwas schreiben, welcher sich sehr schnell gehen muss, \, ist sicherlich der Weg zu gehen.