Lavorare con l'evidenziazione della sintassi

Panoramica

L'evidenziazione della sintassi è quel qualcosa che rende l'editor in grado di visualizzare automaticamente il testo con stili e colori differenti, a seconda delle funzioni delle stringhe in relazione allo scopo del file. Nel sorgente di un programma, per esempio, le istruzioni di controllo potrebbero essere rese in grassetto, mentre i tipi di dati e i commenti in colori diversi dal resto del testo. Questo migliora di molto la leggibilità del testo, e rende l'autore più efficiente e più produttivo.

Una funzione C++, resa con l'evidenziazione della sintassi.

Una funzione C++, resa con l'evidenziazione della sintassi.

La stessa funzione C++, senza l'evidenziazione.

La stessa funzione C++, senza l'evidenziazione.

Dei due esempi, qual è il più semplice da leggere?

KatePart nasce con un sistema, flessibile, configurabile e in grado di eseguire l'evidenziazione della sintassi. Nella distribuzione standard sono fornite definizioni per una vasta gamma di linguaggi di programmazione, di scripting e di markup, e per altri formati di file di testo; inoltre puoi inserire le tue definizioni in un semplice file XML.

Quando apri un file basato sul tipo MIME del file KatePart riconoscerà automaticamente le giuste regole della sintassi; questo in base alla sua estensione o, se assente, al suo contenuto. Puoi sempre impostare manualmente la sintassi da usare qualora notassi dei problemi, facendo clic su StrumentiEvidenziazione.

Gli stili e i colori usati da ciascuna definizione di evidenziazione della sintassi possono essere configurati usando la scheda Stili di testo evidenziato, mentre i tipi MIME e le estensioni del file che dovrebbero essere usate a questo scopo sono gestiti nella scheda Modi e tipi di file.

Nota

L'evidenziazione della sintassi serve per migliorare la leggibilità del testo, ma non puoi affidarti ad essa per convalidarlo. La marcatura del testo in base alla sintassi può essere difficoltosa a seconda del formato che si sta utilizzando, e in qualche caso l'autore delle regole della sintassi sarà orgoglioso qualora il 98% del testo venga correttamente renderizzato. Tuttavia, in genere, sarà difficile incontrare quel 2% non corretto.

Il sistema di evidenziazione della sintassi di KatePart

In questa sezione sarà trattato più in dettaglio il meccanismo di evidenziazione della sintassi. Ti servirà se vorrai saperne di più, oppure se vorrai cambiare o creare delle definizioni di sintassi.

Come funziona

Una delle prime cose che l'editor KatePart fa ogni volta che apri un file è quella di individuare quale sia la definizione di sintassi da usare. Mentre stai leggendo il testo del file, e mentre ci stai digitando qualcosa, il sistema di evidenziazione della sintassi analizza il testo usando le regole definite dalle definizioni di sintassi, e lo marca dove i diversi contesti e gli stili iniziano e finiscono.

Quando digiti nel documento il nuovo testo viene analizzato e marcato al volo. Cosicché, se cancelli un carattere che è marcato come inizio o fine di un contesto, lo stile del testo circostante viene cambiato di conseguenza.

Le definizioni di sintassi usate dal sistema di evidenziazione di KatePart sono file XML, che contengono

  • Regole per individuare il ruolo del testo, organizzate in blocchi di contesto

  • Liste di parole chiave

  • Definizioni di oggetti di stile

Quando il testo viene analizzato le regole di rilevamento sono valutate nell'ordine in cui sono definite, e, qualora l'inizio della stringa corrente coincida con una regola, viene usato il contesto relativo. Il punto di inizio del testo viene spostato nel punto finale in cui la regola è stata applicata, e inizia così un nuovo ciclo, che comincia nel contesto impostato dalla regola applicata.

Regole

