<appendix id="highlight">
<title
>Arbeiten mit Syntax-Hervorhebungen</title>

<sect1 id="highlight-overview">

<title
>Überblick</title>

<para
>Syntax-Hervorhebungen bewirken, dass der Editor den Text automatisch in verschiedenen Farben und Schriftstilen anzeigt, abhängig von der Funktion der Zeichenkette in Beziehung zum Zweck des Dokumentes. Zum Beispiel können in Quelltext Kontrollbefehle fett dargestellt werden, während Daten und Kommentare andere Farben als der Rest des Textes bekommen. Dies verbessert die Lesbarkeit des Textes erheblich und verhilft damit dem Autor zu mehr Effizienz und Produktivität.</para>

<mediaobject
> <imageobject
><imagedata format="PNG" fileref="highlighted.png"/></imageobject
> <textobject
><phrase
>Eine Perl-Funktion, mit Hervorhebungen angezeigt.</phrase
></textobject
> <caption
><para
>Eine Perl-Funktion, mit Hervorhebungen angezeigt.</para
> </caption
> </mediaobject>

<mediaobject
> <imageobject
><imagedata format="PNG" fileref="unhighlighted.png"/></imageobject
> <textobject
><phrase
>Die selbe Perl-Funktion, ohne Hervorhebungen.</phrase
></textobject
> <caption
><para
>Die selbe Perl-Funktion, ohne Hervorhebungen.</para
></caption
> </mediaobject>

<para
>Welche der beiden ist einfacher zu lesen?</para>

<para
>&kate; enthält ein flexibles, konfigurierbares und leistungsfähiges System für Syntax-Hervorhebungen, und die Standarddistribution enthält bereits Definitionen für eine Anzahl von Programmiersprachen, Markup- und Skriptsprachen sowie andere Textformaten. Außerdem können Sie eigene Definitionen in einfachen &XML;-Dateien erstellen.</para>

<para
>&kate; erkennt auf Basis des &MIME;-Typs, der Dateiendung oder des Inhalts des Dokumentes automatisch die richtigen Regeln für die Syntax-Hervorhebungen bereits beim Öffnen des Dokuments. Wenn die automatische Auswahl nicht die richtigen Regeln ausgewählt hat, können Sie dies manuell korrigieren (<menuchoice
><guimenu
>Dokument</guimenu
> <guisubmenu
>Hervorhebungsmodus</guisubmenu
></menuchoice
>).</para>

<para
>Die Schriftstile und Farben, die von jeder Syntax-Hervorhebungsdefinition benutzt werden sollen sowie die &MIME;-Typen, für die diese benutzt werden sollen, können Sie im Dialog <link linkend="config-dialog-editor-hl"
> Hervorhebungen einrichten</link
> des <link linkend="config-dialog"
>Einrichtungsdialogs</link
> bearbeiten.</para>

<note
> <para
>Syntax-Hervorhebungen sind gedacht, um die Lesbarkeit von Text zu verbessern, aber nicht geeignet, um die Richtigkeit des Quelltextes zu überprüfen. Die Erstellung der Regeln für die Hervorhebungen ist kompliziert, abhängig davon, welches Format Sie benutzen. In manchen Fällen sind die Autoren der Regeln stolz, wenn 98% des Textes korrekt hervorgehoben werden, meistens jedoch sehen Sie die nicht korrekten 2% nur bei seltenen Konstruktionen.</para
> </note>

<tip
> <para
>Sie können zusätzliche oder aktualisierte Syntax-Hervorhebungsdefinitionen von der &kate;-Webseite durch Klicken auf <guibutton
>Herunterladen</guibutton
> im Dialog <link linkend="config-dialog-editor-hl"
> Hervorhebungen einrichten</link
> des <link linkend="config-dialog"
>Einrichtungsdialogs</link
> einrichten bzw. aktualisieren.</para
> </tip>

</sect1>

<sect1 id="katehighlight-system">

