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?


Antworten:


106

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

:g/ERROR

und für das Gegenteil:

:g!/Error

oder gleichwertig:

:v/Error

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 .


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.


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 ,


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

1

Eine hackige schmutzige Art, dies zu tun:

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

0

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.