Problem

Syntax-Highlighting ist eine praktische Sache. Notepad++ bringt dem Entwickler tatsächlich eine ganze Menge gehighlighteter Sprachen mit. Und wenn doch eine fehlt?

Ein derart offenes System müsste doch leicht nachzurüsten sein, z.B. auch mit eigenen oder exotischen Syntax-Vorgaben.

Im konkreten Fall: ich möchte FTP-Uploads auf einen Debian-Server automatisieren. Dafür gibt es sogenannte FTP-Makros. Konkret: in einem bestimmten Verzeichnis muss eine Datei namens „.netrc “ liegen, die einfach die gewünschten FTP-Logins einerseits und die Pfade zu den hochzuladenden Dateien auflistet. Dazu müssen die Inhalte ein paar Schlüsselworte bereithalten. De facto eine ganz kleine Programmierung also.

So sieht ein Ziel-Layout aus:

machine ftp.someserver.com

login SomeLogin
password SomeCleverPassword

macdef MacroName

tick
!echo SomeTextforDebugPurpose:
binary
put „./Some_Folder/This_is_the_Source_File.pdf“ „This_is_how_it_lands_on_target.pdf“
quit

Es gibt also die typischen Syntax-Komponenten, die Notepad++ durchaus auch kennt und verwalten kann:

  • drei Sorten von Keywords, die unterschiedlich dargestellt werden sollen
    • die Makro-Auslöser machine und macdef
    • die Makro-Meta-Terme login und password
    • die makrofizierten FTP-Befehle
  • einfache Token für Benutzerterme, einfach gesagt: Zeichenketten
  • explizite Strings, d.h. Zeichenketten, die via Anführungszeichen eröffnet und terminiert werden

Mehr braucht man für diesen Zweck nicht, obwohl Notepad++ natürlich auch Ziffern, Sonderzeichen und weitere Syntax-Komponenten verarbeiten und highlighten kann.

Im Kern scheitert die einfache Syntax-Erweiterung am Thema Usability (kompliziert geht es ja). Die Open-Source-Community hat sich insgesamt bei diesem Editor viel Mühe gegeben. Allerdings fällt an einigen Stellen auf, dass es bei Open-Source-Projekten viel schwerer ist, Usability-Fragen zu koordinieren. Man ist in so einem Projekt froh, dass jemand überhaupt ein gutes Stück Funktionalität beigetragen hat. Da tritt Kritik an solchen Bedien-Details in den Hintergrund oder ein Programmier hat die Haltung, macht das doch jetzt selbst, wenn ihr es anders wollt. Nicht zuletzt ist Kritik im Internet für sich auch ein Problem: Schnell hagelt es gerade von anonymen Personen von 0 auf 100 derart unflätige Beschimpfungen, gerne auch gepaart mit Anspruchshaltungen, dass man sich das als (unbezahlter(!)) aber sogar hilfsbereiter Programmierer schlicht nicht antun will. Leider sogar nachvollziehbar. 
In Open-Source-Projekten gibt es meist keine dedizierten Usability-Tests. Ein Produkt bzw. meist ein Stand eines Produkts wird veröffentlicht und die Betreiber  erfahren praktisch nur, was User oder Fans zurückmelden. Es gibt ja keine Abteilung für Qualitätssicherung, die hier Tester, Tools, Testfälle etc. stellt. Zudem: es handelt sich beim Ergänzen von Syntaxen um keine Kernfunktion dieses Editors. Notepad++ ist ja mit umfangreichen funktionierenden Highlight-Schemen und passenden Dateiendungen ausgestattet.
Das Nachrüsten eigener Elemente ist auch im kommerziellen Umfeld gerne erst in späteren Versionen verfügbar und auch dort häufig ein vernachlässigter Testfall. Man denke nur an die ersten Customizing-Versionen der MS Office-Produkte. Bis das hervorragende Verschieben von Buttons und Menüpunkten der 95er-Versionen möglich war, sind auch bei Microsoft einige Jahre vergangen. Aktuell sind diese Errungenschaften bei der Umstellung auf die Tool-Ribbons wieder verloren gegangen – auch hier ging 2007 das Anpassen wieder nur umständlich. Ein anderer Grund, warum Nachrüstverfahren in kommerziellen Projekten gerne mal besonders undokumentiert und hakelig sind, fällt hier sicher weg: es gibt die Strategie Kernprodukte kostenlos abzugeben und sie als Träger für zu bezahlende Nachrüstoptionen zu benutzen, z.B. bei Eclipse oder dem Shop-System Magento ist das ein Ansatz. Damit die Monetarisierung nicht ins Wasser fällt, ist es häufig gar nicht so unerwünscht, wenn das Nachrüsten nicht gleich jedem gelingt. Da Notepad++ aber rundum nicht-kommerziell angelegt ist, dürfte  das keine Ursache für die Nachrüst-Probleme hier zu sein.