<title
>Das &kate; Syntax-Hervorhebungssystem</title>

<para
>Dieser Abschnitt behandelt die Mechanismen des &kate; Syntax-Hervorhebungssystems genauer, wenn Sie selbst Definitionen erstellen oder verändern möchten, sollten Sie diesen genau lesen.</para>

<sect2 id="katehighlight-howitworks">

<title
>Wie es funktioniert</title>

<para
>Immer, wenn Sie ein Dokument öffnen, ist eines der ersten Dinge, die &kate; macht, festzustellen, welche Syntaxdefinition für dieses Dokument benutzt werden soll. Während Sie den Text lesen und neuen Text eingeben, analysiert das Syntax-Hervorhebungssystem den Text anhand der Regeln in der Syntaxdefinition und markiert ihn dementsprechend. </para>

<para
>Wenn Sie Text eingeben, wird der neue Text sofort analysiert und markiert.</para>

<para
>Die Syntaxdefinitionen, die in &kate; benutzt werden, sind &XML;-Dateien, die Folgendes enthalten <itemizedlist
> <listitem
><para
>Regeln für das Erkennen von Text, organisiert in Kontextblöcken</para
></listitem
> <listitem
><para
>Schlüsselwortlisten</para
></listitem
> <listitem
><para
>Stildefinitionen</para
></listitem
> </itemizedlist
> </para>

<para
>Beim Analysieren von Text werden die Erkennungsregeln in der Reihenfolge, in der sie definiert wurden, überprüft und wenn der Anfang des aktuellen Textes mit einer Definition übereinstimmt, wird der zugehörige Kontext benutzt. Der nächste Startpunkt wird nach dem Ende des erkannten Bereichs gesetzt und von dort aus wird eine neue Schleife für die Regeln beginnt, beginnend mit dem Kontext der gerade gefundenen Regel.</para>

</sect2>

<sect2 id="highlight-system-rules">
<title
>Regeln</title>

<para
>Die Erkennungsregeln sind das Herzstück des Syntax-Hervorhebungssystems. Eine Regel besteht aus einer Zeichenkette, einem Zeichen oder einem <link linkend="regular-expressions"
>regulären Ausdruck</link
>. Mit diesen wird der zu analysierende Text verglichen. Sie enthalten Informationen, welche Darstellung für das erkannte Stück Text verwendet werden soll und ob entweder zu einem explizit angegebenem Kontext oder zum vorher vom Text benutzten Kontext gewechselt werden soll.</para>

<para
>Die Regeln sind in Kontextgruppen organisiert. Eine Kontextgruppe wird für die grundlegenden Textkonzepte innerhalb des Formates benutzt, z.B. für Textteile in Anführungszeichen oder Kommentarblöcke in Programmquelltext. Dadurch wird sichergestellt, dass sich das Syntax-Hervorhebungssystem nicht durch alle Regeln hindurcharbeiten muss, wenn nicht nötig, und dass einige Zeichenketten im Text abhängig vom aktuellen Kontext unterschiedlich behandelt werden können. </para>

</sect2>

<sect2 id="highlight-context-styles-keywords">
<title
>Kontextstile und Schlüsselwörter</title>

<para
>In einigen Programmiersprachen werden Integerzahlen durch den Compiler (das Programm, das den Quelltext in ein ausführbares Programm übersetzt) anders behandelt als Gleitkommazahlen und es gibt Zeichen, die eine spezielle Bedeutung innerhalb einer in Anführungszeichen eingeschlossenen Zeichenkette haben. In solchen Fällen ist es sinnvoll, diese unterschiedlich darzustellen, so dass sie beim Lesen einfach von umgebenden Text zu unterscheiden sind. Auch wenn diese keine speziellen Kontexte repräsentieren, können sie durch das Syntax-Hervorhebungssystem erkannt und anders dargestellt werden.</para>

<para
>Eine Syntaxdefinition kann so viele verschiedene Stile, wie im benutzten Format notwendig enthalten.</para>

