#vim
#vim
Вопрос:
Возможно ли в vim удалить все строки, кроме тех, которые соответствуют шаблону, а также сохранить пару строк до и после (например, контекст в grep).
Комментарии:
1. Не могли бы вы добавить пример «до / после», пожалуйста?
Ответ №1:
Поскольку вы упомянули grep, вероятно, самый чистый способ — это просто вызвать grep
для всего буфера.
%!grep -2 pattern_to_match
Я обновлю, если найду решение с использованием чистого vim, но я сомневаюсь, что оно будет чище, чем вышеупомянутое решение.
Комментарии:
1. Что делает флаг -2?
2. @SylvesterVLowell, это параметр контекста, о котором упоминал OP. В основном это говорит grep отображать две строки до и две строки после совпадения.
Ответ №2:
Другое чисто vim-решение, которое копирует выходные данные в регистр:
:redir @a
:g/pat/z.5
:redir END
Команда :z.5
работает как grep-2. Проверьте справку об этом — ее можно использовать для некоторых интересных эффектов.
Команда redir @a
перенаправляет выходные данные в register a
и redir END
завершает перенаправление.
Но если вы просто хотите увидеть найденные строки с некоторым контекстом, то :g/pat/z.5
это может быть вашим лучшим вариантом.
Ответ №3:
Чистое решение vim с использованием :global
:let @a=""
:g/pat/-2, 2y A
:%d_
:pu a
:1,2d_
Обзор:
Выдерните по 2 строки с каждой стороны шаблона и добавьте в регистр. Затем удалите буфер и замените содержимым регистра.
Примечание: Используйте grep-версию @merlin2011. Это самое простое.
Дополнительную справку см.:
:h :range
:h :let-@
:h :g
:h quote
:h :d
:h :pu
:h registers