Ich hatte eine Situation, in der ich FOO mit BAR durch eine Datei ersetzen wollte; Ich möchte es jedoch nur an bestimmten Stellen tun, etwa zwischen den Zeilen 68-104, 500-537 und 1044-1195. In der Praxis ließ ich Markierungen (ma, mb, mc, ...) an den interessierenden Linien fallen, und ich ließ folgendes laufen:
%Vor%Ich musste dies dutzende Male mit verschiedenen Such- und Ersetzungsbegriffen s / CAT / DOG usw. wiederholen, was ein Problem war, jedes Mal die Befehlszeile neu schreiben zu müssen. Ich hatte Glück, dass ich nur 3 Orte hatte, auf die ich meine Suche beschränken wollte (stell dir vor, es wären 30 oder 40, wie unordentlich die Befehlszeile würde).
Wenn Sie eine Funktion nicht schreiben, gibt es eine bessere Möglichkeit, dies zu tun?
Zu einer verwandten Notiz. Ich kopierte FOO in das 's' (Such-) Register und BAR in das 'r' (Ersetzen) und versuchte eine Befehlszeile von
%Vor%Dies hätte mir erspart, die Befehlszeile jedes Mal neu schreiben zu müssen, aber leider hat es nicht funktioniert. Das Ersetzen-Bit war in Ordnung \ = @ r, aber das \ = @ s im Suchmuster gab einen Fehler.
Irgendwelche Tipps würden geschätzt.
Wenn Sie eine Reihe von zeilenweisen Operationen (z. B. Substitutionen) in einer Reihe von verschiedenen Zeilenbereichen durchführen müssen, können Sie diese Zeilen anders aussehen lassen, indem Sie zuerst ein Präfix hinzufügen (das ist nicht der Fall) von einer der anderen Linien geteilt).
Die übliche Vorgehensweise besteht darin, die gesamte Datei in der ersten Zeile mit >G
einzurücken und dann entweder :s/^ /X/
commands oder block-visual zu verwenden, um die führenden Leerzeichen durch X in den Zeilen I zu ersetzen will.
Verwenden Sie dann :g
in Verbindung mit :s
. zB:
Entfernen Sie abschließend die temporären Präfixe.
inspiriert von @ Vdts Antwort:
Ich bin mir nicht sicher, aber Sie könnten alle Ersetzungen in eine Datei schreiben und die Datei, die ich denke, einlesen.
substitutions.vim
:
und dann :so substitutions.vim
vielleicht können Sie das auch für mehrere Dateien gleicher Struktur verwenden. Sie können ein e
hinzufügen, um eine Ignorier-Fehlermeldung hinzuzufügen, wenn nicht klar ist, dass die Substitutionen in den entsprechenden Zeilenblöcken gefunden werden.
Mit q:
können Sie vorherige Befehlszeilen aufrufen und sie als normalen Vim-Puffer bearbeiten, so dass Sie FOO
und BAR
schnell durch etwas anderes ersetzen und die Zeile mit Enter erneut ausführen können .
Das s/\=@s/\=@r/
funktioniert nicht. wie du schon sagtest, funktioniert das nur im ersatzteil. Aber für das Muster können Sie Strg + R Strg + R s verwenden um den Inhalt von Register s anstelle von \=@s
einzufügen. Verwenden Sie vorzugsweise das Standardregister, dann ist es ein einfaches s//
, aber Sie wissen das wahrscheinlich schon.
Wenn er über eine geschlossene Falte ausgeführt wird, sind die Substitutionen auf diese Faltung beschränkt.
:s/foo/bar<CR>
zj
oder zk
zur nächsten geschlossenen Falte
:<C-p><CR>
oder :<Up><CR>
, um dieselbe Ersetzung durchzuführen Sie können auch das c
-Flag am Ende Ihrer Ersetzung hinzufügen, so dass Vim Sie um eine Bestätigung bittet, bevor Sie es ausführen. Dies kann mühsam sein, wenn Sie viele Übereinstimmungen haben.