Löschen / Ändern des gesuchten Textes in Vim

8

Wenn ich interaktiv nach einem Muster suche, bekomme ich jedes Mal, wenn ich n drücke, das nächste Ergebnis. Wie lösche / ändere ich jedes Ergebnis, zu dem ich komme?

Idealerweise würde das, wonach ich suche, so funktionieren: Ich suche n , um das Suchergebnis zu erhalten, und dann magic command , um das Ergebnis im visuellen Modus hervorzuheben, und dann kann ich% co_de machen % oder d , um den markierten Text zu löschen oder zu ändern.

Beispiel :

Ich gebe den Befehl

ein %Vor%

und stimmt mit c , einem Leerzeichen und einem beliebigen nachfolgenden Zeichen überein.

Also sagen wir, das erste Match, das es erreicht, ist "Hallo w".

Nun möchte ich alle hello löschen, suche nach der nächsten Übereinstimmung (zB hello w ), ändere die nächste Übereinstimmung in hello a und mache weiterhin verschiedene Dinge für jede Übereinstimmung.

Ich suche nicht nur nach Suchen und Ersetzen, denn ich möchte jede Aktion für jedes Ergebnis interaktiv ausführen können, z. B. das erste Ergebnis löschen, das zweite Ergebnis durch ersetzen hello there , und ersetzen Sie das dritte Ergebnis durch bye .

    
Chetan 21.10.2010, 04:15
quelle

7 Antworten

12

Um die gesamte Übereinstimmung der aktuellen Übereinstimmung auszuwählen (wenn Sie zu Beginn der Übereinstimmung sind), können Sie

eingeben %Vor%

Um bis zum Ende des Matches zu löschen

%Vor%

Um die Übereinstimmung zu ändern

%Vor%

Nur negativ ist, dass Sie n nicht verwenden können (da wird //e wiederhergestellt) und stattdessen //

verwenden

Ein typischer Workflow würde so aussehen

%Vor%     
Michael Anderson 21.10.2010, 05:18
quelle
3

Ich denke du willst gn : (Gehe zum nächsten Spiel und wähle es im visuellen Modus aus. Sie können dies mit einem Befehl voranstellen, z. cgn ändert die Übereinstimmung, dgn löscht usw. Ich habe festgestellt, dass diese Übereinstimmung verwendet wird, wenn sie bereits auf einer Übereinstimmung liegt, damit dies geschehen sollte.

    
rainmaker 31.08.2014 15:32
quelle
2

Ich würde tun, was ein früheres Poster vorgeschlagen hat: Konstruiere einen einzelnen Löschbefehl mit d target und drücke. nach der Verwendung von n, um jedes Vorkommen zu finden. In diesem Fall würde 7x alles löschen, das mit hello . übereinstimmt. Dies ist eine Abkürzungform von d7l oder d7[space] , da d einen beliebigen Bewegungsbefehl übernimmt.

Wenn Sie jedoch eine wirklich allgemeine Lösung zum Suchen und Löschen einer Regexp suchen, können Sie einen einzelnen Ersetzungsbefehl ausführen (selbst wenn dieser fehlschlägt) und dann Ihre Suche ausführen und & amp; die letzte Ersetzung der aktuellen Zeile erneut anwenden:

%Vor%

Die erste Zeile (die Ersetzung) kann fehlschlagen. Sie können es immer noch mit & amp; später. Ich bin irgendwie überrascht, dass der erste Substitutionsbefehl nicht das Standardmuster setzt, aber vielleicht tut es in vi anders als vim.

    
Ben Jackson 21.10.2010 04:43
quelle
1

Ändern Sie die erste, indem Sie cwfoo esc oder was auch immer verwenden, und verwenden Sie dann den Befehl . , um diese Änderung für jedes weitere Vorkommen zu wiederholen, das Sie ändern möchten.

    
Greg Hewgill 21.10.2010 04:19
quelle
1

Sie suchen nach "Bestätigen"

%Vor%

: um in den ex-Modus zu wechseln,% um den ganzen Puffer zu übernehmen, s um ihn zu ersetzen, / hallo ./ um nach diesem regex zu suchen, // um ihn durch nichts zu ersetzen, g um nach allen Übereinstimmungen in einer Zeile zu suchen, und c, um zu bestätigen, ob vor jeder Übereinstimmung gelöscht werden soll.

Das geht davon aus, dass Sie nach Bestätigung suchen. Wenn du alles auf einmal machen willst, wurde es schon einige Male erwähnt.

%Vor%

: um in den ex-Modus zu wechseln,% für den gesamten Puffer, s zum Ersetzen, / hallo ./ zum Suchen nach diesem regulären Ausdruck, // um es durch nichts zu ersetzen und g, um nach allen Übereinstimmungen in einer Zeile zu suchen

    
Matt Briggs 21.10.2010 04:59
quelle
0

Drücken Sie die x-Taste.

oder Benutzer suchen und ersetzen: [esc] :%s/[search-regex]/[replace-regex]/g

Wenn replace-regex leer ist, werden Sie löschen, was Sie gerade gesucht haben.

    
shoebox639 21.10.2010 04:20
quelle
0

Wie wäre es mit Aufnahmen?

qa / textsearch HIT ENTER v9lvq

9 ist die (Länge der Textsuche - 1), d. h. 10 - 1 = 9

Wenn Sie nun die Aufnahme im Register 'a' vorbereitet haben, machen Sie @agv (@a: führt die Aufnahme mit dem Namen 'a' aus und gv wählt Ihren Suchtext aus.)

Jetzt können Sie mit dem ausgewählten Text alles machen. Wenn Sie fertig sind, können Sie mit dem nächsten Text fortfahren eins mit @@

hoffe das hilft ..

    
Aman Jain 21.10.2010 05:42
quelle