Blenden Sie alle (nicht) übereinstimmenden Linien in Vim aus

87

Ist es möglich, alle übereinstimmenden Zeilen in vi oder Vim ein- / auszublenden? Nicht hervorheben, sondern nur diese Linien anzeigen.

Zum Beispiel habe ich einen Text mit Wort das Wort ERROR. Wie kann ich dafür sorgen, dass nur Zeilen angezeigt werden, die enthalten, ERRORund wie werden nur Zeilen ohne ERRORangezeigt?

Gibt es eine Lösung, ohne alle übereinstimmenden Zeilen zu löschen und sie dann einfach rückgängig zu machen?

Alex Bolotov
quelle

Antworten:

106

Kennen Sie den :globalBefehl? Macht das was du willst?

:g/ERROR

und für das Gegenteil:

:g!/Error

oder gleichwertig:

:v/Error
user55400
quelle
18
Das ist nicht sehr gut. Sobald Sie nach unten scrollen, wird der Befehl beendet und alles wird wieder angezeigt. Es verbirgt diese Inhalte nicht wirklich.
Kan Li
@KanLi drücken g<, um erneut zu sehen, oder @:wenn Sie nicht ausgeführt haben und Befehle.
D. Ben Knoble
52

Ein anderer Ansatz, der von Ihrem Anwendungsfall abhängt, ist die Verwendung von vimgrep und dessen Ergebnissen in Quickfix . Sie können Folgendes tun:

:vimgrep pattern %durchsucht die aktuelle Datei und bringt Sie zum ersten Suchergebnis. Noch wichtiger ist, dass die Ergebnisse auch in die "Quickfix-Liste" aufgenommen werden.

:copenöffnet dann die Quickfix-Liste in einem separaten Quickfix-Fenster. Sie haben also ein separates Fenster mit allen Zeilen Ihres letzten Vimgrep. Innerhalb des Quickfix-Fensters können Sie dann die Eingabetaste drücken oder auf eine Zeile doppelklicken, um zur entsprechenden Zeile in Ihrer Originaldatei zu springen.

:colderHiermit können Sie zu älteren Quickfix-Listen zurückkehren (ältere vimgrep-Ergebnisse). Und :cnewergeht weiter zu neueren Suchergebnissen.

Beachten Sie, dass die Quickfix-Liste auch beim Ausführen aktualisiert wird :make(weshalb sie als Quickfix zur Fehlerbehebung bezeichnet wird). Aus diesem Grund gibt es auch eine Alternative zur Quickfix-Liste, die als "Standortliste" bezeichnet wird. Um es zu nutzen , anstatt verwenden Sie :lvimgrep, dann l-Präfix - Befehle anstatt c-Präfix - Befehle zur Verfügung - :lopen, :lolder, :lnewer.

Natürlich können Sie noch viel mehr tun. Siehe :help quickfixfür weitere Informationen.

PS: Sie sagten, Sie wollten keinen Ansatz, bei dem Zeilen gelöscht und dann rückgängig gemacht werden. Aber da Sie g/ERRORals Antwort markiert haben, dachte ich, ich würde darauf hinweisen, dass ein schneller und schmutziger Weg zu tun ist g!/ERROR/d. Sie können es dann einfach mit rückgängig machen u. Zu Ihrer Information können Sie auch :set hlsearchMuster hervorheben, die mit :gBefehlen übereinstimmen .

studgeek
quelle
1
Vielen Dank für den Tipp zu ": g! / ERROR / d" besser als die akzeptierte Antwort.
VinGarcia
Können Sie dies mit Linien tun, die nicht zum Muster passen?
Jacktose
26

Der beste Weg, dies zu tun, ist->

:vimgrep /something/g % | copen

Dadurch wird die Liste der Übereinstimmungen für Ihr Keyword geöffnet und nur die übereinstimmenden Zeilen im Quickfix-Fenster angezeigt.

Ersetzen Sie% durch den Pfad zur Datei, wenn Sie die aktuelle Datei nicht berücksichtigen.

Shivendra
quelle
1
Ersetzen Sie% durch den Dateipfad, wenn Sie die aktuelle Datei nicht berücksichtigen.
Shivendra
Können Sie dies mit Linien tun, die nicht zum Muster passen?
Jacktose
1

:vimgrep /something/g % | copenfunktioniert super. Auch :g/<pattern>/dkann zu löschen Linien mit dem Muster verwendet werden ,

Sevvalai
quelle
Dies ist genau eine andere Antwort auf diese Frage.
Shivendra
1

Falls Sie zufällig verwenden, können fzfSie Folgendes verwenden:

  • :Lines in allen geöffneten Dateien
  • :BLines nur im offenen Puffer
  • :Rg [pattern] mit ripgrep
minusf
quelle
1

Eine hackige schmutzige Art, dies zu tun:

:w (save)
ggdG (deletes everything)
:.!grep something % (replace current line with grep output)
Boris Churzin
quelle
0

Sie meinen wahrscheinlich Befehl in weniger vi vim & / pattern /, der Zeilen zeigt, die / pattern / enthalten (wie grep).

Charkh
quelle