mon*_*nny 5 vim logging syntax-highlighting
这是后续行动:
我试图在一些日志文件中使用'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行.
在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)
| 归档时间: |
|
| 查看次数: |
4262 次 |
| 最近记录: |