vim 语法:如何使用包含的字段

vim syntax: how to use contained fields

跟进

我的日志语法已更改。我现在必须在时间之前包含用户名,所以新格式是:

[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]"

如果顺序(用户、时间、严重性...)是固定的,您可以使用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.