3

我想在 vim 中为我拥有的自定义文件类型创建一个语法文件。部分语法是这一行

entry: 1,02:15:00,03:15:00,56,Some String

我想分别匹配每个部分以分配不同的颜色。entry应该是一个部分,1应该是一个部分,02:15:00应该是一个部分,03:15:00应该是一个不同的部分,56还有另一个部分,Some String一个不同的部分,所有,的s都作为一个部分。这些中的每一个都应该以不同的方式命名,以便我可以根据需要用不同的颜色为它们着色。

我能够将它们与 匹配contains,但相似的值(第一次和第二次)得到相同的名称。我也尝试使用nextgroup一个接一个地链接它们,但这给我留下了,许多我需要单独着色的名称(并且原始文件中有很多逗号,不像我在这里展示的简单示例)。

有没有办法以适当的方式进行这种语法突出显示?

4

1 回答 1

3

您可以将所有逗号名称链接到一个

" Adjust the below to make commas have another color.
" It is common that instead of defining colors directly you link 
" new highlighting groups to some standard one.
hi def link MySyntaxComma Delimiter

hi def link MySyntaxCommaAfterNumber       MySyntaxComma
hi def link MySyntaxCommaAfterFirstTime    MySyntaxComma
hi def link MySyntaxCommaAfterSecondTime   MySyntaxComma
hi def link MySyntaxCommaAfterSecondNumber MySyntaxComma

您还可以使用循环:execute来隐藏重复规则:

syntax match MySyntaxEntryStart /^entry:\s*/ nextgroup=MySyntaxNumber1
let s:rules=[['Number1', '\d\+'], ['Time1', '\d\d:\d\d:\d\d'], ['Time2', '\d\d:\d\d:\d\d'], ['Number2', '\d\+'], ['String', '.*']]
while !empty(s:rules)
    let [s:name, s:reg]=remove(s:rules, 0)
    let s:cmd='syntax match MySyntax'.s:name.' /'.s:reg.'/ contained'
    if !empty(s:rules)
        let s:cmd.=' nextgroup=MySyntaxCommaAfter'.s:name
        execute 'syntax match MySyntaxCommaAfter'.s:name.' /,/ contained nextgroup=MySyntax'.s:rules[0][0]
        execute 'hi def link MySyntaxCommaAfter'.s:name.' MySyntaxComma'
    endif
    execute s:cmd
endwhile
unlet s:rules s:cmd s:name s:reg
于 2012-10-22T20:05:56.737 回答