Le regole di rilevamento sono il cuore del sistema di rilevamento della sintassi. Una regola è una stringa, un carattere o un'espressione regolare con cui confrontare il testo che viene analizzato. Contiene informazioni sullo stile da usare per la parte corrispondente del testo. Può passare il contesto di lavoro del sistema sia ad un contesto menzionato esplicitamente che al precedente contesto usato dal testo.

Le regole sono organizzate in gruppi di contesto, ciascuno dei quali viene usato per i concetti principali di testo all'interno del formato, per esempio le stringhe di testo virgolettato o i blocchi di commenti nei sorgenti dei programmi. Questo assicura che il sistema di evidenziazione non abbia necessità di cercare tra le regole se non è necessario, e che alcune sequenze di caratteri nel testo possono essere trattate in maniera diversa a seconda del contesto corrente.

I contesti possono essere generati dinamicamente per permettere l'uso di istanze di dati specifici nelle regole.

Stili di contesto e parole chiave

In alcuni linguaggi di programmazione i numeri interi sono trattati dal compilatore (il programma che converte il codice sorgente in binario eseguibile) in maniera diversa da quelli in virgola mobile, e all'interno di una stringa virgolettata ci possono essere dei caratteri con un significato speciale. In questi casi ha senso visualizzarli in modo differente da quelli circostanti, in modo che possano essere identificati facilmente durante la lettura del testo. Così, pur non rappresentando un contesto speciale, questi possono essere comunque trattati come tali dal sistema di evidenziazione della sintassi, in modo da essere contrassegnati e quindi visualizzati in modo diverso.

Una definizione di sintassi può contenere tutti gli stili richiesti per racchiudere i concetti del formato per cui è usata.

In molti formati ci sono liste di parole che rappresentano un concetto specifico: per esempio nei linguaggi di programmazione le istruzioni di controllo sono un concetto, i nomi dei tipi di dato un altro, e le funzioni proprie del linguaggio un terzo. Il sistema di evidenziazione della sintassi di KatePart può usare queste liste per individuare le parole marcandole nel testo, in modo da enfatizzare i concetti dei formati di testo.

Stili predefiniti

Se apri un file sorgente in C++, un sorgente Java™ e un documento HTML in KatePart vedrai che, anche se i formati e le parole scelte per il trattamento speciale sono diversi, i colori utilizzati sono gli stessi. Questo succede perché KatePart ha una lista di stili predefiniti che sono impiegati dalle definizioni individuali di sintassi.

Questo rende semplice riconoscere concetti simili in formati di testo diversi. Per esempio, i commenti sono presenti in quasi tutti i linguaggi di programmazione, di scripting e di markup: se sono sempre renderizzati utilizzando lo stesso stile in tutti i linguaggi non avrai bisogno di fermarti a pensare per identificarli nel testo.

Suggerimento

Tutti gli stili di una definizione di sintassi usano uno degli stili predefiniti: solo poche definizioni di sintassi fanno usa di altri non predefiniti. Potrebbe valer la pena lanciare la finestra di configurazione se usi spesso un formato, per vedere se alcuni concetti fanno uso di uno stesso stile. Per esempio, c'è solo uno stile predefinito per le stringhe, ma il linguaggio di programmazione Perl opera con due: potresti quindi migliorarne l'evidenziazione configurandole in modo che siano leggermente diverse. Tutti gli stili predefiniti disponibili saranno spiegati in seguito.

Il formato XML di definizione dell'evidenziazione

Panoramica

KatePart usa l'infrastruttura di evidenziazione della sintassi di KDE Frameworks™. I file xml per l'evidenziazione predefinita forniti insieme a KatePart sono compilati in modo predefinito nella libreria di evidenziazione della sintassi.

Questa sezione è una panoramica sul formato XML di definizione dell'evidenziazione. Basandosi su un piccolo esempio saranno descritti i componenti principali, il loro significato e il loro uso. La prossima sezione scenderà invece nei dettagli delle regole di rilevamento dell'evidenziazione.

