quarta-feira, 15 de abril de 2009

Definindo o uso múltiplo do fim de linha no arquivo de sintaxe

Considere os dois itens de sintaxe seguintes:
:syntax region xComment start=/%/ end=/$/ contained
:syntax region xPreProc start=/#/ end=/$/ contains=xComment
Você define um comentário como qualquer coisa a partir de '%' até o final da linha.
Uma definição de preprocessador é qualquer coisa a partir de '#' até o final da linha.

Como você pode ter um comentário sobre linha do preprocessador, a definição do
preprocessador inclui um argumento 'contains=xComment'.

Agora olhe o que acontece com este texto:
#define X = Y % Comment text ~
int foo = 1;
O que você vê é que a segunda linha é que ela também é colorida como 'xPreProc'.
A diretiva do preprocessador deveria terminar no final da linha.
Isto é porque você usou 'end=/$/'. Então o que está errado?

O problema é o comentário contido. O comentário começa '%' e termina no final da
linha. Depois que o comentário termina, a sintaxe do preprocessador continua.
Isto é depois do final da linha ter sido visto, assim a próxima linha é incluída
também.

Para evitar este problema e evitar um item de sintaxe contido comendo o fim de
linha necessário, use o argumento 'keepend'.
Isto cuida do localização dupla do fim de linha:
:syntax region xComment start=/%/ end=/$/ contained
:syntax region xPreProc start=/#/ end=/$/ contains=xComment keepend

0 comentários:

Postar um comentário