Конечная область синтаксиса в начале данного шаблона - PullRequest
5 голосов
/ 04 февраля 2010

Это продолжение от:

VIM: простые шаги для создания файла подсветки синтаксиса - для файлов журнала

Я пытаюсь использовать средство 'region-match' для подсветки синтаксиса трассировки стека в некоторых лог-файлах: эти лог-файлы (на основе log4j) выглядят примерно так:

YYYY-MM-DD HH:MM:ss,SSSS...INFO...Message
YYYY-MM-DD HH:MM:ss,SSSS...INFO...Message
YYYY-MM-DD HH:MM:ss,SSSS...ERROR...Message
...stack trace...
...stack trace...
...blah blah, more server-vomit...
...
YYYY-MM-DD HH:MM:ss,SSSS...INFO...Message

Пока мне удалось сделать почти то, что я хочу, с этим:

:syntax region error matchgroup=string start=/^\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2},\d\{3}.* ERROR/    end=/^\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2},\d\{3}/

Но проблема в том, что совпадение заходит слишком далеко - оно включает следующую запись (т. Е. Совпадение включает в себя следующий ГГГГ-ММ-ДД ....).

Я полагаю, что из этого примера (приведенного в качестве примера о цитируемом тексте) в руководстве по VIM я должен быть в состоянии выделить промежуточное значение? (Но я не могу отобразить синтаксис для моего примера)

http://vimdoc.sourceforge.net/htmldoc/syntax.html#:syn-excludenl

Для ясности: мне нужно сопоставить первую строку YYYY-MM-DD ... (которая включает в себя 'ERROR'), а затем все последующие строки вплоть до, но НЕ включая следующую строку YYYY-MM-DD.

Ответы [ 4 ]

6 голосов
/ 04 февраля 2010

Существует много трудностей с перекрывающимися областями в движке подсветки синтаксиса Vim.Порядок, в котором определяются совпадения и регионы, имеет значение, и может быть очень трудно заставить его делать то, что вы хотите.

Главное, что я бы предложил, - взглянуть на :help syn-pattern-offset.Это обеспечивает средства для завершения региона в начале шаблона среди других вещей.Например, если ваш конечный паттерн:

end=/pattern/re=s-1

, то регион заканчивается у персонажа до p паттерна.

Это требует много усилий, чтобы заставить его работатьи я далеко не эксперт в этих вопросах, но чтобы начать, попробуйте следующее:

syntax match logDate /^\d\{4}-\d\{2}-\d\{2}/ containedin=logDateTimeTypeLine nextgroup=logTime skipwhite
syntax match logTime /\d\{2}:\d\{2}:\d\{2},\d\{3}/ containedin=logDateTimeTypeLine,logTrace
syntax match logDateTimeTypeLine /^\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2},\d\{3}.*/
syntax region logTrace matchgroup=logErrorStartLine start=/^\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2},\d\{3}.*ERROR.*/ms=s,rs=e+1 end=/^\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2},\d\{3}/me=s-1,he=s-1,re=s-1
hi link logTrace Error
hi link logDateTimeTypeLine Keyword
hi link logDate String
hi link logTime Comment
hi logErrorStartLine guifg=red
2 голосов
/ 04 февраля 2010
:help keepend

:syntax region error matchgroup=string start=/.../ end=/.../ keepend
1 голос
/ 27 января 2011

Мой файл - это адаптация :-) вот оно:

syntax region fatal start=/^\d\{4}-\d\{2}-\d\{2}.*FATAL.*/ end=/\n\d\{4}-\d\{2}-\d\{2}/me=s-1,re=s-1
syntax region error start=/^\d\{4}-\d\{2}-\d\{2}.*ERROR.*/ end=/\n\d\{4}-\d\{2}-\d\{2}/me=s-1,re=s-1
syntax region warn start=/^\d\{4}-\d\{2}-\d\{2}.*WARN.*/ end=/\n\d\{4}-\d\{2}-\d\{2}/me=s-1,re=s-1
syntax region info start=/^\d\{4}-\d\{2}-\d\{2}.*INFO.*/ end=/\n\d\{4}-\d\{2}-\d\{2}/me=s-1,re=s-1
syntax region debug start=/^\d\{4}-\d\{2}-\d\{2}.*DEBUG.*/ end=/\n\d\{4}-\d\{2}-\d\{2}/me=s-1,re=s-1
syntax region trace start=/^\d\{4}-\d\{2}-\d\{2}.*TRACE.*/ end=/\n\d\{4}-\d\{2}-\d\{2}/me=s-1,re=s-1

" Highlight colors for log levels.
hi fatal ctermfg=DarkRed ctermbg=Black
hi error ctermfg=Red ctermbg=Black
hi warn ctermfg=Magenta ctermbg=Black
hi info ctermfg=Green ctermbg=Black
hi debug ctermfg=LightCyan ctermbg=Black
hi trace ctermfg=LightMagenta ctermbg=Black
0 голосов
/ 13 апреля 2017

Скажите Vim, чтобы он использовал (нулевой длины) положительный вид сзади с помощью конструкции \@=. Используйте тот же start, но измените end на:

/\(^\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2},\d\{3}\)\@=/

Обратите внимание, что это несовместимо с Vi.

...