<para
>In vielen Formaten gibt es Listen mit Wörtern, die einem speziellen Konzept zugehörig sind. In Programmiersprachen sind z.B. die Kontrollanweisungen ein Konzept, die Datentypen ein anderes und die eingebauten Funktionen ein drittes. Das Syntax-Hervorhebungssystem von &kate; kann benutzt werden, um solche Wörter anhand der Listen zu finden und zur Hervorhebung der Konzepte im Text zu markieren.</para>

</sect2>

<sect2 id="kate-highlight-system-default-styles">
<title
>Standardstile</title>

<para
>Wenn Sie eine C++ Quelltextdatei, eine &Java;-Quelltextdatei und eine <acronym
>HTML</acronym
>-Datei in &kate; öffnen, sehen Sie dass auch in unterschiedlichen Formaten und damit unterschiedlichen Worten, die spezielle Behandlung bekommen, die benutzten Farben dieselben sind. Der Grund dafür ist, dass &kate; vordefinierte Standardstile benutzt, die von den individuellen Syntaxdefinitionen verwendet werden.</para>

<para
>Dadurch wird die Erkennung von ähnlichen Konzepten in verschiedenen Textformaten einfach. Kommentare z.B. gibt es in fast allen Programmiersprachen, Skripten und Markup-Sprachen; diese werden in allen Sprachen gleich dargestellt, so dass Sie sich auf die Arbeit konzentrieren können und nicht über den Zweck einzelner Einträge nachdenken müssen.</para>

<tip
> <para
>Alle Stile in einer Syntaxdefinition nutzen einen der Standardstile. Einige wenige Syntaxdefinitionen nutzen mehr als Stile, Standardstile vorhanden sind, wenn Sie ein Format sehr oft benutzen, kann es die Arbeit wert sein, den Einrichtungsdialog zu starten und nachzusehen, ob mehrere Konzepte die selben Stile benutzen. In der Programmiersprache Perl z.B. gibt es zwei Typen von Zeichenketten, so dass Sie die Hervorhebung durch eine etwas andere Darstellung des zweiten Typs verbessern können.</para
> </tip>

</sect2>

</sect1>

<sect1 id="katehighlight-xml-format">
<title
>Die Hervorhebungsdefinition für das &XML; Format</title>

<sect2>
<title
>Überblick</title>

<para
>Dieser Abschnitt ist ein Überblick über die Hervorhebungsdefinition für das &XML; Format.. Es beschreibt die Hauptbestandteile, deren Bedeutung und Nutzung; und im Detail die Erkennungsregeln.</para>

<para
>Die formale Definition, auch als <acronym
>DTD</acronym
> bekannt, wird in der Datei <filename
>language.dtd</filename
> gespeichert, die in Ihrem System im Verzeichnis <filename
>$<envar
>KDEDIR</envar
>/share/apps/kate/syntax</filename
> stehen sollte.</para>

<variablelist
> <title
>Hauptbestandteile der &kate;-Hervorhebungsdefinitionen</title
> <varlistentry
> <term
>Der Abschnitt General</term
> <listitem
> <para
>Der Abschnitt General enthält Informationen über Kommentare in der beschriebenen Programmiersprache und legt fest, ob bei Schlüsselwörtern Groß- und Kleinschreibung beachtet wird oder nicht. </para
> </listitem
> </varlistentry
> <varlistentry
> <term
>Hervorhebung</term
> <listitem
> <para
>Der Abschnitt Hervorhebung enthält alle Daten, die zum Analysieren und Darstellen von Text gebraucht werden. Im Einzelnen sind das:</para
> <variablelist
> <varlistentry
> <term
>ItemDatas</term
> <listitem
><para
>Enthält ItemData-Elemente, jedes definiert einen Stil.</para
></listitem
> </varlistentry
> <varlistentry
> <term
>Schlüsselwortlisten</term
> <listitem
> <para
>Jede Liste hat einen Namen und kann eine beliebige Anzahl von Elementen enthalten.</para
> </listitem
> </varlistentry
> <varlistentry
> <term
>Contexts</term
> <listitem
> <para
>Enthält Kontexts, die die Syntax-Erkennungsregeln enthalten.</para
> </listitem
> </varlistentry
> </variablelist
> </listitem
> </varlistentry
> </variablelist>