La definizione formale, anche conosciuta come XSD, si trova nel deposito dell'evidenziazione della sintassi, nel file language.xsd

I file .xml per la definizione personalizzata di evidenziazione si trovano in org.kde.syntax-highlighting/syntax/ nella tua cartella utente, e vengono trovati con qtpaths--paths GenericDataLocation, che generalmente è $HOME/.local/share

In Windows® questi file si trovano in %USERPROFILE%/AppData/Local/org.kde.syntax-highlighting/syntax. %USERPROFILE% viene generalmente espanso in C:\\Users\\utente.

Le sezioni principali dei file di definizione dell'evidenziazione di KatePart

Un file di evidenziazione contiene un'intestazione che imposta la versione XML:
<?xml version="1.0" encoding="UTF-8"?>
Il file di definizione inizia con l'elemento language. Gli attributi disponibili sono:

Attributi richiesti:

name imposta il nome del linguaggio. Appare successivamente nei menu e nelle finestre.

section specifica la categoria.

extensions definisce le estensioni dei file, come "*.cpp;*.h"

version specifica l'attuale revisione del file di definizione in termini di un numero intero; sii certo di incrementare questo numero se cambi un file di definizione dell'evidenziazione.

kateversion specifica l'ultima versione supportata di KatePart.

Attributi opzionali:

mimetype associa i tipi MIME dei file.

casesensitive definisce se le parole chiave sono sensibili alle maiuscole oppure no.

priority è necessaria se un'altra definizione di evidenziazione usa le stesse estensioni; vince quella con priorità più alta.

author contiene il nome dell'autore e il suo indirizzo di posta elettronica.

license contiene la licenza, di solito MIT, per i nuovi file di evidenziazione della sintassi.

style contiene il linguaggio fornito, ed è usato dai rientratori per gli attributi required-syntax-style.

rientratore definisce quale rientratore sarà usato come predefinito. Quelli disponibili sono: ada, normal, cstyle, cmake, haskell, latex, lilypond, lisp, lua, pascal, python, replicode, ruby e xml.

hidden definisce se il nome deve apparire nei menu di KatePart.

Allora la prossima riga potrebbe apparire così:

<language name="C++" version="1" kateversion="2.4" section="Sources" extensions="*.cpp;*.h" />
Viene poi l'elemento highlighting, che contiene l'elemento opzionale list, e i richiesti contexts e itemDatas.

L'elemento list contiene una lista di parole chiave; in questo caso le parole chiave sono class e const; puoi aggiungere tutte le liste di cui hai bisogno.

L'elemento contexts contiene tutti i contesti; il primo è di default l'inizio dell'evidenziazione. Ci sono due regole nel contesto Normal Text, una associa la lista delle parole chiave con nome somename, e un'altra rileva una virgoletta, passando il contesto a string. Per saperne di più leggi il prossimo capitolo.

La terza parte è l'elemento itemDatas: contiene tutti i colori e gli stili dei caratteri che sono necessari per il contesto e per le regole. In questo esempio vengono usati itemData Normal Text, String e Keyword.

<highlighting>
    <list name="somename">
      <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>
L'ultima parte di una definizione di evidenziazione è la sezione opzionale general. Può contenere informazioni sulle parole chiave, il raggruppamento del codice, i commenti e i rientri.

La sezione comment definisce con quale stringa viene introdotta una singola riga di commento. Puoi anche definire un commento multi-riga usando multiLine con l'attributo addizionale end. Questo viene usato se l'utente preme la scorciatoia per commentare/non commentare.

La sezione keywords definisce se la lista delle parole chiave è sensibile alle maiuscole oppure no. Altri attributi verranno spiegati più tardi.

<general>
    <comments>
      <comment name="singleLine" start="#"/>
    </comments>
    <keywords casesensitive="1"/>
  </general>
</language>

Le sezioni in dettaglio

Questa parte descriverà tutti gli attributi disponibili per contexts, itemDatas, keywords, comments, il raggruppamento del codice e i rientri.

