Существует много трудностей с перекрывающимися областями в движке подсветки синтаксиса 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