</sect2>

</sect1>

<sect1 id="kate-highlight-rules-detailled">
<title
>Hervorhebungs-Erkennungsregeln</title>

<para
>Dieser Abschnitt beschreibt die Hervorhebungs-Erkennungsregeln</para>

<para
>Jede Regel kann auf Null oder mehrere Zeichen am Anfang der untersuchten Zeichenkette zutreffen. Wenn eine Übereinstimmung gefunden wird, wird den erkannten Zeichen der Stil oder die <emphasis
>Eigenschaft</emphasis
>, die durch die Regel festgelegt wurde, zugeordnet und die Regel kann außerdem ein Umschalten des aktuellen Kontexts festlegen.</para>

<para
>Die Eigenschaften <emphasis
>attribute</emphasis
> und <emphasis
>context</emphasis
> sind für alle Regeln gemeinsam.</para>

<para
>Eine Regel sieht wie folgt aus:</para>

<programlisting
>&lt;RuleName attribute=&quot;(identifier)&quot; context=&quot;(identifier|order)&quot; [rule specific attributes] /&gt;</programlisting>

<para
>Die <emphasis
>attribute</emphasis
> (Eigenschaft) legt den Stil fest, der für die erkannten Zeichen benutzt werden soll und der <emphasis
>context</emphasis
> (Kontext) legt den Kontext fest, der ab hier benutzt werden soll.</para>

<para
>Die <emphasis
>attribute</emphasis
> (Eigenschaft) kann entweder durch einen Namen oder durch einen nullbasierten Index in der Gruppe ItemDatas identifiziert werden.</para>

<para
>Der <emphasis
>context</emphasis
> (Kontext) kann durch Folgendes identifiziert werden.</para>

<itemizedlist
> <listitem
> <para
>Einen <emphasis
>Identifizierer</emphasis
>, derzeit nur dessen nullbasierten Index in der Gruppe contexts(Kontexte).</para
> </listitem
> <listitem
> <para
>Eine Anweisung, die vorgibt, im aktuellen Kontext zu bleiben (<userinput
>#stay</userinput
>), oder zu einem vorher in der Zeichenkette benutzten Kontext zurückzuspringen (<userinput
>#pop</userinput
>).</para
> <para
>Zum Zurückgehen über mehrere Schritte kann das Schlüsselwort #pop wiederholt werden: <userinput
>#pop#pop#pop</userinput
></para
> </listitem
> </itemizedlist>

<para
>Regeln können <emphasis
>child rules</emphasis
>(Unterregeln) haben, deren Einhaltung nur dann untersucht wird, wenn die Einhaltung der Hauptregel erkannt wurde. Der gesamten erkannten Zeichenkette wird die durch die Hauptregel festgelegte <emphasis
>attribute</emphasis
> (Eigenschaft) zugeordnet. Eine Regel mit Unterregel sieht z.B. so aus:</para>

<programlisting>
&lt;RuleName (attributes)&gt;
  &lt;ChildRuleName (attributes) /&gt;
  ...
&lt;/RuleName&gt;
</programlisting>


<para
>Regelspezifische Eigenschaften sind unterschiedlich und werden im Folgenden beschrieben.</para
> 