L'elemento context appartiene al gruppo contexts. Di per sé un contesto definisce le regole specifiche del contesto, tipo cosa dovrebbe accadere qualora il sistema di evidenziazione raggiunga il fine riga. Gli attributi disponibili sono:

name dichiara il nome del contesto. Le regole faranno uso di questo nome per specificare il contesto al quale passare se la regola viene soddisfatta.

lineEndContext definisce il contesto a cui il sistema di evidenziazione passa se viene raggiunta la fine della riga. Questo può essere sia il nome di un altro contesto, #stay per non lasciare il contesto (ad es.. non fare niente), oppure #pop, che causerà l'abbandono di questo contesto. È possibile usare per esempio #pop#pop#pop per saltare tre volte, o anche #pop#pop!OtherContext per saltare due volte e passare al contesto chiamato OtherContext.

lineEmptyContext definisce il contesto se viene incontrata una riga vuota. Predefinito: #stay.

fallthrough definisce se il sistema di evidenziazione deve passare al contesto specificato in fallthroughContext qualora nessuna regola venga soddisfatta. Predefinito: false.

fallthroughContext specifica il prossimo contesto se nessuna regola viene soddisfatta.

L'elemento itemData appartiene al gruppo itemDatas. Definisce lo stile del carattere e i colori, e quindi è possibile definire i propri stili e i propri colori. Raccomandiamo però di attenersi agli stili predefiniti, se possibile, cosicché gli utenti vedranno sempre gli stessi colori anche in linguaggi diversi. Tuttavia a volte non c'è altro modo se non quello di cambiare i colori e gli attributi dei caratteri. Sono richiesti il nome degli attributi e StileNumDef, ma gli altri sono opzionali. Gli attributi disponibili sono:

name imposta il nome di itemData. I contesti e le regole useranno questo nome nei loro attributi attribute a cui fa riferimento itemData.

defStyleNum definisce quale stile predefinito usare. Gli stili predefiniti disponibili sono spiegati in dettaglio più tardi.

color definisce un colore. Sono validi i formati «#rrggbb» o «#rgb».

selColor definisce la selezione del colore.

Il testo sarà in corsivo se italic è true.

Il testo sarà in grassetto se bold è true.

Il testo sarà sottolineato se underline è true.

Il testo sarà in barrato se strikeout è true.

Il testo sarà controllato ortograficamente se spellChecking è true.

L'elemento keywords del gruppo general definisce le proprietà delle parole chiave. Gli attributi disponibili sono:

casesensitive può essere true oppure false; se è true tutte le parole chiave soddisfano la sensibilità alle maiuscole.

weakDeliminator è una lista di caratteri che non agiscono da delimitatori di parole; per esempio, il punto «.» è un delimitatore di parola. Se assumiamo che una parola chiave in una lista possa contenere un punto, sarà soddisfatta solo se specifichi che il punto è un delimitatore debole.

additionalDeliminator definisce delimitatori addizionali.

wordWrapDeliminator definisce i caratteri dopo dei quali una riga può andare a capo.

Sono delimitatori predefiniti e terminatori di parola i caratteri .():!+,-<=>%&*/;?[]^{|}~\, gli spazi (« ») e i tabulatori («\t»).

L'elemento comment del gruppo comments definisce le proprietà che sono usate in StrumentiCommenta e StrumentiDecommenta. Gli attributi disponibili sono:

name è sia singleLine che multiLine. Se scegli multiLine sono richiesti gli attributi end e region.

start definisce la stringa usata per iniziare un commento. In C++ sarebbe "/*".

end definisce la stringa per chiudere un commento. In C++ questo sarebbe "*/".

region dovrebbe essere il nome dei commenti multi-riga raggruppabili. Assumendo di avere nelle regole beginRegion="Comment" ... endRegion="Comment" si dovrebbe usare region="Comment". In questo modo l'azione di decommento funziona anche se non viene selezionato tutto il testo di un commento multi-riga, il cursore deve solo essere all'interno del commento.

