Vim suchen und ersetzen - auf bestimmte Zeilen beschränken

8

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.

    
Dave Doran 22.06.2012, 19:21
quelle

6 Antworten

5

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:

%Vor%

Entfernen Sie abschließend die temporären Präfixe.

    
Laurence Gonsalves 22.06.2012 19:55
quelle
4

Um die Notwendigkeit zu beseitigen, Suchmuster, Substitution erneut einzugeben string und flags kann man einfach den Befehl :& mit dem & -Flag:

verwenden %Vor%     
ib. 23.06.2012 02:43
quelle
3

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 :

%Vor%

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.

    
epsilonhalbe 22.06.2012 20:11
quelle
2

Verwenden Sie anstelle von Marker diesen:

:68,104s/FOO/BAR/g << substitue from line 68 to 104

Dies sollte Ihre Arbeit ein wenig einfacher und klarer machen.

    
nXqd 22.06.2012 19:38
quelle
2

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.

    
Ingo Karkat 22.06.2012 20:03
quelle
2

Wenn er über eine geschlossene Falte ausgeführt wird, sind die Substitutionen auf diese Faltung beschränkt.

  1. Falten Sie jede Region
  2. den Cursor auf eine geschlossene Falte setzen
  3. Führen Sie die Ersetzung durch: :s/foo/bar<CR>
  4. gehe mit zj oder zk zur nächsten geschlossenen Falte
  5. Verwenden Sie den Befehlszeilenverlauf: :<C-p><CR> oder :<Up><CR> , um dieselbe Ersetzung durchzuführen
  6. wiederhole ...

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.

    
romainl 22.06.2012 22:07
quelle

Tags und Links