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

vim-如何匹配语法文件中的链接序列,vim,vim-syntax-highlighting,Vim,Vim Syntax Highlighting,我想在vim中为我拥有的自定义文件类型创建一个语法文件。部分语法是这一行 entry: 1,02:15:00,03:15:00,56,Some String 我想分别匹配每个部分以指定不同的颜色条目应为一部分,1应为一部分,02:15:00应为一部分,03:15:00应为另一部分,56另一部分,某些字符串另一部分,所有,作为一部分。每一个都应该有不同的名称,这样我可以根据需要用不同的颜色给它们上色 我能够将它们与contains匹配,但类似的值(第一次和第二次)具有相同的名称。我还尝试使用ne

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

entry: 1,02:15:00,03:15:00,56,Some String
我想分别匹配每个部分以指定不同的颜色<代码>条目应为一部分,
1
应为一部分,
02:15:00
应为一部分,
03:15:00
应为另一部分,
56
另一部分,
某些字符串
另一部分,所有
作为一部分。每一个都应该有不同的名称,这样我可以根据需要用不同的颜色给它们上色

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


有没有一种方法可以正确地突出显示这种语法?

您可以使用

" 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

如果你想一想,这和给它们着色是一样的,因为我仍然需要把它们联系起来。你所建议的是一个很好的做法。最初的问题是有很多逗号,所以我认为可能有一个命令,例如
分隔符
中间的
就像有
开始
结束
一样。我将标记您的答案,因为我想这是最好的答案。@ccit您不能使用带有一个分隔符匹配规则的正常下一个组链。你能做的最好的事情就是把所有的膨胀合并成一个更小的循环:execute(将用示例更新答案)。你很棒。这个新建议正是我所需要的。我从来没有想过使用编程(循环等)来解决它。因此,聪明的解决方案是投票表决。谢谢