Скрыть все (не) совпадающие строки в Vim

87

Можно ли показать / скрыть все совпадающие строки в vi или Vim? Не выделять, а просто показывать только эти линии.

Например, у меня есть текст со словом слово ERROR. Как сделать так, чтобы он отображал только строки, содержащие ERRORи как отображать только строки без ERROR?

Есть ли решение, не удаляя все совпадающие строки, а затем просто отменяя его?

Алексей Болотов
источник

Ответы:

109

Вы знаете о :globalкоманде? Это делает то, что вы хотите?

:g/ERROR

и наоборот:

:g!/Error

или эквивалентно:

:v/Error
user55400
источник
19
Это не очень хорошо. Как только вы прокрутите вниз, команда завершится, и все снова появится. На самом деле он не скрывает это содержимое.
Кан Ли
@KanLi нажмите, g<чтобы снова увидеть, или, @:если вы не запускали и команды.
Д. Бен Нобл
53

Другой подход, зависящий от вашего варианта использования, - использовать vimgrep и его результаты в quickfix . Вы можете сделать следующее:

:vimgrep pattern %выполнит поиск в текущем файле и перейдет к первому результату поиска. Что еще более важно, он также помещает результаты в «список быстрого исправления».

:copenзатем откроет список quickfix в отдельном окне quickfix. Таким образом, у вас будет отдельное окно со всеми строками из вашего последнего vimgrep. Затем в окне quickfix вы можете нажать Enter или дважды щелкнуть строку, чтобы перейти к соответствующей строке в исходном файле.

:colderпозволит вам вернуться к старым спискам quickfix (более старым результатам vimgrep). И :cnewerидет к новым результатам поиска.

Обратите внимание, что список быстрых исправлений также обновляется при запуске :make(поэтому он называется quickfix для исправления ошибок). Из-за этого также есть альтернативный список быстрого исправления, который называется «список местоположений». Для того, чтобы использовать его вместо того, чтобы использовать :lvimgrep, а затем использовать команды л-приставкой , а не команды с-приставкой - :lopen, :lolder, :lnewer.

Конечно, вы можете сделать гораздо больше. Увидеть:help quickfix Дополнительную информацию.

PS Вы сказали, что не хотите подход, который удаляет строки, а затем отменяет их. Но так как вы отметили g/ERRORкак ответ, я подумал, что укажу на быстрый и грязный способ g!/ERROR/d. Затем вы можете легко отменить это, используя u. Также, к вашему сведению, вы можете :set hlsearchвыделить шаблоны, соответствующие :gкомандам.

Studgeek
источник
1
Спасибо за подсказку по поводу ": g! / ERROR / d" лучше, чем принятый ответ.
VinGarcia
Можно ли это сделать с линиями, не соответствующими шаблону?
Jacktose,
37

Ты можешь использовать

:g/ERROR/

чтобы напечатать все строки с ERROR

Также есть плагин Vim, который я видел много раз, но не использовал: foldsearch: складывайте строки, которые не соответствуют заданному шаблону

Николай Голубев
источник
15
+1 за ссылку на плагин foldsearch. Это ненавязчиво и может пригодиться.
user55400
26

Лучший способ сделать это ->

:vimgrep /something/g % | copen

Это откроет список совпадений для вашего ключевого слова, а также покажет только совпавшие строки в окне quickfix.

Замените% на путь к файлу, если не учитываете текущий файл.

Шивендра
источник
1
Замените% на путь к файлу, если вы не рассматриваете текущий файл.
Шивендра
Вы можете сделать это с помощью линий не соответствующими шаблону?
Jacktose,
1

:vimgrep /something/g % | copenотлично работает. Также :g/<pattern>/dможет использоваться для удаления линий с рисунком

Севвалаи
источник
Это как раз еще один ответ на этот вопрос.
Шивендра
1

в случае, если вы используете, fzfвы можете использовать:

  • :Lines во всех открытых файлах
  • :BLines только в открытом буфере
  • :Rg [pattern] с помощью ripgrep
минусф
источник
1

Какой-то хакерский грязный способ сделать это:

:w (save)
ggdG (deletes everything)
:.!grep something % (replace current line with grep output)
Борис Чурзин
источник
0

Вы, вероятно, имеете в виду команду в less vi vim & / pattern /, которая показывает строки, содержащие / pattern / (например, grep).

чарх
источник