Der naheliegende Menüpunkt Einstellungen -> Stile liefert zwar eine Dialogbox mit Einstellungsmöglichkeiten. Diese beschränken sich aber auf die Nutzung vorhandener Schemen. So kann man einem vorhandenen Schema wie z.B. SQL tatsächlich leicht noch eine weiter Extension wie database anhängen. Weil die gesuchte Funktion hier nicht ist und sich auch kein anderer so recht anbietet, liegt aus meiner Sicht ein Usability-Problem vor. Davon zeugt auch eine recht hohe Trefferanzahl ähnlicher Suchen bei Google zum Thema.

 

Lösung

Die für mich einfachste Lösung geht über einen Blick unter die Haube. Notepad++ verwaltet Nutzer-Syntax-Schemen in einer Datei namens userDefineLang.xml. Diese kann an zwei Orten sein:

  • \Dokumente and Einstellungen{your profile name}\Anwendungsdaten\Notepad++\       oder
  • Notepad++ installation folder

Der folgende Code muss in dieser Datei stehen bzw. an zwischen den NotepadPlus-Tags eingefügt sein:

<NotepadPlus>
    <UserLang name="netrc" ext="netrc">
        <Settings>
            <Global caseIgnored="no" />
            <TreatAsSymbol comment="no" commentLine="no" />
            <Prefix words1="no" words2="no" words3="no" words4="no" />
        </Settings>
        <KeywordLists>
            <Keywords name="Delimiters">&quot;00&quot;00</Keywords>
            <Keywords name="Folder+"></Keywords>
            <Keywords name="Folder-"></Keywords>
            <Keywords name="Operators"></Keywords>
            <Keywords name="Comment"></Keywords>
            <Keywords name="Words1">machine macdef </Keywords>
            <Keywords name="Words2">login password</Keywords>
            <Keywords name="Words3">tick echo binary put quit !echo</Keywords>
            <Keywords name="Words4"></Keywords>
        </KeywordLists>
        <Styles>
            <WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" />
            <WordsStyle name="FOLDEROPEN" styleID="12" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" />
            <WordsStyle name="FOLDERCLOSE" styleID="13" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" />
            <WordsStyle name="KEYWORD1" styleID="5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" />
            <WordsStyle name="KEYWORD2" styleID="6" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" />
            <WordsStyle name="KEYWORD3" styleID="7" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="1" />
            <WordsStyle name="KEYWORD4" styleID="8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" />
            <WordsStyle name="COMMENT" styleID="1" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" />
            <WordsStyle name="COMMENT LINE" styleID="2" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" />
            <WordsStyle name="NUMBER" styleID="4" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" />
            <WordsStyle name="OPERATOR" styleID="10" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" />
            <WordsStyle name="DELIMINER1" styleID="14" fgColor="800000" bgColor="FFFFFF" fontName="" fontStyle="0" />
            <WordsStyle name="DELIMINER2" styleID="15" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" />
            <WordsStyle name="DELIMINER3" styleID="16" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" />
        </Styles>
    </UserLang>
</NotepadPlus>

Einige Tags sprechen eigentlich ganz gut für sich. Anpassungen für eigene Zwecke sollten damit kein Problem sein. Die Verkettung mit den Datei-Endungen geschieht in der zweiten Zeile dieses Codes. Extension werden immer ohne den Punkt eingetragen. Der Eintrag für Word-Dokument wäre also einfach „doc“ und nicht „.doc“.

Nicht ganz selbsterklärend: Fontstyle

  • 0 = normaler Schriftschnitt
  • 1 = fett
  • 2 = kursiv
  • 3 = fett + kursiv
  • 4 = unterstrichen