quinta-feira, 16 de abril de 2009

Definindo um item com a colorização do item que o contém no arquivo de sintaxe

Em um arquivo na linguagem C você gostaria de colorir o texto '()' depois de um
'while' diferente do texto '()' depois de 'for'.

Em ambos casos, podem existir itens '()' aninhados, os quais deveriam ser
coloridos do mesmo modo.

Você deve ter certeza que a colorização pare no ')' correspondente.
Este é um modo de fazer isso:
:syntax region cWhile matchgroup=cWhile start=/while\s*(/ end=/)/
        \ contains=cCondNest
:syntax region cFor matchgroup=cFor start=/for\s*(/ end=/)/
        \ contains=cCondNest
:syntax region cCondNest start=/(/ end=/)/ contained transparent
Agora você pode dar 'cWhile' e 'cFor' uma colorização diferente. 'cCondNest'
pode aparecer em qualquer um deles, mas ele leva a colorização do item em que
está contido.
O argumento 'transparent' faz isso.

Note que o argumento 'matchgroup' tem o mesmo grupo que o próprio item. Porque
defini-lo então? O efeito secundário de usar um 'matchgroup' é que os itens
contidos não são encontrados encontrados no padrão com o item 'start'.

Isto evita que o grupo 'cCondNest' encontre o '(' bem após o 'while' ou o 'for'.
Se isto tivesse acontecido, ele iria se expandir o texto todo até encontrar ')'
e a região continuaria após ele.

Agora 'cCondNest' somente irá localizar após o padrão start, assim depois do primeiro '('.

0 comentários:

Postar um comentário