Сховати всі (не) відповідні рядки у Vim


87

Чи можна показати / приховати всі відповідні рядки у vi або Vim? Не виділяйте, а просто показуйте лише ті рядки.

Наприклад, у мене є текст із словом слово ERROR. Як зробити так, щоб він показував лише рядки, що містять, ERRORі як показувати лише рядки без ERROR?

Чи є рішення без видалення всіх відповідних рядків, а потім просто скасування?


Відповіді:


107

Чи знаєте ви про :globalкоманду? Чи роби це те, що ти хочеш?

:g/ERROR

а для протилежного:

:g!/Error

або еквівалентно:

:v/Error

19
Це не дуже добре. Після прокрутки донизу команда закінчується і все з’являється знову. Він насправді не приховує цього вмісту.
Кан Лі

@KanLi натисніть, g<щоб побачити ще раз, або @:якщо у вас немає запуску та команд.
Д. Бен Нобле,

53

Інший підхід у залежності від вашого випадку використання буде використовувати vimgrep і його результати в QuickFix . Ви можете зробити наступне:

:vimgrep pattern %здійснить пошук у поточному файлі та переведе вас до першого результату пошуку. Що ще більш важливо, він також розміщує результати в "списку швидких виправлень".

:copenпотім відкриє список швидких виправлень в окремому вікні швидкого виправлення. Отже, у вас буде окреме вікно з усіма рядками вашого останнього вімгрепу. Потім у вікні швидкого виправлення можна натиснути Enter або двічі клацнути на рядку, щоб перейти до відповідного рядка у вихідному файлі.

:colderповернеться до старих списків швидких виправлень (старіші результати vimgrep). І :cnewerпереходить до нових результатів пошуку.

Зверніть увагу, що список :makeшвидких виправлень також оновлюється під час запуску (саме тому його називають швидким виправленням для виправлення помилок). Через це також є альтернатива списку швидких виправлень, яка називається "список місцезнаходжень". Для того, щоб використовувати його замість того, щоб використовувати :lvimgrep, а потім використовувати команди л-приставкою , а не команди з-приставкою - :lopen, :lolder, :lnewer.

Звичайно, ви можете зробити набагато більше. Докладніше див :help quickfix.

PS, Ви сказали, що не хочете підходу, який видаляє рядки, а потім скасовує їх. Але оскільки ви позначили g/ERRORяк відповідь, я думав, що зазначу швидкий і брудний спосіб g!/ERROR/d. Потім ви можете легко скасувати це за допомогою u. Також FYI, ви можете зробити, :set hlsearchщоб виділити шаблони, що відповідають :gкомандам.


1
Дякуємо за підказку щодо ": g! / ERROR / d" краще прийнятої відповіді.
VinGarcia

Чи можете ви це зробити, якщо лінії не відповідають шаблону?
Jacktose

37

Можна використовувати

:g/ERROR/

щоб надрукувати всі рядки з ПОМИЛКОЮ

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


15
+1 за посилання на плагін foldsearch. Це ненав’язливо і може стати в нагоді.
user55400

26

Найкращий спосіб зробити це ->

:vimgrep /something/g % | copen

Це відкриє список відповідностей для вашого ключового слова, а також покаже лише відповідні рядки у вікні швидкого виправлення.

Замініть% на шлях до файлу, якщо не враховувати поточний файл.


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

Ймовірно, ви маєте на увазі команду з меншим vi vim & / pattern /, яка показує рядки, що містять / pattern / (наприклад grep).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.