Lisiane Sztoltz
lisiane@conectiva.com.br
Tradução
Trabalhando com Realce de Sintaxe Visão geral O Realce de Sintaxe é o que faz com que o editor exiba automaticamente o texto em diferentes cores/estilos, dependendo da função da string em questão para o propósito do arquivo. No código fonte do programa, por exemplo, declarações de controle pode ser renderizadas em negrito, enquanto tipos de dados e comentários ficam com cores diferentes do restante do texto. Isto aumenta consideravelmente a legibilidade do texto e assim, o autor pode ser mais eficiente e produtivo. Uma função Perl, representada com realce de sintaxe. Uma função Perl, representada com realce de sintaxe. A mesma função Perl, sem realce de sintaxe. A mesma função Perl, sem realce de sintaxe. Dos dois exemplos, qual é o mais fácil de ler? O &kate; vem com um sistema flexível, configurável e capaz de fazer realce de sintaxe; a distribuição padrão oferece definições para um vasto conjunto de linguagens de programação, de manipulação e de 'scripting', bem como para outros formatos de texto. Além disso, você pode criar as suas próprias definições em arquivos &XML; simples. O &kate; detectará automaticamente regras de realce de sintaxe quando você abrir um arquivo, baseado no tipo &MIME; do arquivo, determinado pela extensão ou, se não existir, pelo conteúdo. Se você não conseguir, ajuste manualmente a sintaxe para o uso no menu Documentos Modo de Realce de Sintaxe. Os estilos e cores usados por cada definição de realce de sintaxe podem ser configurados usando a página de Aparência da Janela de Configuração enquanto os tipos &MIME; para os quais deve ser usada, podem ser configurados usando a página de Realce da Janela de Configuração. O realce de sintaxe existe para aumentar a legibilidade do texto correto, mas não se pode confiar nisto para validar seu texto. Marcar o texto para sintaxe é difícil, dependendo do formato que você está usando e, em alguns casos, os autores das regras de sintaxe ficarão orgulhosos se 98% do texto é renderizado corretamente, embora muito freqüentemente você precise de um estilo raro para ver os 2% incorretos. Você pode obter as definições de sintaxe adicionais ou atualizadas na página Web do &kate; clicando no botão Obter na página de Realce da Janela de Configuração. O Sistema de Realce de Sintaxe do &kate; Esta seção irá discutir o realce de sintaxe do &kate; em detalhes. É para você, caso deseje saber mais sobre esta funcionalidade ou se quiser criar ou alterar as definições de sintaxe. Como Funciona Sempre que você abrir um arquivo, uma das primeiras coisas que o editor &kate; faz é detectar qual definição de sintaxe deve ser usada para o arquivo. Ao ler o texto do arquivo, e enquanto você digita no arquivo, o sistema de realce de sintaxe analisará o texto usando as regras definidas pela definição de sintaxe, e marcará no texto onde contexto e estilos diferentes iniciarem e finalizarem. Quando você escrever no documento, o novo texto será analisado e marcado na hora, pois se você remover um caractere que está marcado como início ou fim de um contexto, o estilo em volta do texto modifica de acordo com ele. As definições de sintaxe usadas pelo sistema de realce de sintaxe do &kate; são arquivos &XML; que contém Regras para a deteção do texto inteiro, organizado em blocos de contexto Listas de palavras-chave Definições de Item de Estilo Ao analisar o texto, as regras de deteção serão avaliadas na ordem em que foram definidas, e se o início da string atual coincidir com uma regra, o contexto relacionado será usado. O ponto de partida no texto é movido para o ponto final no local onde aquela regra coincide, e um novo loop de regras inicia, começando no contexto configurado pela regra relacionada. Regras As regras de deteção são o coração do sistema de deteção de realce. Uma regra é uma string, caracter ou expressão regular em contraste com o texto sendo analisado. Ela contém informações sobre estilo a ser usado para a parte coincidente do texto, e pode trocar o contexto de funcionamento do sistema para um contexto explicitamente mencionado ou para um contexto usado anteriormente pelo texto. As regras são organizadas em grupos de contexto, sendo que este é usado pelos conceitos principais do texto dentro de um formato, como por exemplo strings dentro de aspas ou blocos de comentário do código-fonte de um programa. Isto garante que o sistema de realce não precisa ficar procurando todas as regras quando não for necessário, e também que seqüências de algum caractere no texto podem ser tratadas de modo diferente, dependendo do contexto atual. Os contextos poderão ser gerados dinamicamente, para permitir a utilização de dados específicos das instâncias nas regras. Estilos de Contexto e Palavras-Chave Em algumas linguagens de programação, os números inteiros são tratados diferentemente que números de ponto flutuante pelo compilador (o programa que converte o código-fonte para um binário executável), e podem existir caracteres que possuem significado especial dentro de uma string. Em tais casos, faz sentido renderizá-los de modo diferente dos outros, assim, são mais fáceis de identificar durante a leitura do texto. Mesmo que eles não sejam representados em contextos especiais, pode ser vistos no sistema de realce de sintaxe, e assim, podem ser marcados com uma renderização diferente. Uma definição de sintaxe pode conter tantos estilos quanto forem necessários para cobrir os conceitos do formato no qual serão usados. Em muitos formatos, existem listas de palavras, que representam um conceito específico; por exemplo, em linguagens de programação, as declaração de controle são um conceito, nomes de tipos de dados outro conceito, e funções pré-integradas na linguagem um terceiro conceito. O Sistema de Realce de Sintaxe do &kate; pode usar estas listas para detectar e marcar palavras no texto para enfatizar os conceitos dos formatos. Estilos Padrão Se você abrir um arquivo de código em C++, um arquivo de &Java; e um documento em HTML no &kate;, irá ver que, ainda que os formatos sejam diferentes e, por isso, sejam selecionadas palavras diferentes para um tratamento especial, as cores usadas são as mesmas. Isto deve-se ao fato do &kate; ter uma lista pré-definida de Estilos Padrão, os quais são usados pelas definições de sintaxe individuais. Isto faz com que fique mais fácil reconhecer conceitos similares em diferentes formatos. Comentários, por exemplo, estão presente na maioria das linguagens de programação, script e marcação, e quando são renderizados utilizando-se o mesmo estilo em todas as linguagens, você não precisa parar e pensar para identificá-los dentro do texto. Todos os estilos de uma definição de sintaxe usam um dos estilos padrão. Algumas definições de sintaxe usam mais estilos além dos pré-definidos, por isso se você usar um formato freqüentemente, pode ser útil abrir a janela de configuração para ver se alguns conceitos estão usando o mesmo estilo. Por exemplo, só existe um estilo padrão para as cadeias de caracteres, mas como a linguagem de programação Perl lida com dois tipos de cadeias de caracteres, você pode melhorar o realce se configurar esses dois tipos de uma forma ligeiramente diferente. Todos os estilos padrão disponíveis serão explicados mais tarde. O Formato &XML; de Definição de Realce Visão geral Esta seção é uma introdução ao formato &XML; de Definição de Realce. Baseado em um pequeno exemplo, ele irá descrever as componentes principais, bem como o seu significado e utilização. A próxima seção colocará em detalhes as regras de detecção. A definição formal, mais conhecida por DTD, é guardada no arquivo language.dtd, o qual deve estar instalado no seu sistema na pasta $TDEDIR/share/apps/katepart/syntax. Seções principais dos arquivos de Definições de Realce do &kate; Um arquivo de realce contém um cabeçalho que define a versão do XML e o tipo de documento: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE language SYSTEM "language.dtd"> A raiz do arquivo de definição é o elemento language. Os atributos disponíveis são: Atributos necessários: O name define o nome da linguagem. Ele aparece nos respectivos menus e janelas. O section indica a categoria. O extensions define as extensões dos arquivos, como por exemplo "*.cpp;*.h" Atributos opcionais: O mimetype associa os arquivos com base no Tipo &MIME;. O version indica a versão atual do arquivo de definição. O kateversion indica a última versão suportada pelo &kate;. O casesensitive define se as palavras-chave fazem distinção entre maiúsculas e minúsculas. O priority é necessário se outro arquivo de definições de realce usar as mesmas extensões. Ganhará o que tiver maior prioridade. O author contém o nome do autor e o seu endereço de e-mail. O license contém a licença, que é normalmente a LGPL, a Artistic, a GPL, entre outras. O hidden define se o nome deverá aparecer nos menus do &kate;. Assim, a próxima linha parece-se com o seguinte: <language name="C++" version="1.00" kateversion="2.4" section="Sources" extensions="*.cpp;*.h" /> A seguir vem o elemento highlighting, que contém o elemento opcional list e os elementos obrigatórios contexts e itemDatas. O elemento list contém uma lista de palavras-chave. Neste caso, as palavras-chave são a class e a const.Você poderá adicionar tantas listas quanto desejar. O elemento contexts contém todos os contextos. O primeiro contexto é, por padrão, o início do realce. Existem duas regras no contexto Normal Text (Texto Normal), que correspondem à lista de palavras-chave com o nome um_nome e uma regra que detecta aspas e muda o contexto para string (cadeia de caracteres). Para aprender mais sobre as regras, leia o próximo capítulo. A terceira parte é o elemento itemDatas. Contém todas as cores e estilos de fonte necessários pelos contextos e regras. Neste exemplo, são usados o itemData de Normal Text (Texto Normal), String (Cadeia de Caracteres) e Keyword (Palavra-Chave). <highlighting> <list name="um_nome"> <item> class </item> <item> const </item> </list> <contexts> <context attribute="Normal Text" lineEndContext="#pop" name="Normal Text" > <keyword attribute="Keyword" context="#stay" String="somename" /> <DetectChar attribute="String" context="string" char="&quot;" /> </context> <context attribute="String" lineEndContext="#stay" name="string" > <DetectChar attribute="String" context="#pop" char="&quot;" /> </context> </contexts> <itemDatas> <itemData name="Normal Text" defStyleNum="dsNormal" /> <itemData name="Keyword" defStyleNum="dsKeyword" /> <itemData name="String" defStyleNum="dsString" /> </itemDatas> </highlighting> A última parte de uma definição de realce é a seção opcional general. Ela poderá conter informações sobre as palavras-chave, expansão/recolhimento de código, comentários e indentação. A seção comment define com que texto é introduzido um comentário para uma única linha. Você poderá também definir comentários multi-linha, usando o multiLine com o atributo adicional end. Isto aplica-se se o usuário pressionar o atalho correspondente para comentar/descomentar. A seção keywords define se as listas de palavras-chave fazem distinção entre maiúsculas e minúsculas ou não. Os outros atributos serão explicados mais tarde. <general> <comments> <comment name="singleLine" start="#"/> </comments> <keywords casesensitive="1"/> </general> </language> As Seções em Detalhe Esta parte irá descrever todos os atributos disponíveis para o 'contexts', o 'itemDatas', o 'keywords', o 'comments', a expansão de código e a indentação. O elemento context pertence ao grupo contexts. Um contexto, por si só, define as regras específicas do contexto, como o que deve acontecer se o sistema de realce chegar ao fim de uma linha. Os atributos disponíveis são: name o nome do contexto. As regras irão usar este nome para indicar o contexto para onde mudar, se a regra corresponder. O lineEndContext define o contexto para onde o sistema de realce salta, se atingir o fim de uma linha. Isto poderá ser o nome de outro contexto, o #stay para não mudar de contexto (p.ex., não fazer nada) ou o #pop que fará com que saia deste contexto. É possível usar, por exemplo, #pop#pop#pop para sair de dentro de três contextos. O lineBeginContext define o contexto, se for encontrado o início de uma linha. Padrão: #stay. O fallthrough define se o sistema de realce salta para o contexto indicado em 'fallthroughContext' se não corresponder nenhuma regra. Padrão: false. O fallthroughContext define o próximo contexto, se nenhuma regra corresponder. O dynamic, se for true (verdadeiro), fará com que o contexto recorde os textos/sequências de substituição gravados pelas regras dinâmicas. Isto é necessário, por exemplo, para os documentos do HERE. Padrão: false. O elemento itemData está no grupo itemDatas. Define o estilo e as cores da fonte. Assim, é possível definir os seus próprios estilos e cores, contudo recomenda-se que use os estilos pré-definidos, para que o usuário veja sempre as mesmas cores que são usadas nas várias linguagens. Todavia, existem casos em que não existe outra forma e, assim, é necessário mudar os atributos de cores e tipos de fonte. Os atributos 'name' e 'defStyleNum' são obrigatórios, enquanto os outros são opcionais. Os atributos disponíveis são: O name define o nome do 'itemData'. Os contextos e regras irão usar este nome no seu atributo attribute, para referenciar um 'itemData'. O defStyleNum define qual o estilo padrão usar. Os estilos pré-definidos disponíveis são explicados mais tarde em detalhes. O color define uma cor. Os formatos válidos são o '#rrggbb' ou '#rgb'. O selColor define a cor da seleção. O italic, se for true (verdadeiro), irá colocar o texto em itálico. O bold, se for true (verdadeiro), irá colocar o texto em negrito. O underline, se for true (verdadeiro), irá colocar o texto sublinhado. O strikeout, se for true (verdadeiro), irá colocar o texto traçado. O elemento keywords, no grupo general, define as propriedades das palavras-chave. Os atributos disponíveis são: O casesensitive poderá ser true (verdadeiro) ou false (falso). Se for true, todas as palavras-chave farão distinção entre maiúsculas e minúsculas O weakDeliminator é uma lista de caracteres que não irão atuar como separadores de palavras. Por exemplo, o ponto '.' é um separador de palavras. Assuma que uma palavra-chave num list contém um ponto; nesse caso, só irá corresponder se indicar que o ponto é um delimitador fraco. O additionalDeliminator define os delimitadores ou separadores adicionais. O wordWrapDeliminator define os caracteres após os quais poderá ocorrer uma mudança de linha. Os delimitadores pré-definidos e de mudança de linha são os caracteres .():!+,-<=>%&*/;?[]^{|}~\, o espaço (' ') e a tabulação ('\t'). O elemento comment, no grupo comments, define as propriedades dos comentários que são usadas nas opções FerramentasComentar e FerramentasDescomentar. Os atributos disponíveis são: O name tanto poderá ser singleLine como multiLine. Se escolher o multiLine, serão necessários os atributos end e region. O start define o texto usado para iniciar um comentário. No C++, este será o "/*". O end define o texto usado para fechar um comentário. No C++, será o "*/". O region deverá ser o nome do comentário multi-linhas que poderá expandir ou recolher. Assuma que tem o beginRegion="Comment" ... endRegion="Comment" nas suas regras; nesse caso, deverá usar o region="Comment". Desta forma, a remoção de comentários funciona, mesmo que não tenha selecionado todo o texto do comentário multi-linhas. O cursor só precisa estar dentro deste comentário. O elemento folding, no grupo general, define as propriedades de dobragem/desdobramento do código. Os atributos disponíveis são: O indentationsensitive, se for true, aplicará os marcadores de dobragem de código com base na indentação, como acontece na linguagem de programação Python. Normalmente você não terá que definir isto, uma vez que o valor padrão é false. O elemento indentation, no grupo general, define qual o sistema de indentação a usar; contudo, recomenda-se que omita este elemento, uma vez que o sistema de indentação será normalmente definido a partir de um Tipo de Arquivo ou através da adição da linha de modo no arquivo de texto. Se você indicar um sistema de indentação, todavia, irá obrigar o usuário a usar um sistema de indentação específico, o que poderá não ser o que ele quer. Os atributos disponíveis são: O mode é o nome do sistema de indentação. Os sistemas disponíveis atualmente são: normal, cstyle, csands, xml, python e varindent. Estilos Padrão Disponíveis Os estilos padrão já foram explicados, em resumo: Os estilos padrão são os estilos de cores e fontes pré-definidos. Assim, aqui aparece somente a lista de estilos padrão disponíveis: dsNormal, usado para o texto normal. dsKeyword, usado nas palavras-chave. dsDataType, usado nos tipos de dados. dsDecVal, usado nos valores decimais. dsBaseN, usados nos valores com uma base diferente de 10. dsFloat, usado nos valores de ponto flutuante. dsChar, usado para um caracter único. dsString, usado para conjuntos ou cadeias de caracteres. dsComment, usado nos comentários. dsOthers, usado para outras coisas. dsAlert, usado nas mensagens de aviso. dsFunction, usado nas chamadas a funções. dsRegionMarker, usado nos marcadores de regiões. dsError, usado para realçar erros e sintaxes inválidas. Regras de Deteção de Realce Esta seção descreve as regras de deteção de sintaxe. Cada regra pode corresponder a zero ou mais caracteres no início do texto que é testado. Se a regra corresponder, é atribuído o estilo ou atributo definido pela regra aos caracteres correspondentes; uma regra poderá perguntar se o contexto atual será alterado. As regras se parecem com isto: <NomeRegra attribute="(identificador)" context="(identifier|order)" [atributos específicos da regra] /> O attribute identifica o estilo a usar para os caracteres correspondentes pelo nome ou índice; o context identifica, como esperado, o contexto a usar a partir daqui. O context pode ser identificado por: Um identificador, que é o nome do outro contexto. Uma ordem diz ao mecanismo para ficar no contexto atual (#stay), ou voltar a usar um contexto usado anteriormente na string (#pop). Para voltar mais passos, a palavra-chave #pop pode ser repetida: #pop#pop#pop Algumas regras podem ter regras-filhas, as quais podem ser avaliadas se e só se a regra-mãe foi verificada. O texto inteiro verificado terá o atributo definido pela regra-mãe. Uma regra com regras-filhas se pareceria com a seguinte: <NomedaRegra (atributos)> <NomedaRegraFilha (atributos) /> ... </NomedaRegra> Os atributos específicos da regra variam e estão descritos nas seções a seguir. Atributos comuns Todas as regras possuem os seguintes atributos em comum e estão disponíveis sempre que os (atributos comuns) aparecerem. O attribute e o context são atributos obrigatórios, enquanto os outros são opcionais. attribute: Um atributo mapeia-se para um itemData definido. context: Indica o contexto para onde muda o sistema de realce, se a regra corresponder. beginRegion: Inicia um bloco de dobragem de código. Padrão: não definido. endRegion: Fecha uma região de dobragem de código. Padrão: não definido. lookAhead: Se for true (verdadeiro), o sistema de realce não irá processar o tamanho da correspondência. Padrão: false. firstNonSpace: Corresponder apenas se o texto for o primeiro não-espaço em branco da linha. Padrão: false. column: Corresponder apenas se a coluna corresponder. Padrão: não definido. Regras dinâmicas Algumas regras permitem o atributo opcional dynamic, do tipo booleano, cujo valor por padrão é false. Se o 'dynamic' for true, uma regra poderá usar seqüências de substituição que representam o texto correspondente a uma expressão regular que mudou para o contexto atual, nos seus atributos string ou char. Num string, o texto de substituição %N (em que o N é um número) será substituído pela captura correspondente a N na expressão regular de chamada. Num char, a seqüência de substituição deverá ser um número N que será substituído pelo primeiro caracter da captura N da expressão regular de chamada. Sempre que uma regra permitir este atributo, irá conter um (dinâmico). dynamic: poderá ser (true|false). As Regras em Detalhes DetectChar Detecta um caractere específico. Comumente usado, por exemplo, para encontrar o final das strings citadas. <DetectChar char="(caracter)" (atributos comuns) (dinâmico) /> O atributo char define o caractere a ser procurado. Detect2Chars Detecta dois caracteres específicos, em uma ordem definida. <Detect2Chars char="(caracter)" char1="(caracter)" (atributos comuns) (dinâmico) /> O atributo char define o primeiro caractere a ser procurado, e o atributo char1 o segundo. AnyChar Detecta um caractere de um conjunto de caracteres especificados. <AnyChar String="(string)" (atributos comuns) /> O atributo String define o conjunto de caracteres. StringDetect Detecta uma string exata. <StringDetect String="(string)" [insensitive="TRUE|FALSE;"] (atributos comuns) (dinâmico) /> O atributo String define a seqüência a encontrar. O atributo insensitive é por padrão false e é passado à função de comparação de cadeias de caracteres. Se o valor for true a comparação não faz distinção entre maiúsculas e minúsculas. RegExpr Procura por uma expressão regular. <RegExpr String="(texto)" [insensitive="TRUE|FALSE;"] [minimal="TRUE|FALSE"] (atributos comuns) (dinâmico) /> O atributo String define a expressão regular. O insensitive é, por padrão, false e é passado ao motor de expressões regulares. O minimal é, por padrão, false e é passado ao motor de expressões regulares. Pelo motivo que as regras estão sempre iniciando a busca no início da string atual, uma expressão regular iniciada com um acento circunflexo (^ ) indica que a regra deve ser coincidente somente no início da linha. Veja em Expressões Regulares mais informações sobre o assunto. keyword Detecta uma palavra-chave de uma lista especificada. <keyword String="(nome da lista)" (atributos comuns) /> O atributo String identifica a lista de palavras-chave pelo nome. Uma lista com aquele nome, portanto, deve existir. Int Detecta um número inteiro. <Int (atributos comuns) (dinâmico) /> Esta regra não tem atributos específicos. As regras-filho são tipicamente usadas para detectar as combinações de L e U depois do número, o que indica o tipo inteiro no código do programa. De fato, todas as regras são permitidas como regras-filhas, contudo, o DTD só permite a regra-filha StringDetect. O exemplo a seguir faz correspondência com os números inteiros, seguidos do caracter 'L'. <Int attribute="Decimal" context="#stay" > <StringDetect attribute="Decimal" context="#stay" String="L" insensitive="true"/> </Int> Float Detecta um número de ponto flutuante. <Float (atributos comuns) /> Esta regra não tem atributos específicos. O AnyChar é permitido como regra-filha e é tipicamente usada para detectar combinações; veja a regra Int para mais referências. HlCOct Detecta uma representação de um número octal. <HlCOct (atributos comuns) /> Esta regra não possui atributos específicos. HlCHex Detecta uma representação de um número hexadecimal. <HlCHex (atributos comuns) /> Esta regra não possui atributos específicos. HlCStringChar Detecta um caractere de escape. <HlCStringChar (atributos comuns) /> Esta regra não possui atributos específicos. Corresponde a representações literais dos caracteres usados normalmente no código do programa como, por exemplo, o \n (nova linha) ou o \t (TAB). Os seguintes caracteres irão corresponder se estiverem após uma barra invertida (\): abefnrtv"'?\. Além disso, os números escapados em hexadecimal como, por exemplo, o \xff e os números octais escapados, como o \033, irão corresponder. HlCChar Detecta um caracter do C. <HlCChar (atributos comuns) /> Esta regra não possui atributos específicos. Corresponde aos caracteres em C colocados dentro de um tique (Exemplo: 'c'). Como tal, dentro dos tiques poderá existir um único caracter ou um caracter de escape. Veja o 'HlCStringChar' para ver as seqüências de caracteres de escape correspondentes. RangeDetect Detecta uma string com os caracteres de início e fim definidos. <RangeDetect char="(caractere)" char1="(caractere)" (atributos comuns) /> O char define o caracter de início e o char1 o caracter que termina o intervalo. Útil para detectar, por exemplo, pequenas cadeias de caracteres entre aspas e semelhantes, mas repare que, uma vez que o motor de realce de sintaxe funciona com uma linha de cada vez, isto não irá encontrar as cadeias de caracteres que se prolonguem por mais de uma linha. LineContinue Coincide com o final da linha. <LineContinue (atributos comuns) /> Esta regra não possui atributos específicos. Esta regra é útil para mudar de contexto no fim da linha, se o último caracter for uma barra invertida ('\'). Isto é necessário, por exemplo no C/C++, para continuar as macros ou cadeias de caracteres. IncludeRules Inclui as regras de outro contexto ou linguagem/arquivo. <IncludeRules context="ligacao_contexto" [includeAttrib="true|false"] /> O atributo context define o contexto a incluir. Se for texto simples, inclui todas as regras definidas no contexto atual, como por exemplo: <IncludeRules context="outroContexto" /> Se o texto começar por ##, o sistema de realce irá procurar outra definição de linguagem com o nome indicado, como por exemplo: <IncludeRules context="##C++" /> Se o atributo includeAttrib for true, muda o atributo de destino para o da origem. Isto é necessário para fazer, por exemplo, funcionar os comentários, se o texto correspondente ao contexto incluído for de um realce diferente do contexto-anfitrião. DetectSpaces Detecta espaços em branco. <DetectSpaces (atributos comuns) /> Esta regra não possui atributos específicos. Use esta regra se souber que poderão existir vários espaços em branco à frente como, por exemplo, no início das linhas indentadas. Esta regra irá ignorar todos os espaços em branco, em vez de testar várias regras e ignorar uma de cada vez, devido a uma falta de correspondência. DetectIdentifier Detecta os textos dos identificadores (como acontece na expressão regular: [a-zA-Z_][a-zA-Z0-9_]*). <DetectIdentifier (atributos comuns) /> Esta regra não possui atributos específicos. Use esta regra para ignorar uma sequência de caracteres de palavras de uma vez, em vez de testar com várias regras e ignorar uma de cada vez, por falta de correspondência. Dicas & Truques Logo que tenha compreendido como funciona a mudança de contexto, será fácil de criar definições de realce. Ainda que você deva verificar com cuidado a regra que escolher, dependendo da situação, as expressões regulares são muito poderosas, só que são lentas em comparação com as outras regras. Assim, você poderá considerar útil as seguintes dicas. Se você só corresponder com 2 caracteres, use o Detect2Chars em vez do StringDetect. O mesmo aplica-se ao DetectChar. As expressões regulares são fáceis de usar mas, normalmente, existe outra forma muito mais rápida de obter o mesmo resultado. Assuma que só deseja corresponder com o caracter '#' se for o primeiro caracter da linha. Uma solução baseada em expressões regulares seria semelhante à seguinte: <RegExpr attribute="Macro" context="macro" String="^\s*#" /> Você poderá obter o mesmo se usar: <DetectChar attribute="Macro" context="macro" char="#" firstNonSpace="true" /> Se quiser corresponder à expressão regular '^#', poderá usar ainda o DetectChar com o atributo column="0". O atributo column conta com base no número de caracteres; assim, uma tabulação conta como se fosse apenas um caracter. Você poderá mudar de contextos sem processar os caracteres. Assuma que deseja mudar de contexto quando encontrar o texto */, mas necessita de processar essa seqüência no próximo contexto. A regra abaixo irá corresponder e o atributo lookAhead fará com que o sistema de realce mantenha o texto correspondente no próximo contexto. <Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" lookAhead="true" /> Use o DetectSpaces se você souber que irão ocorrer vários espaços em branco. Use o DetectIdentifier em vez da expressão regular '[a-zA-Z_]\w*'. Use os estilos padrão sempre que puder. Desta forma, o usuário irá encontrar um ambiente familiar. Procure em outros arquivos XML para ver como as outras pessoas implementam as regras mais complicadas. Você poderá validar todos os arquivos XML se usar o comando xmllint --dtdvalid language.dtd aMinhaSintaxe.xml. Se repetir algumas expressões regulares complexas com freqüência, você poderá usar as ENTIDADES. Por exemplo: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE language SYSTEM "language.dtd" [ <!ENTITY referencia "[A-Za-z_:][\w.:_-]*"> ]> Agora, você poderá usar o &referencia; em vez da expressão regular.