L'elemento raggruppamento del gruppo general definisce le proprietà di raggruppamento del codice. Gli attributi disponibili sono:

Se indentationsensitive è true i marcatori del raggruppamento del codice saranno aggiunti basandosi sul rientro, come nel linguaggio di scripting Python. Di solito non hai necessità di impostarlo, e di solito è impostato a false.

Stili predefiniti disponibili

Gli stili predefiniti sono stati già trattati, come piccolo riassunto: gli stili predefiniti sono i caratteri predefiniti e gli stili colore.

Stili generali predefiniti:

dsNormal, quando non è richiesta nessuna evidenziazione speciale.

dsKeyword, parola chiave integrata nel linguaggio.

dsFunction, chiamate di funzioni e definizioni.

dsVariabile, se applicabile: nomi delle variabili (ad es. $someVar in PHP/Perl).

dsControlFlow, parole chiave per il controllo del flusso, come if, else, switch, break, return, yield, ...

dsOperator, operatori come + - * / :: < >

dsBuiltIn, funzioni integrate, classi e oggetti.

dsExtension, estensioni comuni, come le classi Qt e le funzioni o le macro in C++ e in Python.

dsPreprocessor, direttive al preprocessore o definizioni di macro.

dsAttribute, annotazioni come @override e __declspec(...).

Stili predefiniti relativi alle stringhe:

dsChar, caratteri singoli, come 'x'.

dsSpecialChar, caratteri con significati speciali nelle stringhe, come escape, sostituzioni, oppure operatori regex.

dsString, stringhe come "hello world".

dsVerbatimString, letterale o stringa grezza, come 'raw \backlash' in Perl, CoffeeScript, e shell, come r'\raw' in Python.

dsSpecialString, SQL, regexes, documenti HERE, modi LaTeX math, ...

dsImport, importazione, inclusione, richieste di moduli.

Stili predefiniti relativi ai numeri:

dsDataType, tipi di dati integrati, come int, void, u64.

dsDecVal, valori decimali.

dsBaseN, valori con base diversa da 10.

dsFloat, valori in virgola mobile.

dsCostant, costanti integrate e definite dall'utente, come PI.

Commenti e stili predefiniti relativi alla documentazione:

dsComment, commenti.

dsDocumentation, /** Commenti nella documentazione */ o """docstrings""".

dsAnnotation, comandi nella documentazione, come @param, @brief.

dsCommentVar, i nomi delle variabili usati nei comandi precedenti, come "pippobar" in @param pippobar.

dsRegionMarker, delimitatori di regioni, come //BEGIN e //END nei commenti.

Altri stili predefiniti:

dsInformation, annotazioni e suggerimenti, come @note in doxygen.

dsWarning, avvisi, come @warning in doxygen.

dsAlert, parole speciali, come TODO, FIXME, XXXX.

dsError, evidenziazione di errori e sintassi errata.

dsOthers per tutto il resto.

Regole di rilevamento dell'evidenziazione

Questa sezione descrive le regole di rilevamento della sintassi.

Ogni regola può associare zero o più caratteri all'inizio della stringa su cui è testata. Se la regola corrisponde i caratteri associati sono assegnati allo stile o all'attributo definito dalla regola; una regola può chiedere che l'attuale contesto venga cambiato.

Una regola è un qualcosa che assomiglia a questo:

<RuleName attribute="(identifier)" context="(identifier)" [attributi specifici della regola] />

attribute identifica lo stile da usare per i caratteri associati secondo il nome, mentre context identifica il contesto da usare da qui in avanti.

