Hide all (not)matching lines in Vim

VimVi

Vim Problem Overview


Is it possible to show/hide all matching lines in vi or Vim? Not highlight but just show only those lines.

For example I have a text with word the word ERROR. How do I make it show only lines containing ERROR and how to show only lines without ERROR?

Is there a solution without deleting all matching lines and then just undoing it?

Vim Solutions


Solution 1 - Vim

Do you know about the :global command? Does this do what you want?

:g/ERROR

and for the opposite:

:g!/Error

or equivalently:

:v/Error

Solution 2 - Vim

Another approach depending on your use case would be using vimgrep and its results in quickfix. You can do the following:

:vimgrep pattern % will search the current file and take you to the first search result. More importantly it also puts the results in the "quickfix list".

:copen will then open the quickfix list in a separate quickfix-window. So you will have a separate window with all lines from your last vimgrep. Inside the quickfix-window you can then hit Enter or double-click on a line to jump to the corresponding line in your original file.

:colder will let you go back to older quickfix lists (older vimgrep results). And :cnewer goes forward to newer search results.

Note that the quickfix list is also updated when running :make (which is why its called quickfix for fixing errors). Because of this there also is an alterative to the quickfix list called the "location list". To use it instead you use :lvimgrep, then use l-prefixed commands rather than c-prefixed commands - :lopen, :lolder, :lnewer.

There is, of course, a lot more you can do. See :help quickfix for more info.

PS, You said you didn't want an approach that deletes lines and then undoing them. But since you marked g/ERROR as the answer I thought I would point out a quick and dirty way is to do g!/ERROR/d. You can then easily undo it using u. Also FYI, you can do :set hlsearch to highlight patterns matched with :g commands.

Solution 3 - Vim

You can use

:g/ERROR/

to print all the lines with ERROR

Also there is a Vim plugin which I saw many times but didn't use: foldsearch : fold away lines that don't match a given pattern

Solution 4 - Vim

The best way to do this is->

:vimgrep /something/g % | copen

This will open the list of matches for your keyword and also will show only the matched lines in quickfix window.

Replace % with path to file if not considering the current file.

Solution 5 - Vim

:vimgrep /something/g % | copen works awesome. Also :g/<pattern>/d can be used to delete lines with the pattern

Solution 6 - Vim

in case you happen to use fzf you could use:

  • :Lines in all open files
  • :BLines only in open buffer
  • :Rg [pattern] using ripgrep

Solution 7 - Vim

Some hackish dirty way to do this:

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

Solution 8 - Vim

You probably mean command in less vi vim & /pattern/ which shows lines containing /pattern/ (like grep).

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlex BolotovView Question on Stackoverflow
Solution 1 - Vimuser55400View Answer on Stackoverflow
Solution 2 - VimstudgeekView Answer on Stackoverflow
Solution 3 - VimMykola GolubyevView Answer on Stackoverflow
Solution 4 - VimShivendraView Answer on Stackoverflow
Solution 5 - VimsevvalaiView Answer on Stackoverflow
Solution 6 - VimminusfView Answer on Stackoverflow
Solution 7 - VimBoris ChurzinView Answer on Stackoverflow
Solution 8 - VimcharkhView Answer on Stackoverflow