Mehrsprachiger ScriptEditor mit anpassbarem Scintilla Lexer komplett in AutoIt

  • Hallo zusammen!

    Ich habe für ein anderes Projekt einen kleinen Editor geschrieben, der Scintilla als Editorkomponente mit einem eigenen Lexer verwendet. Der komplette Code inkl. Lexer (Styling und Folding) ist in AutoIt geschrieben und so gestaltet, dass sich der Editor mit wenigen Zeilen Code komplett in eigene Projekte einbauen läßt. Dabei liefere ich in der ZIP Datei alles notwendige mit: den kompilierten Editor und alle Sourcen, sämtliche Forms, externen Libs etc.. Natürlich sind alle fremden Quellen genannt, näheres in der authors.txt im Unterverzeichnis Libs und teilweise im Rest des Codes.

    Der enthaltene Lexer ist allg. auf die Verwendung mit Scriptsprachen (also SGML-artiges geht nicht gut) ausgelegt und ist über einen eigenen Menüpunkt anpassbar und läßt sich um weitere eigene Skriptsprachendefinitionen erweitern. Ein paar Lexerdefinitionen, Testskripte und ein Beispiel, wie sich die eigentliche Editorkomponente mit wenig Aufwand (eigentlich nur 4 Zeilen) komplett in eigene Projekte integrieren läßt liefere ich mit. Näheres dazu in der _LexingUDF_example.au3.

    Beim Start präsentiert sich der Editor auf Deutsch OHNE Vorgabelexer, wer ihn bspw. auf Englisch mit AutoIt als Vorgabe haben möchte, ruft ihn einfach mit "scripteditor.exe -l=en -x=autoit" auf. Ansonsten über das 'Lexer' Menü einen der mitgelieferten Lexer auswählen und laden.

    (Alle weiteren Kommandozeilenparameter werden mit "-h" sichtbar.)

    Screenshot:
    [Blockierte Grafik: https://s3.eu-central-1.amazonaws.com/opsipackagebui…shot-editor.jpg]

    Download: ScriptEditor v1.9

    Der Ablauf zur Integration in eigene Projekte kurz skizziert:

    Spoiler anzeigen
    [autoit]

    ; 0.) wir brauchen die gesamte Ordnerstruktur der ZIP Datei, also am einfachsten alles Entpacken und für Eigenes die editor.au3 löschen und selber loslegen ;-)#include "_LexingUDF.au3"; ; Vorweg muss die Parent GUI mit GUICreate erzeugt werden, wir brauchen ein Window-Handle (hier $hGUI); 1.) Parent GUI für den Editor setzen$__default_editor_parent = $hGUI ; 2.) Lexerdefinition einladen - Name der Datei ohne .def aus dem Unterverzeichnis 'LexDef'_GUICtrlLex_ReadLEXFile($lexer) -> bspw: _GUICtrlLex_ReadLEXFile("autoit"); 3.) Editorkomponente innerhalb von $__default_editor_parent erzeugen_GUICtrlLex_CreateScriptEditor($x, $y, $breite, $hoehe) -> bspw: _GUICtrlLex_CreateScriptEditor(0, 0, 800, 600); 4.) alle wichtigen Variablen, Arrays, etc. initialisieren und die Styles, Layouts, Markerdefinitionen, etc., die zuvor eingeladen wurde, der Editorkomponente bekannt machen_GUICtrlLex_SetupStylingAndFolding(); das wars eigentlich.... wer allerdings gerne noch einen Menüpunkt hätte, um die Lexerdefinition anzupassen, wie oben auf dem Screenshot zu sehen, der macht noch etwas weiter:; (genereller Hinweis: für den Einbau in eigene Skripte sollte der OnEvent Modus verwendet werden, das macht es etwas einfacher); 5.) erzeugen eines eigenen Hauptmenüpunkts 'Lexer', mit allem was nötig ist_GUICtrlLex_CreateLexerDefMenu('main'); 6.) den unter 5.) erzeugten Menüpunkt mit dem Konfigurationsdialog verknüpfenGUICtrlSetOnEvent($__arM[2], "_GUICtrlLex_OpenLexerDef"); WICHTIG: wer eigene Funktionen als WM_NOTIFY oder WM_COMMAND registrieren will, muss; _GUIRegisterMsg aus der Libs\_GUIRegisterMsg.au3 verwenden!

    [/autoit]


    Was ganz hübsch ist, ist die Tatsache, daß wenn man an der Lexerdefinition herumschraubt, Farben und Schriftarten ändert, beim einem Klick auf "Sichern" das ganze direkt auf Editor übertragen wird. Man kann also schauen, wie sich der Kram verändert. Hauptsächlich dafür liegen die Testskripte bei.

    Fairerweise muss ich aber eines dazu sagen: dieser Editor ist für große Skripte einfach zu langsam, da es eben AutoIt Geschwindigkeit ist. Da es bei mir aber nicht um riesige Codemengen ging, sondern eher um eine gute Darstellung kleinerer Skripte, hab ich's halt so gemacht. Also bitte nicht hauen, wenn das 8000 Zeilen Skript schon ein wenig braucht, um gestylt und gefoldet zu werden ;-))

    Es werden auch sicherlich noch ein paar Böcke drin sein und ich weiß auch nicht, wie optimal mein Code ist (vor allem der Folder ;-), vielleicht mach ich den auch nochmal neu ), soooo lange schreibe ich noch nicht in AutoIt, aber Spass gemacht hat's trotzdem ;)

    Vielleicht kann's ja wer gebrauchen und Lob oder Kritik sind natürlich immer gerne gelesen :)

    Lieber Gruß
    Holger

    7 Mal editiert, zuletzt von pandel (2. März 2017 um 15:14)

  • Danke ;)

    Ja, das kenne ich, damit ist das ganze erstellt. Ich hab in der ZIP nur die Projektdatei weggelassen. Ohne das ISN Studio und den integrierten Debugger hätte ich den Lexer gar nicht schreiben können...

  • Ich dachte der verwendet auch den SciLexer. Mit dem SciLexer hatte ich schonmal einen Editor geschrieben, aber nicht für AutoIt.

  • Oh, da haben wir uns missverstanden. Nein, ich meinte, für mein Project habe ich ISN AutoIt Studio als Code Editor genutzt. Das verwendet intern auch den SciLexer, aber mit den mitgelieferten Lexern. Mir gings ja darum, einen eigenen Lexer komplett selbst zu schreiben, und das eben in AutoIt... ;)

  • Nochwas ganz wichtiges. Wenn du speicherst wird dir ja ein Name vorgeschlagen mit der Endung .ins. Warum .ins?
    Da ja als Dateityp, je nach Lexer, .vbs oder .au3 oder so angezeigt wird, sollte dann die Endung dort stehen.
    Aber es gibt viele und ich auch, die schreiben dann da einen Namen hin, aber ohne Endung, weil es ist ja ein Dateityp ausgewählt, und speichern es dann ab. Du hast aber keine Prüfung drin bei der Rückgabe des Strings ob eine Endung dran ist. Weil wenn keine dran ist, musst du die im nachhinein anfügen.
    Am besten du machst das so wie es hier gemacht wurde. So mach ich das auch immer.
    [ offen ] Eingabefeld Inhalt löschen und Speichern

    Und für die ganzen _IsPressed Abfragen in der While-Schleife, würde ich HotKeySet nehmen. Das ist da sinnvoller.

  • chesstiger
    :D und ich hab beim Schreiben noch überlegt! Da fall ich immer drauf rein... ich korrigiers oben im Text gleich! Und danke für's Kompliment!

    @m-obi
    Super Tipp mit der _FileSaveDialog Func! Muss mal probieren, ob es auch mit so Sachen wie "Scripts (*.aut;*.au3)" funktioniert, oder ob jeder Skripttyp IMMER mit ner Pipe abgetrennt werden muss. Und was die _IsPressed Abfragen anbelangt, das ist noch aus dem ursprünglichen Editor, den ich entkernt habe. Aber du hast recht, HotkeySet gefällt mir auch besser, jetzt wo du's erwähnst. Das bau ich mal um...

    EDIT: SUPER Funktion! Danke, klapp hervorragend! Ist auch viel besser, die einzelnen Skripttypen getrennt zu definieren....

    EDIT2: Mmhh... gut das du das angesprochen hast, konnte direkt noch ein paar blöde Böcke bereinigen! Neue Fassung siehe oben

    3 Mal editiert, zuletzt von pandel (27. Juni 2013 um 13:57)