Ich möchte alle Vorkommen einer Zeichenfolge (z. B. Zeichenfolge1) durch eine andere Zeichenfolge (z. B. Zeichenfolge2) ändern und umgekehrt. Um genau zu sein, habe ich ein langes Dokument und diese Zeichenfolgen kommen oft vor. Was ich derzeit mache, ist, string1 -> string3, dann string2 -> string1 und schließlich string3 -> string2 zu ersetzen.
Ich frage mich, ob es in emacs bereits eine Funktion gibt, die dies tut. Andere Lösungen sind willkommen.
Bearbeiten : Dies ist tatsächlich ein Duplikat der im Kommentar verknüpften Frage. Das Problem ist jedoch, dass die akzeptierte Antwort auf diese Frage nicht immer funktioniert (siehe Kommentar unten). Ich denke, es ist besser zu warten, bis der Autor dieser akzeptierten Antwort seine / ihre Antwort korrigiert oder eine andere Lösung herauskommt. Zweitens habe ich vor dem Posten meiner Frage die Frage gegoogelt und diese Frage wurde nicht angezeigt. Ich denke, zwei doppelte Fragen zu haben ist manchmal nützlich, da sie unterschiedliche Formulierungen verwenden und wenn ein Benutzer die doppelte findet, kann er die richtige finden.
Bearbeiten 2: Die akzeptierte Antwort der Such- / Ersetzungsfunktion zum Austauschen von Text scheint jetzt in Ordnung zu sein.
quelle
backwards
undregion-noncontiguous-p
) im Aufruf vonperform-replace
auskommentieren, funktioniert dies hier (emacs 24.3). Ich werde es auf Emacs 25 testen, wenn ich eine Gelegenheit bekomme, bevor ich die andere Antwort bearbeite.Antworten:
Für den interaktiven Fall kann query-replace-regexp (CM-%) dies unter Verwendung des relativ unbekannten \ für das Ersetzen tun.
Wenn der Ersatztext \ enthält, gefolgt von einem lisp-Ausdruck, wird der Wert dieses Ausdrucks als Ersatz verwendet. In diesem Fall ist der Ausdruck ein "if", das eine Bedingung und den Rückgabewert für die wahren und falschen Fälle annimmt.
In den Kommentaren wird empfohlen, zu verwenden
Dies funktioniert, weil \ 1 "string1" ist, wenn das Muster mit string1 übereinstimmt, und ansonsten null ist. Lisp nimmt jeden Nicht-Null-Wert als wahr an. Während dies funktioniert und kürzer ist, denke ich, dass meine Antwort nützlicher ist. Ich denke, der Code ist für jemanden besser lesbar, dessen Lisp-Wissen begrenzt ist. Es hat einen zweiten Vorteil, da es immer noch funktioniert, wenn das "von" -Muster als angegeben wird
oder auch
quelle
\,(if \1 "string2" "string1")
unter Verwendung des regulären Ausdrucks vor\(string1\)\|string2
.(emacs) Regexp Replace
.Nun, vielleicht wäre das mit einem Makro einfach:
F3C-s
a
RETC-bM-tF4. Wenn Sie dieses Makro für Ihre Frage verwenden, wird das folgende Ergebnis angezeigt:Ich transponiere Positionen zwischen jedem Wort nach einem
a
und diesem Wort. Sie können ein solches Makro später bearbeiten, um auch andere Wörter zu transponieren, ohne das gesamte Makro neu definieren zu müssen. Sie können das Makro mit bearbeiten C-xC-kRET.quelle