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

时间:2010-02-04 15:54:24

标签: vim syntax-highlighting logging

这是后续行动:

VIM: simple steps to create syntax highlight file - for logfiles

我正在尝试使用'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}/

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

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

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

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

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

:help keepend

:syntax region error matchgroup=string start=/.../ end=/.../ keepend

答案 2 :(得分:1)

我的文件是改编:-) 这是:

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

答案 3 :(得分:0)

告诉Vim使用(零长度)正向后视using the \@= construct.使用相同的start,但将end更改为:

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

请注意,这与Vi不兼容。