vim - 如何匹配语法文件中的链接序列

时间:2012-10-22 16:15:12

标签: vim vim-syntax-highlighting

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

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

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

我能够将它们与contains匹配,但类似的值(第一次和第二次)获得相同的名称。我也尝试使用nextgroup一个接一个地链接它们,但这给我留下了,有许多名字我需要分别着色(原始文件中有许多逗号,不像简单的例子我如图所示)。

有没有办法以正确的方式进行此类语法突出显示?

1 个答案:

答案 0 :(得分: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