【问题标题】:Ending syntax region at the start of a given pattern在给定模式的开头结束语法区域
【发布时间】:2010-02-04 15:54:23
【问题描述】:

这是来自:

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

我正在尝试使用“区域匹配”工具在一些日志文件中语法高亮堆栈跟踪:这些日志文件(基于 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... 行(包括“错误”),然后匹配所有后续行,但不包括下一个 YYYY-MM-DD 行。

【问题讨论】:

  • 带区域的解决方案看起来有点难看。末尾的这个 '^' 开始符号就像一个 hack。

标签: vim syntax-highlighting logging


【解决方案1】:

在 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

【讨论】:

    【解决方案2】:
    :help keepend
    
    :syntax region error matchgroup=string start=/.../ end=/.../ keepend
    

    【讨论】:

    • 谢谢-实际上已经尝试过了-它确实(几乎)做了我想要的-但它似乎迫使开始和结束模式变成粉红色!(因为我认为是“字符串”):如何解决这个问题的提示?
    • 好的 - 我通过使用 'matchgroup=normal' 让它按我想要的方式工作 [不确定这是最佳解决方案,但它完全适合我]。
    • 实际上,这也不太适用...第一个模式也被“取消突出显示” - 它只是我需要从突出显示中排除的终止模式 - 可能我是扩展一种并非真正为日志文件设计的机制 - 更多的是用于倾向于具有匹配的“书挡”对的语言...... +1 保留,但恐怕不得不取消“已接受的答案”!
    【解决方案3】:

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

    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
    

    【讨论】:

      【解决方案4】:

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

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

      请注意,这与 Vi 不兼容。

      【讨论】:

        猜你喜欢
        • 2019-06-01
        • 2015-10-19
        • 1970-01-01
        • 2019-04-05
        • 2016-02-02
        • 2023-03-13
        • 1970-01-01
        • 2019-11-21
        • 2013-05-25
        相关资源
        最近更新 更多