Конечный регион синтаксиса в начале данного шаблона

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

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

Я пытаюсь использовать средство 'соответствия региона' для отслеживаний стека выделения синтаксиса в некоторых файлах журнала: эти файлы журнала (находящийся в 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}/

Но проблема, то, что соответствие заходит слишком далеко - это включает следующую запись (т.е., соответствие включает следующий YYYY-MM-DD....).

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

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

Таким образом быть ясным: Я должен соответствовать первому YYYY-MM-DD... строка (который включает 'ОШИБКУ'), и затем все последующие строки до, но НЕ включая следующую строку YYYY-MM-DD.

5
задан Community 23 May 2017 в 12:32
поделиться

2 ответа

В движке подсветки синтаксиса 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
6
ответ дан 14 December 2019 в 01:07
поделиться
:help keepend

:syntax region error matchgroup=string start=/.../ end=/.../ keepend
2
ответ дан 14 December 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: