Gibt es ein Äquivalent zu sed-style Substitutionsbefehlen von vim?

14

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?

Larry Coleman
quelle

Antworten:

7

evilbietet eine abgespeckte Version von ex, daher ist es wahrscheinlich am besten anzunehmen, dass es sich nicht um ein genaues Drop-In handelt. Das Beispiel, das Sie angegeben haben, funktioniert jedoch sofort, vorausgesetzt, der Punkt befindet sich vor der ersten Zeile (dh der beginZeile in Ihrem Beispiel).

Dan
quelle
In vim würde die Suche auch an einem Punkt beginnen, so dass sich anhört, wonach ich gesucht habe. Vielen Dank!
Larry Coleman
8

Hier ist eine Möglichkeit, die nur die eingebaute Funktionalität nutzt:

  1. Mit Punkt in der Zeile, die das erste Vorkommen von enthält begin, drücken Sie C-SPC.

  2. Zum nächsten Vorkommen von end:

    C-s end RET

  3. Ersetzen foodurch bar:

    M-% foo RET bar RET !

Dies macht sich die Tatsache query-replacezunutze , dass die aktive Region anstelle des gesamten Puffers (falls vorhanden) bearbeitet wird.


Natürlich können Sie auch einen benutzerdefinierten Befehl definieren:

(defun replace-from-to (beg end str repl)
  (interactive "sBegin: \nsEnd: \nsString: \nsReplacement: ")
  (save-excursion
    (goto-char (point-min))
    (let ((start-pos (search-forward beg))
          (end-pos (search-forward end)))
      (replace-string str repl nil start-pos end-pos))))

Dieser Befehl wird immer von Anfang des Puffers suchen, so Punkt nach sein kann begin/ foo/ endwenn Sie rufen Sie es.

Richten Sie eine Schlüsselbindung dafür ein über:

(global-set-key (kbd "C-c r") 'replace-from-to)
itsjeyd
quelle
5

Im Allgemeinen ist dies etwas, narrow-to-regionfü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 tippen M-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 ein M-x widen, um den Pufferinhalt wiederherzustellen.

Elias Mårtenson
quelle
4
Wenn begin/ endTrennzeichen in einer Programmiersprache sind, können Sie wahrscheinlich C-M-Spacemit run mark-sexpdie Region in einem Befehl auswählen.
21.
1
Standardbindungen: C-x n n( narrow-to-region) und C-x n w( widen).
itsjeyd