我想在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
一个接一个地链接它们,但这给我留下了,
有许多名字我需要分别着色(原始文件中有许多逗号,不像简单的例子我如图所示)。
有没有办法以正确的方式进行此类语法突出显示?
答案 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