Akobold
Akobold

Reputation: 946

Vim syntax match

I am implementing a syntax highlight for a proprietary C expansion that we use in VIM.
The syntax is this:

int __event(foobar) my_foobar_function()
{
    //whatever
    if(foobar)
        // do something
}

Now what I would like to do is to highlight __event(foobar), so I wrote this:

syn region xREG start=/__event(/ end=/)/ contains=xFOO
syn keyword xFOO foobar contained

hi xREG ctermfg=darkblue
hi xFOO ctermfg=cyan

This highlights the __event() correctly, however, the foobar in if(foobar) also gets highlighted.

My question is how can I restrict the xFOO group to be highlighted ONLY in xREG and nowhere else.

Thank you.

Upvotes: 1

Views: 979

Answers (1)

Ingo Karkat
Ingo Karkat

Reputation: 172738

When you extend an existing syntax (like C), you need to consider the existing syntax items. The following line from syntax/c.vim causes the inclusion of your xFOO group via the ALLBUT=:

syn region  cParen      transparent start='(' end=')' end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cCppParen,cErrInBracket,cCppBracket,cCppString,@Spell

Fortunately, it provides an extension point: You have to add your group to the @cParenGroup cluster:

syn cluster cParenGroup add=xFoo

That should do the trick!

Upvotes: 2

Related Questions