<para>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.</para>
<para>Av de två exemplen, vilket är lättast att läsa?</para>
<para>&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.</para>
<para>&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 <menuchoice><guimenu>Dokument</guimenu> <guisubmenu>Färgläggningsläge</guisubmenu></menuchoice>.</para>
<para>Stilarna och färgerna som används av varje syntaxfärgläggningsläge kan anpassas på sidan <link linkend="config-dialog-editor-appearance">Utseende</link> i <link linkend="config-dialog">inställningsdialogrutan</link>, medan &MIME;-typerna det ska användas för hanteras på sidan <link linkend="config-dialog-editor-highlighting">Färgläggning</link>.</para>
<para>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.</para>
<para>Du kan ladda ner uppdaterade eller nya definitioner av syntaxfärgläggning från &kate;s webbplats genom att klicka på knappen <guibutton>Ladda ner</guibutton>på sidan <link linkend="config-dialog-editor-highlighting">Färgläggning </link> i <link linkend="config-dialog">inställningsdialogrutan</link>.</para>
<para>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.</para>
<para>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.</para>
<para>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.</para>
<para>Syntaxdefinitioner som används av &kate;s syntaxfärgläggningssystem är &XML;-filer, som innehåller <itemizedlist>
<listitem><para>Regler för att detektera funktionen hos text, organiserade i sammanhangsblock</para></listitem>
<listitem><para>Listor med nyckelord</para></listitem>
<listitem><para>Definitioner av stilobjekt</para></listitem>
<para>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.</para>
<para>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.</para>
<para>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. </para>
<para>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.</para>
<para>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.</para>
<para>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.</para>
<para>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.</para>
<para>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 <link linkend="kate-highlight-default-styles">tillgängliga standardstilar</link> förklaras senare.</para>
<para>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.</para>
<para>Den formella definitionen, också kallad en <acronym>DTD</acronym>, lagras i filen <filename>language.dtd</filename> som ska finnas installerad på ditt system i katalogen <filename>$<envar>TDEDIR</envar>/share/apps/kate/syntax</filename>. </para>
<term>Därefter kommer elementet <userinput>highlighting</userinput> som innehåller det valfria elementet <userinput>list</userinput> och det nödvändiga elementen <userinput>contexts</userinput> och <userinput>itemDatas</userinput>.</term>
<para><userinput>list</userinput> element innehåller en lista med nyckelord. I det här fallet är nyckelorden <emphasis>class</emphasis> och <emphasis>const</emphasis>. Du kan lägga till så många listor som du behöver.</para>
<para>Elementet <userinput>contexts</userinput> innehåller alla sammanhang. Det första sammanhanget är förvalt som start för färgläggningen. Det finns två regler i sammanhanget <emphasis>Normal Text</emphasis> som matchar listan av nyckelord med namnet <emphasis>något-namn</emphasis> och en regel som detekterar ett citationstecken och byter sammanhang till <emphasis>string</emphasis>. För att lära dig mer om regler, läs nästa kapitel.</para>
<para>Den tredje delen är elementet <userinput>itemDatas</userinput>. Det innehåller alla färger och teckenstilar som behövs av sammanhangen och reglerna. I det här exemplet används <userinput>itemData</userinput> <emphasis>Normal Text</emphasis>, <emphasis>String</emphasis> och <emphasis>Keyword</emphasis>. </para>
<term>Den sista delen av färgläggningsdefinitionen är den valfria sektionen <userinput>general</userinput>. Den kan innehålla information om nyckelord, kodvikning, kommentarer och indentering.</term>
<para>Sektionen <userinput>comment</userinput> definierar den sträng som enradskommentarer inleds med. Du kan också definiera flerradskommentarer med <emphasis>multiLine</emphasis> och den ytterligare egenskapen <emphasis>end</emphasis>. Det är användbart när användaren trycker på snabbtangenten som motsvarar <emphasis>kommentera/avkommentera</emphasis>.</para>
<para>Sektionen <userinput>keywords</userinput> definierar om listor med nyckelord är skiftlägeskänsliga eller inte. Andra egenskaper förklaras senare.</para>
<term>Elementet <userinput>context</userinput> hör till gruppen <userinput>contexts</userinput>. 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:</term>
<para><userinput>name</userinput> är sammanhangets namn. Regler använder namnet för att ange sammanhanget att byta till om regeln matchar.</para>
<para><userinput>lineEndContext</userinput> definierar sammanhanget som färgläggningssystemet byter till om det når ett radslut. Det kan antingen vara namnet på ett annat sammanhang, <userinput>#stay</userinput> för att inte byta sammanhang (dvs. göra ingenting) eller <userinput>#pop</userinput> som gör att sammanhanget lämnas. Det är till exempel möjligt att använda <userinput>#pop#pop#pop</userinput> för att återgå tre steg.</para>
<para><userinput>lineBeginContext</userinput> definierar sammanhanget om början på en rad påträffas. Förval: #stay.</para>
<para><userinput>fallthrough</userinput>definierar om färgläggningssystemet byter till sammanhanget som anges i fallthroughContext om ingen regel matchar. Förval: <emphasis>false</emphasis>.</para>
<para><userinput>fallthroughContext</userinput> anger nästa sammanhang om ingen regel matchar.</para>
<para><userinput>dynamic</userinput> om <emphasis>true</emphasis> kommer sammanhanget ihåg strängar/platsmarkörer som sparats av dynamiska regler. Det behövs till exempel för HERE-dokument. Förval: <emphasis>false</emphasis>.</para>
<term>Elementet <userinput>itemData</userinput> är i gruppen <userinput>itemDatas</userinput>. 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:</term>
<para><userinput>name</userinput> anger namnet på itemData. Sammanhang och regler använder namnet i egenskapen <emphasis>attribute</emphasis> för att referera till itemData.</para>
<para><userinput>defStyleNum</userinput> definierar vilken standardstil som ska användas. Tillgängliga standardstilar förklaras i detalj senare.</para>
<para><userinput>color</userinput> definierar en färg. Giltiga format är '#rrggbb' eller '#rgb'.</para>
<para><userinput>casesensitive</userinput> kan vara <emphasis>true</emphasis> eller <emphasis>false</emphasis>. Om det är <emphasis>true</emphasis>, matchas alla nyckelord skiftlägeskänsligt.</para>
<para><userinput>weakDeliminator</userinput> är en lista med tecken som inte fungerar som ordavgränsare. Punkt <userinput>'.'</userinput> är till exempel en ordavgränsare. Med antagandet att ett nyckelord i en <userinput>list</userinput> innehåller en punkt, matchar det bara om du anger att punkten är en svag avgränsare.</para>
<para><userinput>additionalDeliminator</userinput> definierar ytterligare avgränsare.</para>
<para><userinput>wordWrapDeliminator</userinput> definierar tecken som en radbrytning kan ske efter.</para>
<para>Standardavgränsare och radbrytningsavgränsare är tecknen <userinput>.():!+,-<=>%&*/;?[]^{|}~\</userinput>, mellanslag (<userinput>' '</userinput>) och tabulator (<userinput>'\t'</userinput>).</para>
<term>Elementet <userinput>comment</userinput> i gruppen <userinput>comments</userinput> definierar kommentaregenskaper som används för <menuchoice><guimenu>Verktyg</guimenu> <guimenuitem>Kommentera</guimenuitem></menuchoice> och <menuchoice><guimenu>Verktyg</guimenu> <guimenuitem>Avkommentera</guimenuitem></menuchoice>. Tillgängliga egenskaper är:</term>
<para><userinput>name</userinput> är antingen <emphasis>singleLine</emphasis> eller <emphasis>multiLine</emphasis>. Om du väljer <emphasis>multiLine</emphasis> krävs egenskaperna <emphasis>end</emphasis> och <emphasis>region</emphasis>.</para>
<para><userinput>start</userinput> definierar strängen som används för att inleda en kommentar. I C++ skulle det vara "/*".</para>
<para><userinput>end</userinput> definierar strängen som används för att avslutar en kommentar. I C++ skulle det vara "*/".</para>
<para><userinput>region</userinput> ska vara namnet på den vikbara flerraderskommentaren. Med antagandet att du har <emphasis>beginRegion="Comment"</emphasis> ... <emphasis>endRegion="Comment"</emphasis> i dina regler, ska du använda <emphasis>region="Comment"</emphasis>. 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.</para>
<term>Elementet <userinput>folding</userinput> i gruppen <userinput>general</userinput> definierar kodvikningsegenskaper. Tillgängliga egenskaper är:</term>
<para><userinput>indentationsensitive</userinput> om <emphasis>true</emphasis> 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 <emphasis>false</emphasis>.</para>
<term>Elementet <userinput>indentation</userinput> i gruppen <userinput>general</userinput> 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:</term>
<para><userinput>mode</userinput> är namnet på indenteraren. Indenterare som för närvarande är tillgängliga är:<emphasis>normal, cstyle, csands, xml, python</emphasis> och <emphasis>varindent</emphasis>.</para>
<para>Standardstilar har <link linkend="kate-highlight-system-default-styles">redan förklarats</link>. En kort sammanfattning: Standardstilar är fördefinierade stilar för teckensnitt och färger.</para>
<para>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 <emphasis>egenskapen</emphasis> som definieras av regeln. En regel kan också begära att det nuvarande sammanhanget byts.</para>
<para>Ordet <emphasis>attribute</emphasis> identifierar stilen som ska användas för tecken som matchar med namn eller index, och <emphasis>context</emphasis> identifierar sammanhanget som ska användas i fortsättningen.</para>
<para>En <emphasis>ordning</emphasis> som talar om att färgläggningen ska stanna kvar i det nuvarande sammanhanget (<userinput>#stay</userinput>), eller gå tillbaka till det föregående sammanhanget som använts i strängen (<userinput>#pop</userinput>).</para>
<para>För att gå tillbaka flera steg, kan nyckelordet #pop upprepas: <userinput>#pop#pop#pop</userinput></para>
<para>Vissa regler kan ha <emphasis>delregler</emphasis>, 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:</para>
<para>Alla regler har följande egenskaper gemensamma och är tillgängliga på alla ställen <userinput>(gemensamma egenskaper)</userinput> visas. Egenskaperna <emphasis>attribute</emphasis> och <emphasis>context</emphasis> är nödvändiga, alla övriga är valfria. </para>
<para><emphasis>lookAhead</emphasis>: Om <emphasis>true</emphasis> behandlar inte färgläggningssystemet matchningens längd. Förval: <emphasis>false</emphasis>.</para>
<para><emphasis>firstNonSpace</emphasis>: Matcha bara om strängen är den första förutom blanktecken på raden. Förval: <emphasis>false</emphasis>.</para>
<para>Vissa regler tillåter den valfria egenskapen <userinput>dynamic</userinput> med Boolesk typ, som har förvalt värde <emphasis>false</emphasis>. Om dynamic är <emphasis>true</emphasis>, kan en regel använda platsmarkörer som representerar texten som matchas av en regel med ett <emphasis>reguljärt uttryck</emphasis> som byter till nuvarande sammanhang med sin egenskap <userinput>string</userinput> eller <userinput>char</userinput>. I en <userinput>string</userinput> ersätts platsmarkören <replaceable>%N</replaceable> (där N är ett tal) med motsvarande <replaceable>N</replaceable> i det anropande reguljära uttrycket. I en <userinput>char</userinput> måste platsmarkören vara ett tal <replaceable>N</replaceable> och det ersätts med första tecknet i motsvarande <replaceable>N</replaceable> i det anropande reguljära uttrycket. Närhelst en regel tillåter den här egenskapen, innehåller den <emphasis>(dynamic)</emphasis>.</para>
<para>Egenskapen <userinput>String</userinput> definierar strängen som ska matcha. Egenskapen <userinput>insensitive</userinput> (okänslig) är normalt <userinput>FALSE</userinput> (FALSK) och skickas med till strängjämförelsefunktionen. Om värdet är <userinput>TRUE</userinput> (SANT) så används en jämförelse som inte bryr sig om skiftläge.</para>
<para>Egenskapen <userinput>String</userinput> definierar det reguljära uttrycket.</para>
<para>Egenskapen <userinput>insensitive</userinput> (okänslig) är normalt <userinput>FALSE</userinput> (FALSK) och skickas med det reguljära uttrycket.</para>
<para>Egenskapen <userinput>minimal</userinput> är normalt <userinput>FALSE</userinput> (FALSK) och skickas med det reguljära uttrycket.</para>
<para>Eftersom reglerna alltid matchas mot början av den nuvarande strängen, så anger ett reguljärt uttryck som börjar med en hatt (<literal>^</literal>) att regeln bara ska matchas mot radens början.</para>
<para>Se <link linkend="regular-expressions">Reguljära uttryck</link> för mer information om dem.</para>
<para>Den här regeln har inga specifika egenskaper. Delregler används typiskt för att detektera kombinationer av <userinput>L</userinput> och <userinput>U</userinput> efter talet, som anger heltalstypen i programkod. I själva verket tillåts alla regler som delregler, även om <userinput>DTD</userinput>:n bara tillåter delregeln <userinput>StringDetect</userinput>.</para>
<para>Följande exempel matchar heltal som följs av tecknet 'L'. <programlisting><Int attribute="Decimal" context="#stay" >
<para>Den här regeln har inga specifika egenskaper. <userinput>AnyChar</userinput> tillåts som en delregel, och används typiskt för att detektera kombinationer, se regeln <userinput>Int</userinput> för en referens.</para>
<para>Den här regeln har inga specifika egenskaper.</para>
<para>Det matchar bokstavsrepresentationer av osynliga tecken som ofta används i programkod, till exempel <userinput>\n</userinput> (nyrad) eller <userinput>\t</userinput> (tabulator).</para>
<para>Följande tecken matchar om de följer ett bakstreck (<literal>\</literal>): <userinput>abefnrtv"'?</userinput>. Dessutom matchar undantagna hexadecimala tal, som till exempel <userinput>\xff</userinput> och undantagna oktala tal, till exempel <userinput>\033</userinput>.</para>
<para>Den här regeln har inga specifika egenskaper.</para>
<para>Det matchar C-tecken omgivna av apostrofer (till exempel <userinput>'c'</userinput>). Det kan finnas ett enkelt tecken eller en teckenföljd inom apostroferna. Se HlCStringChar för matchade teckenföljder.</para>
<para><userinput>char</userinput> definierar tecknet som inleder intervallet, och <userinput>char1</userinput> tecknet som avslutar intervallet.</para>
<para>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.</para>
<para>Den här regeln har inga specifika egenskaper.</para>
<para>Den här regeln är användbar för att byta sammanhang vid radslut, om det sista tecknet är ett bakstreck (<userinput>'\'</userinput>). Det behövs till exempel i C/C++ för att fortsätta makron eller strängar.</para>
<para>Egenskapen <userinput>context</userinput> definierar vilket sammanhang som ska inkluderas.</para>
<para>Om den är en enkelt sträng innehåller den alla definierade regler i det nuvarande sammanhanget, till exempel: <programlisting><IncludeRules context="annat-sammanhang" /></programlisting></para>
<para>Om strängen börjar med <userinput>##</userinput> letar syntaxfärgläggningssystemet efter en annan språkdefinition med det givna namnet, till exempel: <programlisting><IncludeRules context="##C++" /></programlisting></para>
<para>Om egenskapen <userinput>includeAttrib</userinput> är <emphasis>true</emphasis>, ä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. </para>
<para>Den här regeln har inga specifika egenskaper.</para>
<para>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.</para>
<para>Den här regeln har inga specifika egenskaper.</para>
<para>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.</para>
<para>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. </para>
<para>Om du bara matchar två tecken, använd <userinput>Detect2Chars</userinput> istället för <userinput>StringDetect</userinput>. Samma sak gäller för <userinput>DetectChar</userinput>.</para>
<para>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 <userinput>'#'</userinput> om det är det första tecknet på en rad. En lösning baserad på reguljära uttryck skulle se ut så här: <programlisting><RegExpr attribute="Macro" context="macro" String="^\s*#" /></programlisting> Du kan uppnå samma sak mycket snabbare med: <programlisting><DetectChar attribute="Macro" context="macro" char="#" firstNonSpace="true" /></programlisting> Om du vill matcha det reguljära uttrycket <userinput>'^#'</userinput> kan du fortfarande använda <userinput>DetectChar</userinput> med egenskapen <userinput>column="0"</userinput>. Egenskapen <userinput>column</userinput> räknar baserat på tecken, så en tabulator är fortfarande bara ett tecken. </para>
<para>Du kan byta sammanhang utan att behandla tecken. Antag att du vill byta sammanhang när du stöter på strängen <userinput>*/</userinput>, men måste behandla denna sträng i nästa sammanhang. Regeln nedan matchar, och egenskapen <userinput>lookAhead</userinput> gör att färgläggningen behåller den matchade strängen för nästa sammanhang. <programlisting><Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" lookAhead="true" /></programlisting>