<variablelist
> <title
>Die Regeln im Einzelnen:</title
> <varlistentry
> <term
>DetectChar</term
> <listitem
> <para
>Entdeckt ein einzelnes bestimmtes Zeichen. Häufig zum Finden des Endes von Zeichenketten in Anführungszeichen benutzt.</para
> <programlisting
>&lt;DetectChar char=&quot;(character)&quot; (common attributes) /&gt;</programlisting
> <para
>Die Eigenschaft <userinput
>char</userinput
> definiert das zu erkennende Zeichen.</para
> </listitem
> </varlistentry
> <varlistentry
> <term
>Detect2Chars</term
> <listitem
> <para
>Entdeckt zwei bestimmte Zeichen in einer bestimmten Reihenfolge.</para
> <programlisting
>&lt;Detect2Chars char=&quot;(character)&quot; char1=&quot;(character)&quot; (common attributes) /&gt;</programlisting
> <para
>Die Eigenschaft <userinput
>char</userinput
> definiert das erste zu erkennende Zeichen, <userinput
>char1</userinput
> das zweite.</para
> </listitem
> </varlistentry
> <varlistentry
> <term
>AnyChar</term
> <listitem
> <para
>Entdeckt ein Zeichen aus einem bestimmten Satz von Zeichen.</para
> <programlisting
>&lt;AnyChar String=&quot;(string)&quot; (common attributes) /&gt;</programlisting
> <para
>Die Eigenschaft <userinput
>String</userinput
> definiert den Satz der Zeichen.</para
> </listitem
> </varlistentry
> <varlistentry
> <term
>StringDetect</term
> <listitem
> <para
>Entdeckt eine bestimmte Zeichenkette.</para
> <programlisting
>&lt;StringDetect String=&quot;(string)&quot; [insensitive=&quot;TRUE|FALSE;&quot;] (common attributes) /&gt;</programlisting
> <para
>Die Eigenschaft <userinput
>String</userinput
> definiert die zu entdeckende Zeichenkette. Die Eigenschaft <userinput
>insensitive</userinput
> ist standardmäßig auf <userinput
>FALSE</userinput
> gesetzt und wird an die Zeichenketten-Vergleichsfunktion übergeben. Wenn der Wert auf <userinput
>TRUE</userinput
> gesetzt wird, wird Groß- und Kleinschreibung ignoriert.</para
> </listitem
> </varlistentry
> <varlistentry
> <term
>RegExpr</term
> <listitem
> <para
>Prüft die Übereinstimmung mit einem regulären Ausdruck.</para
> <programlisting
>&lt;RegExpr String=&quot;(string)&quot; [insensitive=&quot;TRUE|FALSE;&quot;] [minimal=&quot;TRUE|FALSE&quot;] (common attributes) /&gt;</programlisting
> <para
>Die Eigenschaft <userinput
>String</userinput
> definiert den regulären Ausdruck.</para
> <para
>Die Eigenschaft <userinput
>insensitive</userinput
> ist standardmäßig auf <userinput
>FALSE</userinput
> gesetzt und wird an die Funktion zur Auswertung des regulären Ausdrucks übergeben.</para
> <para
>Die Eigenschaft <userinput
>minimal</userinput
> ist standardmäßig auf <userinput
>FALSE</userinput
> gesetzt und wird an die Funktion zur Auswertung des regulären Ausdrucks übergeben.</para
> <para
>Weil die Regeleinhaltung am Anfang der aktuellen Zeichenkette immer als erfüllt erkannt wird, kann mit dem Hochzeichen (<literal
>^</literal
>) angegeben werden, dass die Regeleinhaltung nur am Anfang der Zeile untersucht werden soll.</para
> <para
>Sehen Sie unter <link linkend="regular-expressions"
>Reguläre Ausdrücke</link
> für weitere Informationen zu diesen nach.</para
> </listitem
> </varlistentry
> <varlistentry
> <term
>Keyword</term
> <listitem
> <para
>Erkennt ein Schlüsselwort aus einer angegebenen Liste.</para
> <programlisting
>&lt;keyword String=&quot;(list name)&quot; (common attributes) /&gt;</programlisting
> <para
>Die Eigenschaft <userinput
>String</userinput
> definiert die Schlüsselwortliste durch deren Name. Eine Liste mit diesem Namen muss vorhanden sein.</para
> </listitem
> </varlistentry
> <varlistentry
> <term
>Int</term
> <listitem
> <para
>Erkennt eine ganze Zahl(integer).</para
> <para
><programlisting
>&lt;Int (common attributes) /&gt;</programlisting
></para
> <para
>Diese Regel hat keine Eigenschaften. Häufig werden Unterregeln dazu benutzt, Kombinationen mit <userinput
>L</userinput
> oder <userinput
>U</userinput
> nach der Zahl zu entdecken, die den Typ der ganzen Zahl(integer) anzeigen.</para
> </listitem
> </varlistentry
> <varlistentry
> <term
>Float</term
> <listitem
> <para
>Entdeckt eine Gleitkommazahl.</para
> <para
><programlisting
>&lt;Float (common attributes)
/&gt; </programlisting
></para
> <para
>Diese Regel hat keine Eigenschaften.</para
> </listitem
> </varlistentry
> <varlistentry
> <term
>HlCOct</term
> <listitem
> <para
>Entdeckt eine oktale Zahl.</para
> <para
><programlisting
>&lt;HlCOct (common attributes) /&gt;</programlisting
></para
> <para
>Diese Regel hat keine Eigenschaften.</para
> </listitem
> </varlistentry
> <varlistentry
> <term
>HlCHex</term
> <listitem
> <para
>Entdeckt eine Hexazahl.</para
> <para
><programlisting
>&lt;Int (common attributes) /&gt;</programlisting
></para
> <para
>Diese Regel hat keine Eigenschaften.</para
> </listitem
> </varlistentry
> <varlistentry
> <term
>HlCStringChar</term
> <listitem
> <para
>Entdeckt ein Steuerzeichen.</para
> <para
><programlisting
>&lt;HlCStringChar (common attributes)
/&gt;</programlisting
></para
> <para
>Diese Regel hat keine Eigenschaften.</para
> <para
>Solche Zeichen sind durch druckbare Zeichen dargestellte nichtdruckbare Zeichen, die in Programmquelltexten häufig benutzt werden. z.B.: <userinput
>\n</userinput
> (Zeilenvorschub) oder <userinput
>\t</userinput
> (TAB)</para
> <para
>Die folgenden Zeichen werden erkannt, wenn sie einem <literal
>\</literal
> folgen: <userinput
>abefnrtv&quot;'?</userinput
>. Zusätzlich werden auch hexadezimale (<userinput
>\xff</userinput
>) oder oktale (<userinput
>\033</userinput
>) Zahlen nach einem <literal
>\</literal
> erkannt.</para
> </listitem
> </varlistentry
> <varlistentry
> <term
>RangeDetect</term
> <listitem
> <para
>Entdeckt eine Zeichenkette mit definierten Anfangs- und Endzeichen.</para
> <programlisting
>&lt;RangeDetect char=&quot;(character)&quot;  char1=&quot;(character)&quot; (common attributes) /&gt;</programlisting
> <para
><userinput
>char</userinput
> definiert das Zeichen am Anfang des Bereichs, <userinput
>char2</userinput
> das Zeichen am Ende des Bereichs.</para
> <para
>Diese Regel ist für das Entdecken von kleinen Zeichenketten in Anführungszeichen nützlich, kann aber wegen der verwendeten Funktion keine über mehrere Zeilen gehenden Zeichenketten entdecken.</para
> </listitem
> </varlistentry
> <varlistentry
> <term
>LineContinue</term
> <listitem
> <para
>Entdeckt das Zeilenende.</para
> <programlisting
>&lt;LineContinue (common attributes) /&gt;</programlisting
> <para
>Diese Regel hat keine Eigenschaften.</para
> <para
>Diese Regel ist für das Umschalten des Kontextes am Zeilenende nützlich.</para
> </listitem
> </varlistentry
> </variablelist>

</sect1>

</appendix>

