我的日志语法已更改。我现在必须在时间之前包含用户名,因此新格式为:
[username] time LEVEL filepath:line - message
我定义各个区域没有问题:
syn region logUser start=+^\[+ end=+\] +me=e-1 contained
syn match logTime "\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2},\d\{3}" contained
syn keyword logCritical CRITICAL contained
syn keyword logError ERROR contained
syn keyword logWarn WARN contained
syn keyword logInfo INFO contained
syn keyword logDebug DEBUG contained
syn match logFileAndNumber " \S\+:\d\+ - " contains=logFile,logLineNumber
syn match logFile " \S\+:" contained
syn match logLineNumber "\d\+" contained
问题是我无法弄清楚如何在开头创建一个区域,这样我就不会在任何时候看到其中一个日志级别,或者在消息中出现时间戳等时突出显示。链接问题的答案适用于以前的格式,但没有太多的解释方式,所以我真的不明白它在做什么。
编辑:没有办法简单地定义较小的区域,然后将较大的区域定义为较小区域的序列吗?我知道这不起作用,但有些内容如下:syn match logBeginning "$logUser $logTime [$logCritical|$logError|$logWarn|$logInfo|$logDebug]"
答案 0 :(得分:3)
如果修复了序列(用户,时间,严重性等),则可以使用nextgroup=...
属性将它们链接在一起。因此,将第一个(logUser
)设置为非包含的(以便它在任何地方匹配),并指示Vim在其后检查logTime
(仅后跟空格)。所有其他组都是contained
以避免在其他地方进行匹配。
syn region logUser start=+^\[+ end=+\] +me=e-1 nextgroup=logTime skipwhite
syn match logTime "\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2},\d\{3}" contained nextgroup=logCritical,logError,logWarn,logInfo,logDebug skipwhite
...
的Cp。 :help :syn-nextgroup
。