Удобная многострочная подсведка поиска в vim


ramok аватар

ramok - Posted on 24 Апрель 2008

В vim существует возможность подсвечивать найденные поиском слова командой :hlsearch. Но иногда удобно подсвечивать в логах многострочные блоки текста что бы их было видно невооруженным взглядом в огромном логе.

Но проблема в том что в регулярных выражениях точка . обозначает "любой символ кроме перевода каретки" (в отличии от например sed или perl где это действительно "любой символ"). К тому же * как обычно "жадный", что обозначает что если применять его, то будет найдена первая строка первого блока текста и последняя строка последнего блока текста, и подсвечен весь текст между ними. А нам нужно подсвечивать каждый блок в отдельности.

О том как это реализовывается на регулярных выражениях vim и есть этот типс Ж:-)

Как всегда лучше всего разобраться на примере. Допустим нам надо выделять блоки текста в которых первая строчка
содержит слова "RECV signal" или "SEND signal" и заканчиваются строчкой которая содержит "------".

Результат должен выглядеть так:

Белым цветом выделен только что найденый блок текста, желтым - все остальные найденные блоки.

Такого можно добиться командой:

/\(RECV\|SEND\) sig\_.\{-}------.*

Разберем ее по порядку слева на право:

  1. / - соответственно команда поиска в vim Ж:-)
  2. \(RECV\|SEND\) sig - ищем в строке или "RECV sig" или "SEND sig" \(\) служат для группировки, \| для выбора вариантов, "или"
  3. \_. - вот это самое интересное Ж:-) эта последовательность обозначает "любой символ включая перевод каретки".
  4. \{-} - это реализация "не жадных" регулярных выражений в vim. в perl это аналог *?. Если вместо этого поставить банальный * то vim будет искать самое последнее вхождение последующих символов.
  5. ------ - это мы ищем в последующих строках строку "------". Итого \_.\{-}------ обозначает "пропустить любое кол-во символов (включая перевод каретки) до тех пор пока первый раз не найдем строку ------"
  6. .* - тут нужен что бы посветить остатки строки в которой найдена строка "------".

Вот собственно говоря и все Ж:-)

ВложениеРазмер
vim-multiline-hlsearch.png20.67 кб
0
Ваша оценка: Ничего

Очень хорошая идея. Воспользовался ей и модернизировал - можешь посмотреть:
http://gvim.org.ua/topic/14/

у меня эти таблицы могли иметь разное кол-во строчек, так что мой вариант подходит мне больше.

но думаю твой вариант в большинстве случаев подходит и проще. а пошаговое описание в статье отличное, так держать Ж:-)

--
Signature invent in progress 24% ##........

Надеюсь не обиделся - я дал в самом начале на тебя ссылку, идея твоя.

какие могут быть обиды при наличии ссылки на первоисточник? Ж:-)
--
Signature invent in progress 24% ##........

О! Спасибо. Почерпнул много интересного и нового для себя.

спасибо - очень полезно