Scintilla Syntax Highlighting

Scintilla Syntax Highlighting

Scintilla.NET hat vom Haus aus einen sehr beachtliche Umfang an vorkonfigurierten Sprachen.
Diese könnt ihr mit nur einer Zeile verwenden, schon läuft alles.
sciEditor.ConfigurationManager.Language = "Lua"; // in meinen Fall möchte ich Lua verwenden

Wenn ihr nun allerdings Farben anpassen möchtet, sieht es schon etwas komplizierter aus. Generell bietet das Control über die Eigenschaft Styles die Möglichkeit an, alle Farben und Stile anzupassen. Nur welcher Index in dieser Liste steht für was?

Dazu müssen wir im Code nachschauen. Ladet euch am besten den gesamten Source-Code von https://scintillanet.codeplex.com herunter und öffnet das Projekt.
Geht dann im Projekt ScintillaNET in den Unterordner Configuration/Builtin. Dort findet ihr alle vorkonfigurierten und implementierten Sprachen.

Im Ordner LexerKeywordListNames könnt ihr für jede Sprache die entsprechenden Indizees der Schlüsselwörter finden.
Der Ordner LexerStyleNames enthält die Indizees der unterschiedlichen Stile.
Die XML-Dateien im Ordner Builtin, stellen die grundlegende Konfiguration dar. Dort wird z.B. festgelegt, ob eine Einrückung verwendet wird oder Code-Snippets können definiert werden.



Für Lua sieht die LexerStyleName-Datei z.B. wie folgt aus:
DOCUMENT_DEFAULT  = 0
COMMENT = 1
COMMENTLINE = 2
COMMENTDOC = 3
NUMBER = 4
WORD = 5
STRING = 6
CHARACTER = 7
LITERALSTRING = 8
PREPROCESSOR = 9
OPERATOR = 10
IDENTIFIER = 11
STRINGEOL = 12
WORD2 = 13
WORD3 = 14
WORD4 = 15
WORD5 = 16
WORD6 = 17
WORD7 = 18
WORD8 = 19

Nun kann ich meine Farben also wie folgt anpassen:
scintillaControl.Styles[4].ForeColor = Color.Yellow; // number
scintillaControl.Styles[6].ForeColor = Color.LightGray; // string

Übrigens könnt ihr über den DOCUMENT_DEFAULT (also Index 0) den Standard-Stil des Controlls anpassen.
Ich persönlich passe immer zuerst diesen an und setze danach, alle noch verbleibenden auf den Standard-Stil zurück:
scintillaControl.Styles[0].BackColor = Color.White;
scintillaControl.Styles[0].ForeColor = Color.Black;
scintillaControl.Styles[0].Font = new Font("Consolas", 12);

for (int i = 1; i <= 126; i++)
{
    scintillaControl.Styles[i].BackColor = sciEditor.Styles[0].BackColor;
    scintillaControl.Styles[i].ForeColor = sciEditor.Styles[0].ForeColor;
    scintillaControl.Styles[i].Font = sciEditor.Styles[0].Font;
}

Erst danach fange ich an, die einzelnen spezifischen Stile anzupassen. Damit kann ich mir sicher sein, dass sich wirklich alles wie gewünscht verhält.
Etwas Paranoia, ich weis. Dafür ist es aber nicht so fehleranfällig. :)

Ich hoffe dieses kleine Tutorial war hilfreich. Feedback ist wie immer erwünscht.
Um einen Kommentar zu hinterlassen, ist eine Anmeldung erforderlich.