Это - продолжение от:
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.
В движке подсветки синтаксиса 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
:help keepend
:syntax region error matchgroup=string start=/.../ end=/.../ keepend