Johan Thelmén
jth@home.se
Översättare
Arbeta med syntaxfärgläggning Översikt Syntaxfärgläggning är det som gör att editorn automatiskt visar text med olika stilar/färger, beroende på strängens funktion i relation till filens syfte. Till exempel i programkällkod, så kan kontrollsatser visas i fetstil, medan datatyper och kommentarer får annorlunda färg än resten av texten. Det här ökar textens läsbarhet väsentligt, och hjälper på så sätt författaren att vara effektivare och mer produktiv. En funktion i Perl, som visas med syntaxfärgläggning. En funktion i Perl, som visas med syntaxfärgläggning. Samma kod utan syntaxfärgläggning. Samma kod utan syntaxfärgläggning. Av de två exemplen, vilket är lättast att läsa? &kate; levereras med ett flexibelt, anpassningsbart och avancerat system för att göra syntaxfärgläggning, och standarddistributionen tillhandahåller definitioner för ett brett område av programspråk, formaterings- och skriptspråk samt andra textfilformat. Dessutom kan du tillhandahålla dina egna definitioner med enkla &XML;-filer. &kate; detekterar automatiskt de riktiga syntaxreglerna när du öppnar en fil, baserat på filens &MIME;-typ, som avgörs av dess filändelse, eller om den inte har någon, dess innehåll. Skulle du råka ut för ett dåligt val, kan du ställa in syntaxen som används för hand med menyn Dokument Färgläggningsläge. Stilarna och färgerna som används av varje syntaxfärgläggningsläge kan anpassas på sidan Utseende i inställningsdialogrutan, medan &MIME;-typerna det ska användas för hanteras på sidan Färgläggning. Syntaxfärgläggning finns för att förbättra läsbarheten för riktig text, men du kan inte lita på att den validerar din text. Att markera text för syntax kan vara svårt, beroende på formatet som du använder, och i vissa fall är upphovsmännen till syntaxreglerna stolta om 98 procent av texten visas korrekt, även om du behöver en ovanlig stil för att se de felaktiga 2 procenten. Du kan ladda ner uppdaterade eller nya definitioner av syntaxfärgläggning från &kate;s webbplats genom att klicka på knappen Ladda nerpå sidan Färgläggning i inställningsdialogrutan. &kate;s syntaxfärgläggningssystem Det här avsnittet beskriver &kate;s syntaxfärgläggningsmekanism i mer detalj. Det är avsett för dig, om du vill veta mer om den, eller om du vill skapa och ändra syntaxdefinitioner. Hur det fungerar Så fort du öppnar en fil, är en av de första sakerna som &kate;-editorn gör att avgöra vilken syntaxdefinition som ska användas för filen. När filens text läses in, och medan du skriver i den, så analyserar syntaxfärgläggningssystemet texten enligt reglerna som definieras i syntaxdefinitionen och markerar var i den som olika sammanhang och stilar börjar och slutar. När du skriver in text i dokumentet, så analyseras och markeras den nya texten i farten, så att om du tar bort ett tecken som markeras som början eller slutet på ett sammanhang, så ändras stilen på den omgivande texten i enlighet med detta. Syntaxdefinitioner som används av &kate;s syntaxfärgläggningssystem är &XML;-filer, som innehåller Regler för att detektera funktionen hos text, organiserade i sammanhangsblock Listor med nyckelord Definitioner av stilobjekt När texten analyseras utvärderas detekteringsreglerna i den ordning som de definierades, och om början på den nuvarande strängen matchar en regel, så används motsvarande sammanhang. Startpunkten i texten flyttas till den sista punkten där regeln matchade, och en ny genomgång av reglerna sker, med början i sammanhanget som anges av den matchande regeln. Regler Detekteringsreglerna är centrala för färgläggningsdetekteringssystemet. En regel är en sträng, ett tecken eller ett reguljärt uttryck som texten som ska analyseras matchas mot. Den innehåller information om vilken stil som ska användas för den delen av texten som matchar. Den kan byta arbetssammanhanget för systemet, antingen till ett sammanhang som anges explicit, eller till det föregående sammanhanget som användes av texten. Reglerna organiseras i sammanhangsgrupper. En sammanhangsgrupp används för de huvudsakliga koncepten i formatets text, till exempel textsträngar inom citationstecken eller kommentarblock i programkällkod. Det här försäkrar att färgläggningssystemet inte behöver gå igenom alla regler när det inte är nödvändigt, och att vissa teckensekvenser i texten kan hanteras annorlunda beroende på det nuvarande sammanhanget. Sammanhang kan skapas dynamiskt för att till exempel tillåta användning av instansspecifik data i regler. Sammanhangsstilar och nyckelord I vissa programspråk, hanteras heltal annorlunda än flyttal av kompilatorn (programmet som översätter källkoden till körbart binärformat), och det kan finnas tecken som har en särskild mening i en sträng med citationstecken. I sådana fall är det vettigt att visa dem på ett annat sätt än omgivningen så att de är lätta att identifiera när texten läses. Så även om de inte representerar speciella sammanhang, så kan de betraktas som sådana av syntaxfärgläggningssystemet, så att de kan markeras för att visas på ett annorlunda sätt. En syntaxdefinition kan innehålla så många stilar som krävs för att täcka koncepten i det format den används för. I många format finns det en lista på ord som representerar ett speciellt koncept. Till exempel i programspråk, så är kontrollsatserna ett koncept, namn på datatyper ett annat, och inbyggda funktioner i språket ett tredje. &kate;s syntaxfärgläggningssystem kan använda sådana listor för att detektera och markera ord i texten för att visa koncepten för textformaten. Standardstilar Om du öppnar en C++ källkodsfil, en Java källkodsfil och ett HTML-dokument i &kate;, så ser du att även om formaten är olika, och olika ord därför väljs för särskild behandling, så är färgerna som används samma. Det här beror på att &kate; har en fördefinierad lista med standardstilar, som används av varje individuell syntaxdefinition. Det här gör det lätt att känna igen liknande koncept i olika textformat. Kommentarer finns till exempel i nästa alla program-, skript- eller formateringsspråk, och när de visas med samma stil i alla språk, behöver du inte stanna och tänka efter för att identifiera dem i texten. Alla stilar i en syntaxdefinition använder en av standardstilarna. Några få syntaxdefinitioner använder fler stilar än det finns som standard, så om du ofta använder ett format, kan det vara värt att titta i inställningsdialogrutan för att se om några koncept använder samma stil. Det finns till exempel bara en standardstil för strängar, men eftersom programspråket Perl hanterar två sorters strängar, kan du utöka färgläggningen genom att ställa in dessa så att de skiljer sig något. Alla tillgängliga standardstilar förklaras senare. &XML; formatet för syntaxfärgläggningsdefinitioner Översikt Det här avsnittet är en översikt av färgläggningsdefinitionernas &XML;-format. Det beskriver huvudkomponenterna och deras betydelse och användning, och går djupare in i detaljerna för detekteringsreglerna. Den formella definitionen, också kallad en DTD, lagras i filen language.dtd som ska finnas installerad på ditt system i katalogen $TDEDIR/share/apps/kate/syntax. Huvudkomponenter i &kate;s färgläggningsdefinitioner En syntaxfärgläggningsfil innehåller ett huvud som anger XML-versionen och dokumenttypen: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE language SYSTEM "language.dtd"> Definitionsfilens rot är elementet language. Följande egenskaper är tillgängliga: Egenskaper som krävs: name anger språkets namn. Det visas senare i menyer och dialogrutor. section anger kategorin. extensions definierar filändelser, som "*.cpp;*.h". Valfria egenskaper: mimetype kopplar filer baserat på &MIME;-typ. version anger definitionsfilens aktuella version. kateversion anger senaste version av &kate; som stöds. casesensitive definierar om nyckelord är skiftlägeskänsliga eller inte. priority krävs om en annan syntaxfärgläggningsfil använder samma filändelse. Den högsta prioriteten vinner. author innehåller författarens namn och e-postadress. license innehåller licensen, oftast LGPL, Artistic, GPL och andra. hidden definierar om namnet ska visas i &kate;s menyer. Nästa rad kan alltså se ut så här: <language name="C++" version="1.00" kateversion="2.4" section="Sources" extensions="*.cpp;*.h" /> Därefter kommer elementet highlighting som innehåller det valfria elementet list och det nödvändiga elementen contexts och itemDatas. list element innehåller en lista med nyckelord. I det här fallet är nyckelorden class och const. Du kan lägga till så många listor som du behöver. Elementet contexts innehåller alla sammanhang. Det första sammanhanget är förvalt som start för färgläggningen. Det finns två regler i sammanhanget Normal Text som matchar listan av nyckelord med namnet något-namn och en regel som detekterar ett citationstecken och byter sammanhang till string. För att lära dig mer om regler, läs nästa kapitel. Den tredje delen är elementet itemDatas. Det innehåller alla färger och teckenstilar som behövs av sammanhangen och reglerna. I det här exemplet används itemData Normal Text, String och Keyword. <highlighting> <list name="något-namn"> <item> class </item> <item> const </item> </list> <contexts> <context attribute="Normal Text" lineEndContext="#pop" name="Normal Text" > <keyword attribute="Keyword" context="#stay" String="något-namn" /> <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> Den sista delen av färgläggningsdefinitionen är den valfria sektionen general. Den kan innehålla information om nyckelord, kodvikning, kommentarer och indentering. Sektionen comment definierar den sträng som enradskommentarer inleds med. Du kan också definiera flerradskommentarer med multiLine och den ytterligare egenskapen end. Det är användbart när användaren trycker på snabbtangenten som motsvarar kommentera/avkommentera. Sektionen keywords definierar om listor med nyckelord är skiftlägeskänsliga eller inte. Andra egenskaper förklaras senare. <general> <comments> <comment name="singleLine" start="#"/> </comments> <keywords casesensitive="1"/> </general> </language> Sektionerna i detalj Den här delen beskriver alla tillgängliga egenskaper för sammanhang, itemData, nyckelord, kommentarer, kodvikning och indentering. Elementet context hör till gruppen contexts. Själva sammanhanget definierar sammanhangsspecifika regler, som vad som ska ske om färgläggningssystemet når slutet på en rad. Tillgängliga egenskaper är: name är sammanhangets namn. Regler använder namnet för att ange sammanhanget att byta till om regeln matchar. lineEndContext definierar sammanhanget som färgläggningssystemet byter till om det når ett radslut. Det kan antingen vara namnet på ett annat sammanhang, #stay för att inte byta sammanhang (dvs. göra ingenting) eller #pop som gör att sammanhanget lämnas. Det är till exempel möjligt att använda #pop#pop#pop för att återgå tre steg. lineBeginContext definierar sammanhanget om början på en rad påträffas. Förval: #stay. fallthroughdefinierar om färgläggningssystemet byter till sammanhanget som anges i fallthroughContext om ingen regel matchar. Förval: false. fallthroughContext anger nästa sammanhang om ingen regel matchar. dynamic om true kommer sammanhanget ihåg strängar/platsmarkörer som sparats av dynamiska regler. Det behövs till exempel för HERE-dokument. Förval: false. Elementet itemData är i gruppen itemDatas. Det definierar teckenstilen och färgerna. Det är alltså möjligt att definiera egna stilar och färger, men vi rekommenderar dock att du håller dig till standardstilarna om möjligt, så att användaren alltid ser samma färger använda i olika språk. Ibland finns det dock inget annat sätt, och det är nödvändigt att ändra färg- och teckenegenskaper. Egenskapens namn och defStyleNum krävs, övriga är valfria. Tillgängliga egenskaper är: name anger namnet på itemData. Sammanhang och regler använder namnet i egenskapen attribute för att referera till itemData. defStyleNum definierar vilken standardstil som ska användas. Tillgängliga standardstilar förklaras i detalj senare. color definierar en färg. Giltiga format är '#rrggbb' eller '#rgb'. selColor definierar markeringens färg. italic om true, är texten kursiv. bold om true, är texten i fetstil. underline om true, är texten understruken. strikeout om true, är texten överstruken. Elementet keywords i gruppen general definierar nyckelordens egenskaper. Tillgängliga egenskaper är: casesensitive kan vara true eller false. Om det är true, matchas alla nyckelord skiftlägeskänsligt. weakDeliminator är en lista med tecken som inte fungerar som ordavgränsare. Punkt '.' är till exempel en ordavgränsare. Med antagandet att ett nyckelord i en list innehåller en punkt, matchar det bara om du anger att punkten är en svag avgränsare. additionalDeliminator definierar ytterligare avgränsare. wordWrapDeliminator definierar tecken som en radbrytning kan ske efter. Standardavgränsare och radbrytningsavgränsare är tecknen .():!+,-<=>%&*/;?[]^{|}~\, mellanslag (' ') och tabulator ('\t'). Elementet comment i gruppen comments definierar kommentaregenskaper som används för Verktyg Kommentera och Verktyg Avkommentera. Tillgängliga egenskaper är: name är antingen singleLine eller multiLine. Om du väljer multiLine krävs egenskaperna end och region. start definierar strängen som används för att inleda en kommentar. I C++ skulle det vara "/*". end definierar strängen som används för att avslutar en kommentar. I C++ skulle det vara "*/". region ska vara namnet på den vikbara flerraderskommentaren. Med antagandet att du har beginRegion="Comment" ... endRegion="Comment" i dina regler, ska du använda region="Comment". På så sätt fungerar avkommentering även om du inte markerar all text i en flerraderskommentar. Markören måste bara vara inne i flerraderskommentaren. Elementet folding i gruppen general definierar kodvikningsegenskaper. Tillgängliga egenskaper är: indentationsensitive om true läggs kodvikningsmarkörerna till baserat på indentering, som i skriptspråket Python. Oftast behöver du inte ange det, eftersom det har det förvalda värdet false. Elementet indentation i gruppen general definierar vilken identerare som ska användas, även om vi starkt rekommenderar att utelämna elementet, eftersom intenteraren oftast anges genom att definiera en filtyp eller genom att lägga till lägesrader i textfilen. Om du dock anger en indenterare, tvingar du användaren att använda en viss indentering, vilket kanske inte alls uppskattas. Tillgängliga egenskaper är: mode är namnet på indenteraren. Indenterare som för närvarande är tillgängliga är:normal, cstyle, csands, xml, python och varindent. Tillgängliga standardstilar Standardstilar har redan förklarats. En kort sammanfattning: Standardstilar är fördefinierade stilar för teckensnitt och färger. Här är alltså bara listan med tillgängliga standardstilar: dsNormal, används för normal text. dsKeyword, används för nyckelord. dsDataType, används för datatyper. dsDecVal, används för decimala värden. dsBaseN, används för värden med en bas skild från 10. dsFloat, används för flyttal. dsChar, används för ett tecken. dsString, används för strängar. dsComment, används för kommentarer. dsOthers, används för 'andra' saker. dsAlert, används för varningsmeddelanden. dsFunction, används för funktionsanrop. dsRegionMarker, används för områdesmarkeringar. dsError, används för färgläggning av fel och felaktig syntax. Regler för syntaxdetektering Den här sektionen beskriver reglerna för syntaxdetektering. Varje regel kan matcha noll eller flera tecken i början av strängen som de ska testa. Om regeln matchar, så tilldelas de matchande tecknen stilen eller egenskapen som definieras av regeln. En regel kan också begära att det nuvarande sammanhanget byts. En regel ser ut så här: <Regelnamn attribute="(identifierare)" context="(identifierare)" [regelspecifika egenskaper] /> Ordet attribute identifierar stilen som ska användas för tecken som matchar med namn eller index, och context identifierar sammanhanget som ska användas i fortsättningen. Sammanhanget kan identifieras av: En identifierare, som är namnet på det andra sammanhanget. En ordning som talar om att färgläggningen ska stanna kvar i det nuvarande sammanhanget (#stay), eller gå tillbaka till det föregående sammanhanget som använts i strängen (#pop). För att gå tillbaka flera steg, kan nyckelordet #pop upprepas: #pop#pop#pop Vissa regler kan ha delregler, bara utvärderas om huvudregeln matchar. Hela den matchande strängen kommer att få egenskapen som definieras av huvudregeln. En regel med en delregel ser ut så här: <Regelnamn (egenskaper)> <Delregelnamn (egenskaper) /> ... </Regelnamn> Regelspecifika egenskaper varierar och beskrivs i följande avsnitt. Gemensamma egenskaper Alla regler har följande egenskaper gemensamma och är tillgängliga på alla ställen (gemensamma egenskaper) visas. Egenskaperna attribute och context är nödvändiga, alla övriga är valfria. attribute: En egenskap avbildas på en definierad itemData. context: Anger sammanhanget som färgläggningssystemet byter till om regeln matchar. beginRegion: Inled ett kodvikningsblock. Förval: unset. endRegion: Avsluta ett kodvikningsblock. Förval: unset. lookAhead: Om true behandlar inte färgläggningssystemet matchningens längd. Förval: false. firstNonSpace: Matcha bara om strängen är den första förutom blanktecken på raden. Förval: false. column: Matcha bara om kolumnen matchar. Förval: unset. Dynamiska regler Vissa regler tillåter den valfria egenskapen dynamic med Boolesk typ, som har förvalt värde false. Om dynamic är true, kan en regel använda platsmarkörer som representerar texten som matchas av en regel med ett reguljärt uttryck som byter till nuvarande sammanhang med sin egenskap string eller char. I en string ersätts platsmarkören %N (där N är ett tal) med motsvarande N i det anropande reguljära uttrycket. I en char måste platsmarkören vara ett tal N och det ersätts med första tecknet i motsvarande N i det anropande reguljära uttrycket. Närhelst en regel tillåter den här egenskapen, innehåller den (dynamic). dynamic: kan vara (true | false). Reglerna i detalj DetectChar Detektera ett enda specifikt tecken. Används ofta för att till exempel hitta slutet på strängar inom citationstecken. <DetectChar char="(tecken)" (gemensamma egenskaper) (dynamisk) /> Egenskapen char definierar tecknet som ska matchas. Detect2Chars Detektera två angivna tecken i en definierad ordning. <Detect2Chars char="(tecken)" char1="(tecken)" (gemensamma egenskaper) (dynamisk) /> Egenskapen char definierar det första tecknet som ska matcha, char1 det andra. AnyChar Detektera ett tecken i en angiven teckenmängd. <AnyChar String="(sträng)" (gemensamma egenskaper) /> Egenskapen String definierar teckenmängden. StringDetect Detektera en sträng exakt. <StringDetect String="(sträng)" [insensitive="TRUE|FALSE;"] (gemensamma egenskaper) (dynamisk) /> Egenskapen String definierar strängen som ska matcha. Egenskapen insensitive (okänslig) är normalt FALSE (FALSK) och skickas med till strängjämförelsefunktionen. Om värdet är TRUE (SANT) så används en jämförelse som inte bryr sig om skiftläge. RegExpr Matchar med ett reguljärt uttryck. <RegExpr String="(sträng)" [insensitive="TRUE|FALSE;"] [minimal="TRUE| FALSE"] (gemensamma egenskaper) (dynamisk) /> Egenskapen String definierar det reguljära uttrycket. Egenskapen insensitive (okänslig) är normalt FALSE (FALSK) och skickas med det reguljära uttrycket. Egenskapen minimal är normalt FALSE (FALSK) och skickas med det reguljära uttrycket. Eftersom reglerna alltid matchas mot början av den nuvarande strängen, så anger ett reguljärt uttryck som börjar med en hatt (^) att regeln bara ska matchas mot radens början. Se Reguljära uttryck för mer information om dem. keyword Detektera ett nyckelord från en angiven lista. <keyword String="(listnamn)" (gemensamma egenskaper) /> Egenskapen String identifierar en lista på nyckelord med namn. En lista med det namnet måste finnas. Int Detektera ett heltal. <Int (gemensamma egenskaper) (dynamisk) /> Den här regeln har inga specifika egenskaper. Delregler används typiskt för att detektera kombinationer av L och U efter talet, som anger heltalstypen i programkod. I själva verket tillåts alla regler som delregler, även om DTD:n bara tillåter delregeln StringDetect. Följande exempel matchar heltal som följs av tecknet 'L'. <Int attribute="Decimal" context="#stay" > <StringDetect attribute="Decimal" context="#stay" String="L" insensitive="true"/> </Int> Float Detektera ett flyttal. <Float (gemensamma egenskaper) /> Den här regeln har inga specifika egenskaper. AnyChar tillåts som en delregel, och används typiskt för att detektera kombinationer, se regeln Int för en referens. HlCOct Detektera en oktal talrepresentation. <HlCOct (gemensamma egenskaper) /> Den här regeln har inga specifika egenskaper. HlCHex Detektera en hexadecimal talrepresentation. <HlCHex (gemensamma egenskaper) /> Den här regeln har inga specifika egenskaper. HlCStringChar Detektera ett undantaget tecken. <HlCStringChar (gemensamma egenskaper) /> Den här regeln har inga specifika egenskaper. Det matchar bokstavsrepresentationer av osynliga tecken som ofta används i programkod, till exempel \n (nyrad) eller \t (tabulator). Följande tecken matchar om de följer ett bakstreck (\): abefnrtv"'?. Dessutom matchar undantagna hexadecimala tal, som till exempel \xff och undantagna oktala tal, till exempel \033. HlCChar Detektera ett C-tecken. <HlCChar (gemensamma egenskaper) /> Den här regeln har inga specifika egenskaper. Det matchar C-tecken omgivna av apostrofer (till exempel 'c'). Det kan finnas ett enkelt tecken eller en teckenföljd inom apostroferna. Se HlCStringChar för matchade teckenföljder. RangeDetect Detektera en sträng med definierade start- och sluttecken. <RangeDetect char="(tecken)" char1="(tecken)" (gemensamma egenskaper) /> char definierar tecknet som inleder intervallet, och char1 tecknet som avslutar intervallet. Användbar för att till exempel detektera små strängar inom citationstecken och liknande, men observera att eftersom färgläggningen arbetar med en rad i taget, så hittar det här inte strängar som fortsätter på nästa rad. LineContinue Matchar vid radens slut. <LineContinue (gemensamma egenskaper) /> Den här regeln har inga specifika egenskaper. Den här regeln är användbar för att byta sammanhang vid radslut, om det sista tecknet är ett bakstreck ('\'). Det behövs till exempel i C/C++ för att fortsätta makron eller strängar. IncludeRules Inkludera regler från ett annat sammanhang eller språk/fil. <IncludeRules context="sammanhangslänk" [includeAttrib="true|false"] /> Egenskapen context definierar vilket sammanhang som ska inkluderas. Om den är en enkelt sträng innehåller den alla definierade regler i det nuvarande sammanhanget, till exempel: <IncludeRules context="annat-sammanhang" /> Om strängen börjar med ## letar syntaxfärgläggningssystemet efter en annan språkdefinition med det givna namnet, till exempel: <IncludeRules context="##C++" /> Om egenskapen includeAttrib är true, ändras målegenskapen till källans egenskap. Det krävs till exempel för att kommentarer ska fungera om text som matchas av det inkluderade sammanhanget har en annan färgläggning än värdsammanhanget. DetectSpaces Detektera blanktecken. <DetectSpaces (gemensamma egenskaper) /> Den här regeln har inga specifika egenskaper. Använd den här regeln om du vet att det kan finnas flera blanktecken framför, till exempel i början av indenterade rader. Regeln hoppar över alla blanktecken på en gång, istället för att prova flera regler och hoppa över en åt gången eftersom den inte matchar. DetectIdentifier Detektera strängar för identifierare (som ett reguljärt uttryck: [a-zA-Z_][a-zA-Z0-9_]*). <DetectIdentifier (gemensamma egenskaper) /> Den här regeln har inga specifika egenskaper. Använd den här regeln för att hoppa över en sträng med ordtecken på en gång, istället för att testa den med flera regler och hoppa ett steg i taget beroende på att ingenting matchar. Tips och trick När du väl har förstått hur sammanhangsbyte fungerar blir det enkelt att skriva färgläggningsdefinitioner. Du bör ändå kontrollera noggrant vilken regel du väljer i vilken situation. Reguljära uttryck är mycket kraftfulla, men de är långsamma jämfört med andra regler. Du bör därför ta hänsyn till följande tips. Om du bara matchar två tecken, använd Detect2Chars istället för StringDetect. Samma sak gäller för DetectChar. Reguljära uttryck är enkla att använda, men oftast finns det ett annat mycket snabbare sätt att uppnå samma resultat. Antag att du bara vill matcha tecknet '#' om det är det första tecknet på en rad. En lösning baserad på reguljära uttryck skulle se ut så här: <RegExpr attribute="Macro" context="macro" String="^\s*#" /> Du kan uppnå samma sak mycket snabbare med: <DetectChar attribute="Macro" context="macro" char="#" firstNonSpace="true" /> Om du vill matcha det reguljära uttrycket '^#' kan du fortfarande använda DetectChar med egenskapen column="0". Egenskapen column räknar baserat på tecken, så en tabulator är fortfarande bara ett tecken. Du kan byta sammanhang utan att behandla tecken. Antag att du vill byta sammanhang när du stöter på strängen */, men måste behandla denna sträng i nästa sammanhang. Regeln nedan matchar, och egenskapen lookAhead gör att färgläggningen behåller den matchade strängen för nästa sammanhang. <Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" lookAhead="true" /> Använd DetectSpaces om du vet att många blanktecken förekommer. Använd DetectIdentifier instället för ett reguljärt uttryck '[a-zA-Z_]\w*'. Använd standardstilar överallt du kan. På så sätt finner användaren en bekant miljö. Titta i andra XML-filer för att se hur andra implementerade knepiga regler. Du kan validera alla XML-filer genom att använda kommandot xmllint --dtdvalid language.dtd min-syntax.xml. Om du mycket ofta upprepar komplexa reguljära uttryck kan du använda ENTITETER. Till exempel: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE language SYSTEM "language.dtd" [ <!ENTITY minref "[A-Za-z_:][\w.:_-]*"> ]> Nu kan du använda &myref; istället för det reguljära uttrycket.