在给定模式的开头结束语法区域

mon*_*nny 5 vim logging syntax-highlighting

这是后续行动:

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
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经成功地做了我想要的事情:

: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}/
Run Code Online (Sandbox Code Playgroud)

但问题是,比赛走得太远 - 它包括下一个记录(即比赛包括下一个YYYY-MM-DD ......).

我相信VIM手册中的这个例子(一个关于引用文本的例子),我应该能够突出显示它们之间?(但我似乎无法映射我的示例的语法)

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

所以要明确:我需要匹配第一个YYYY-MM-DD ...行(包括'ERROR'),然后匹配所有后续行,但不包括下一个YYYY-MM-DD行.

DrA*_*rAl 6

在Vim的语法高亮引擎中,重叠区域存在很多困难.定义匹配和区域的顺序会产生差异,并且很难使其按照您的意愿执行.

我建议的主要是看:help syn-pattern-offset.这提供了一种使区域在模式开始时结束的方法.例如,如果您的结束模式是:

end=/pattern/re=s-1
Run Code Online (Sandbox Code Playgroud)

然后该区域将以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
Run Code Online (Sandbox Code Playgroud)