这是后续行动:
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>
答案 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不兼容。