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

时间:2015-11-11 15:51:11

标签: vim syntax-highlighting

跟进this question

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

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

1 个答案:

答案 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