3

私が持っているカスタムファイルタイプの構文ファイルをvimで作成したいと思います。構文の一部はこの行です

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

すべてのパーツを個別に一致させて、異なる色を割り当てたいと思います。entry一部である1必要があり、一部である02:15:00必要があり、一部である03:15:00必要があり、別の部分である必要があり、56さらに別の部分、Some String別の部分、およびすべてが一部である必要があり,ます。必要に応じて異なる色で色付けできるように、これらはそれぞれ異なる名前を付ける必要があります。

それらをと一致させることができましたcontainsが、同様の値(1回目と2回目)は同じ名前になります。nextgroupまた、それらを次々にチェーンするために使用しようとしましたが、これにより、,個別に色付けする必要のある多くの名前が残りました(そして、ここに示した単純な例とは異なり、元のファイルには多くのコンマがあります)。

そのような構文の強調表示を適切な方法で行う方法はありますか?

4

1 に答える 1

3

すべてのコンマ名を1つにリンクできます

" 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 に答える