Eines der Dinge, die ich von vim vermisse, ist die Möglichkeit, einen Ersetzungsbefehl einzugeben, der über mehrere Zeilen hinweg funktioniert, zum Beispiel:
:/begin/,/end/s/foo/bar/g
Der obige Befehl ersetzt "foo" für "bar", beginnend mit der ersten Zeile, die "begin" enthält, und endend mit der nächsten Zeile, die "end" enthält.
Gibt es eine Möglichkeit, etwas Ähnliches in Emacs zu tun?
regular-expressions
replace
evil
vim-emulation
Larry Coleman
quelle
quelle
Hier ist eine Möglichkeit, die nur die eingebaute Funktionalität nutzt:
Mit Punkt in der Zeile, die das erste Vorkommen von enthält
begin
, drücken Sie C-SPC.Zum nächsten Vorkommen von
end
:C-s
end
RETErsetzen
foo
durchbar
:M-%
foo
RETbar
RET !Dies macht sich die Tatsache
query-replace
zunutze , dass die aktive Region anstelle des gesamten Puffers (falls vorhanden) bearbeitet wird.Natürlich können Sie auch einen benutzerdefinierten Befehl definieren:
Dieser Befehl wird immer von Anfang des Puffers suchen, so Punkt nach sein kann
begin
/foo
/end
wenn Sie rufen Sie es.Richten Sie eine Schlüsselbindung dafür ein über:
quelle
Im Allgemeinen ist dies etwas,
narrow-to-region
für das Sie verwenden würden .Sie bewegen den Cursor (z. B. durch Suchen) an den Anfang der Region und drücken
C-SPC
, dann an das Ende der Region und tippenM-x narrow-to-region
. Jetzt können Sie beliebige Such- und Ersetzungsbefehle ausführen, die nur für einen verengten Teil des Puffers gelten. Wenn Sie fertig sind, geben Sie einM-x widen
, um den Pufferinhalt wiederherzustellen.quelle
begin
/end
Trennzeichen in einer Programmiersprache sind, können Sie wahrscheinlichC-M-Space
mit runmark-sexp
die Region in einem Befehl auswählen.C-x n n
(narrow-to-region
) undC-x n w
(widen
).