context può essere identificato da:

  • identifier, che è il nome dell'altro contesto.

  • order, che dice al motore di rimanere nel contesto attuale (#stay), oppure di ritornare a quello precedentemente usato nella stringa (#pop).

    Per tornare indietro di più passi la parola chiave #pop può essere ripetuta: #pop#pop#pop

  • order seguito da un punto esclamativo (!) e identifier, che faranno prima seguire al motore l'ordine, e poi lo mandano in un altro contesto, ad esempio #pop#pop!OtherContext.

Gli attributi specifici per la regola variano, e sono descritti nelle sezioni seguenti.

Attributi comuni

Tutte le regole hanno in comune i seguenti attributi, e sono disponibili ogni volta che compare (attributi comuni). Sono attributi richiesti attribute e context, tutti gli altri sono opzionali.

  • attribute: un attributo associato ad un determinato itemData.

  • context: specifica il contesto al quale il sistema di evidenziazione passa se la regola corrisponde.

  • beginRegion: inizia un blocco di raggruppamento del codice. Predefinito: non impostato.

  • endRegion: chiude un un blocco di raggruppamento del codice. Predefinito: non impostato.

  • lookAhead: se impostato a true il sistema di evidenziazione non processerà la lunghezza assegnata. Predefinito: false.

  • firstNonSpace: corrisponde solo se la stringa è la prima senza spazi nella riga. Predefinito: false.

  • column: corrisponde solo se la colonna combacia. Predefinito: non impostato.

Regole dinamiche

Alcune regole permettono di usare l'attributo opzionale dynamic di tipo booleano il cui valore predefinito è false. Se dynamic è true, una regola può usare un segnaposto che rappresenta le corrispondenze di una regola di tipo espressione regolare che è passata al contesto corretto nei proprio attributi string o char. Nel caso di string il segnaposto %N (dove N è un numero) sarà sostituito con la corrispondente stringa di cattura N dall'espressione regolare chiamante. Nel caso di char il segnaposto deve essere un numero N e sarà sostituito con il primo carattere della corrispondente stringa di cattura N dall'espressione regolare chiamante. Quando una regola permette l'uso di questo attributo conterrà (dynamic).

  • dynamic: può essere (true|false).

Le regole in dettaglio

DetectChar

Rileva un singolo carattere specifico. Usato comunemente per trovare ad esempio la fine di una stringa tra virgolette.

<DetectChar char="(carattere)" (attributi comuni) (dynamic) />

L'attributo char definisce il carattere da abbinare.

Detect2Chars

Rileva due caratteri specifici in un ordine definito.

<Detect2Chars char="(carattere)" char1="(carattere)" (attributi comuni)  />

L'attributo char definisce il primo carattere da associare, char1 il secondo.

AnyChar

Rileva un carattere da un insieme di caratteri specificati.

<AnyChar String="(stringa)" (attributi comuni) />

L'attributo String definisce l'insieme dei caratteri.

StringDetect

Rileva una stringa esatta.

<StringDetect String="(stringa)" [insensitive="true|false"] (attributi comuni) (dynamic) />

L'attributo String definisce la stringa da abbinare. All'attributo insensitive viene assegnato come valore predefinito false, e viene passato alla funzione di confronto della stringa. Se il valore è true allora nel confronto non si terrebbe conto delle maiuscole.

WordDetect

Non rileva una stringa esatta, ma i confini di una parola quali un punto '.' o uno spazio all'inizio o alla fine della parola. Pensa \b<string>\b come un'espressione regolare, ma più veloce della regola RegExpr.

<WordDetect String="(stringa)" [insensitive="true|false"] (attributi comuni)  />

L'attributo String definisce la stringa da abbinare. All'attributo insensitive viene assegnato come valore predefinito false, e viene passato alla funzione di confronto della stringa. Se il valore è true allora nel confronto non si terrebbe conto delle maiuscole.

Da: Kate 3.5 (KDE 4.5)

RegExpr

Corrisponde con un'espressione regolare.

<RegExpr String="(stringa)" [insensitive="true|false"] [minimal="true|false"] (attributi comuni) (dynamic) />

L'attributo String definisce l'espressione regolare.

insensitive ha come valore predefinito false, e viene passato al motore per le espressioni regolari.

minimal ha come valore predefinito false, e viene passato al motore per le espressioni regolari.

Le regole sono sempre confrontate con l'inizio della stringa corrente, tuttavia un'espressione regolare iniziante con un apice (^) è segno che la regola dovrebbe essere confrontata invece con l'inizio di una riga.

Vedi Espressioni regolari per maggiori informazioni.

keyword

Rileva una parola chiava da una lista specifica.

<keyword String="(nome lista)" (attributi comuni) />

L'attributo String identifica la lista di parole chiave per nome. Deve esistere una lista con questo nome.

Il sistema di evidenziazione elabora regole di parole chiave in maniera molto ottimizzata. Questo rende assolutamente necessario che ogni parola chiave da confrontare sia circondata da delimitatori definiti, sia impliciti (i delimitatori predefiniti) che espliciti, specificati dalla proprietà additionalDeliminator con l'etichetta keywords.

Se una parola chiave da confrontare dovesse contenere un carattere di delimitazione, allora questo dovrebbe essere aggiunto alla proprietà weakDeliminator con l'etichetta keywords. Questo carattere perderebbe le sue proprietà di delimitatore in tutte le regole keywords.

Int

Rileva un numero intero.

<Int (attributi comuni) />

Questa regola non ha attributi specifici.

Float

Rileva un numero in virgola mobile.

<Float (attributi comuni) />

Questa regola non ha attributi specifici.

HlCOct

Rileva un numero con rappresentazione ottale.

<HlCOct (attributi comuni) />

Questa regola non ha attributi specifici.

HlCHex

Rileva un numero con rappresentazione esadecimale.

<HlCHex (attributi comuni) />

Questa regola non ha attributi specifici.

HlCStringChar

Rileva un carattere di escape.

<HlCStringChar (attributi comuni) />

Questa regola non ha attributi specifici.

Controlla la corrispondenza di espressioni letterali di caratteri generalmente usate nel codice dei programmi, per esempio \n (nuova riga) o \t (TAB).

I seguenti caratteri corrisponderanno se saranno seguiti da una barra inversa (\): abefnrtv"'?\. Inoltre corrisponderanno numeri esadecimali preceduti dal carattere di escape, come per esempio \xff e numeri ottali preceduti dal carattere di escape, per esempio \033.

HlCChar

Rileva il carattere C

<HlCChar (attributi comuni) />

Questa regola non ha attributi specifici.

Controlla la corrispondenza di caratteri C racchiusi da un accento (Esempio: 'c'). Gli accenti possono essere caratteri singoli o caratteri di escape. Vedi HlCStringChar per le sequenze di caratteri di escape associate.

RangeDetect

Rileva una stringa con caratteri di inizio e di fine definiti.

<RangeDetect char="(carattere)"  char1="(carattere)" (attributi comuni) />

char definisce il carattere con cui inizia l'intervallo, char1 il carattere con cui finisce.

Utile per individuare per esempio piccole stringhe tra virgolette e simili; nota però che non verranno in questo modo trovate le stringhe che si estendono dopo un'interruzione di riga. Questo perché il motore di evidenziazione lavora su una riga alla volta.

LineContinue

Associa un carattere specificato con la fine di una riga.

<LineContinue (attributi comuni) [char="\"] />

char carattere opzionale da associare; come predefinito c'è la barra inversa ('\'). Novità da KDE 4.13.

Questa regola è utile per cambiare il contesto alla fine di una riga. È necessaria per esempio in C/C++, per continuare le macro o le stringhe.

IncludeRules

Include delle regole da un altro file di contesto o da un linguaggio.

<IncludeRules context="contextlink" [includeAttrib="true|false"] />

L'attributo context definisce quale contesto includere.

Se è una stringa semplice include tutte le regole nel contesto corrente, per esempio:

<IncludeRules context="altroContesto" />

Se la stringa contiene ## il sistema di evidenziazione cercherà un contesto in un altra definizione di linguaggio con il nome assegnato, per esempio

<IncludeRules context="String##C++" />

dovrebbe includere il contesto String dalle definizioni di evidenziazione del C++.

Se l'attributo includeAttrib è true cambia l'attributo di destinazione con uno del sorgente. Questo è richiesto per esempio per fare dei commenti, se il testo associato al contesto incluso ha una diversa evidenziazione dal contesto che lo ospita.

DetectSpaces

Rileva gli spazi.

<DetectSpaces (attributi comuni) />

Questa regola non ha attributi specifici.

Usa questa regola quando sai che potrai incontrare numerosi spazi, per esempio all'inizio di righe rientrate. Questa regola salterà tutti gli spazi in un colpo solo, invece di provare regole multiple da scartarle di volta in volta per mancanza di corrispondenza.

DetectIdentifier

Rileva gli identificatori di stringhe (come un'espressione regolare [a-zA-Z_][a-zA-Z0-9_]*).

<DetectIdentifier (attributi comuni) />

Questa regola non ha attributi specifici.

Usa questa regola per saltare subito una stringa di caratteri alfanumerici, invece di usare più regole e saltare i caratteri uno alla volta per mancanza di corrispondenza.

Suggerimenti e trucchi

Una volta che hai capito come funziona il passaggio del contesto sarà semplice scrivere definizioni di evidenziazione, anche se dovresti controllare attentamente quale regola scegliere e in quale situazione. Le espressioni regolari sono molto potenti, ma sono lente se comparate con altre regole. Così tieni conto dei suggerimenti seguenti.

  • Se cerchi la corrispondenza di solo due caratteri usa Detect2Chars invece che StringDetect. Lo stesso vale per DetectChar.

  • Le espressioni regolari sono semplici da usare, ma spesso c'è un altro modo molto più veloce per ottenere gli stessi risultati. Considera di voler semplicemente cercare la corrispondenza del carattere «#» solo quando è il primo della riga. Una soluzione basata su un'espressione regolare assomiglierebbe a questo:

    <RegExpr attribute="Macro" context="macro" String="^\s*#" />

    . Puoi ottenere lo stesso risultato in maniera più veloce usando:

    <DetectChar attribute="Macro" context="macro" char="#" firstNonSpace="true" />

    . Se vuoi cercare corrispondenze per l'espressione regolare '^#' puoi sempre usare DetectChar con l'attributo column="0". L'attributo column conta i caratteri, e un tabulatore è un solo carattere.

  • Puoi cambiare i contesti senza bisogno di elaborare dei caratteri. Se vuoi cambiare contesto quando incontri la stringa */ devi almeno elaborare quella stringa nel contesto del testo. La regola qui sotto corrisponderà, e l'attributo lookAhead farà in modo che l'evidenziatore tenga la stringa corrispondente per il contesto successivo.

    <Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" lookAhead="true" />

  • Usa DetectSpaces se sai di incontrare molti spazi.

  • Usa DetectIdentifier al posto dell'espressione regolare '[a-zA-Z_]\w*'.

  • Usa gli stili predefiniti ogni volta che puoi. In questo modo l'utente si troverà in un ambiente familiare.

  • Guarda dentro altri file XML, per vedere come le altre persone implementano le regole difficili.

  • Puoi validare ogni file XML usando il comando validatehl.sh language.xsd mySyntax.xml. I file validatehl.sh e language.xsd si trovano nel deposito di evidenziazione della sintassi.

  • Se ripeti molto spesso delle espressioni regolari complesse puoi usare ENTITIES. Esempio:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE language SYSTEM "language.dtd"
    [
            <!ENTITY myref    "[A-Za-z_:][\w.:_-]*">
    ]>
    

    Ora puoi usare &myref; invece dell'espressione regolare.