AutoIt mit Sublime Text 2/3 -- Sprachdef. f. Stable v3.3.12.0, Wrapper, Au3Check, Run m. Parameter

    • Offizieller Beitrag

    Hi,

    Vielleicht hat ja jemand Lust, AutoIt mit einem sehr smarten Editor zu verheiraten, nämlich Sublime Text 2. Der Editor ist zwar nicht frei, aber man kann ihn immerhin kostenlos testen. Ein paar Videos, die gute Features von ST2 zeigen, gibt es hier.

    Johannes

    Edit BugFix: Damit ihr nicht immer den kpl. Thread lesen müßt, verlinke ich hier auf einzelne Posts, die ich dann auch aktuell halte.

    Anleitung von BugFix, inkl. ToggleConsole und Bindung Dateityp-Farbschema
    Anleitung von rynow
    Sprachdatei für AutoIt3 v3.3.8.1 (Stable), Farbschemadatei like OldStandard-SciTE
    Sprachdefinitionsdatei auf Stable 3.3.12.0 angepaßt, inkl. OldSciTE-Theme
    Kleiner Wrapper für OutFile, Icon, UPX, CUI
    Au3Check, Run mit Parameter(n)
    Zeitstempel, Zeitsempel + Versions-Backup
    • Textdateien gehen auch in bunt: Definitions- und Schemadatei für 'Plain Text', zusätzlich mit Ordinalzahlen & Paragrafen

    • Offizieller Beitrag

    Um das Syntaxhighlighting einzubinden einfach die angehängte ZIP-Datei in den Ordner:
    "..\Sublime Text 2.0.1\Data\Packages" entpacken.

    Edit:
    Die enthaltenen Color-Shemes, sind für uns SciTE-User recht gewöhnungsbedürftig. Ich übertrage gerade das "SciTE Old AutoIt"-Scheme in eine eigene Scheme-Datei für ST2. Jedenfalls soweit die geparsten Elemente übereinstimmen.
    Werde ich dann hier posten, wenn es fertig ist.

    Edit2:
    Also das Parsing ist unterirdisch. Die Hälfte der AutoIt-Syntax wird nicht mit der entsprechenden Zuordnung erkannt. Weder Operatoren noch Integer oder Hex werden erkannt. Sehr schlampige Umsetzung.
    Da ich bisher keine Auflistung der verwendbaren scope-Begriffe gefunden habe, kann ich keinen eigenen Parser erstellen. Die Doku zu ST2 ist auch sehr beschränkt.
    Insofern macht es auch keinen Sinn ein eigenes Farbschema zu erstellen. Halbwegs brauchbar ist noch das "Eiffel"-Theme.
    Aber ohne ordentliches Syntaxhighlighting ist es kein noch so guter Editor wert, zu wechseln. Zumal hier noch alle PlugIns erstellt werden müssen für Syntaxcheck, Abbrevations, Run, Compile etc. pp.
    Fazit:
    Um diesen Editor AutoIt tauglich zu bekommen in der Form, dass er mindestens das bringt, was SciTE per se kann, wird noch viel Zeit ins Land gehen.

    Edit3:
    Ha! Ich habs gefunden, wie man eine eigene Definitionsdatei erstellen kann. Erst muß man das Packet-Manager Plugin installieren, dann kann man sich die das Entwickler-Plugin einbinden und damit lassen sich die erforderlichen Snippets erstellen.
    Werde mich da mal Step By Step mit einer sauberen Umsetzung für AutoIt-Syntax befassen. Wobei ich das gleich noch etwas erweitern werde - mir fehlte schon immer eine eigene Farbe für Hexzahlen, das läßt sich nun machen.
    Die Programmbeschreibung ist doch besser als zuerst gedacht - man muss nur die richtigen Seiten erst mal aufstöbern. ;)

    ===========================================================================================

    Um eine vernünftige Arbeit mit AutoIt zu ermöglichen, bedarf es einer umfangreichen Arbeit.
    Ich schreibe mal Einzelschritte, die mir einfallen, hier auf. Wer möchte kann ja dann sich ein Thema aufgreifen und abarbeiten (bitte dann im Thread vermerken).

    1. AutoIt.tmLanguage erstellen (erfordert als erstes "Sublime Snippets(Raw).JSON-tmLanguage" aus der anschließend die "AutoIt.tmLanguage" generiert wird.
    (Die hier bereits angehängte Version eines unbekannten Autors berücksichtigt wenig AutoIt-Typisches, da nur mit den Standard-scopes gearbeitet wurde, die wenig differenzierend arbeiten.)
    [Hier bastel ich gerade dran rum]
    10.05.2013: ERLEDIGT - Syntaxdefinitionsdatei basierend auf Standard-Scopes erstellt, s. Post #8 / #Post9

    2. Min. ein Farbschema, das mit der AutoIt.tmLanguage zusammenarbeitet für ein ordentliches Highlighting. (dazu muss AutoIt.tmLanguage erstellt sein)
    Optimal wäre gleich noch ein Konfigurator um eigene Anpassungen für die jeweilige Syntaxgruppe vornehmen zu können. Nicht machbar, geändert werden muß immer in der JSON-Datei aus der man dann die .tmTheme generiert.
    10.05.2013: ERLEDIGT - Basierend auf SciTE-OldStyle + Hexzahlen u. Klammern extra, #Post9

    3. Python-Skript zum Erstellen der Funktionslisten (Nativ, Standard-UDF, User-UDF), mit automatischer Neuerstellung bei neuer AutoIt-Version
    Nur über diese Funktionslisten können die geparsten Funktionen auch der jeweiligen Rubrik zugeordnet werden und entsprechend ihr Highlighting bekommen.
    Gleiches gilt auch für: Includes, Präprozessoranweisungen
    Nur optional. Das Erstellen der Auflistung von Hand/AutoIt-Skript nimmt nur wenig Zeit in Anspruch.

    4. Autocomplete

    5. Abbrevs

    6. Calltip

    7. Indent für Schleifen, Statements

    8. die ganz ureigenen Dinge: Plugins für Syntaxcheck, Run, Compile

    9.ff Und dann noch all jene Tools, die in Scite speziell für AutoIt enthalten sind (Tidy, DebugToConsole, usw. usf.)

    Es ist recht komplex. Aber es sollte alles entweder mit Snippets oder Python-Skripten zu bewältigen sein.
    Habe ich noch was vergessen? - Dann posten.
    Vielleicht schaffen wir es ja ST2 und AutoIt erfolgreich zu vermählen. Verdient hätten es beide. :D

    Btw.: Laut Menü ist die Konsole über "Ctrl+´" aufrufbar. Das ist aber Quatsch und kann nicht funktionieren.
    Tragt einfach in der Datei: <Preferences><Key Bindings - User> ein:

    Code
    [
        { "keys": ["ctrl+,"], "command": "show_panel", "args": {"panel": "console", "toggle": true} }
    ]

    Dann kann die Konsole mit "Ctrl+Komma" aufgerufen werden. Das kollidiert mit keinem anderen Hotkey und hat auch noch eine "Verwandschaft" im Namen. ;) Komma/Konsole

  • Danke, dass du dich damit befasst BugFix :thumbup:
    Oh mann, mich nervt jetzt gewaltig, dass ich keine Erfahrung mit Python oder JSON habe. Ich würde gerne mithelfen...

    • Offizieller Beitrag

    So, ich habe nun mal wieder etwas Zeit gefunden an dieser Baustelle weiter zu basteln.
    Ich habe jetzt eine "AutoIt.tmLanguage" erstellt und basierend auf dieser die "Default.au3.tmtheme".
    Syntaxhighlighting funktioniert noch nicht für SentKeys aber dafür habe ich zusätzlich drin als eigene Typen mit separater Färbung:
    • Klammern
    • Hex-Zahlen
    Einige UDF-Funktionsnamen sind noch nicht enthalten. Da muß ich mir noch eine Routine schreiben, die die JSON-Datei automatisch generiert. Aber für den Anfang gehts erst mal. ;)

    Im Anhang sind auch die "JSON"-Dateien enthalten. Wenn man etwas ändern möchte, muß es an diesen Dateien passieren. Anschließend werden daraus mit "F7" bei Einstellung Build-System "JSON to PropertyList" die .tmLanguage / .tmtheme erstellt.
    Im Anhang:
    • Ordner "AutoIt3" {AutoIt3.JSON-tmLanguage, AutoIt3.tmLanguage} ==> Ordner Speichern in "C:\Users\USERNAME\AppData\Roaming\Sublime Text 2\Packages\"
    • Dateien {Default.au3.JSON-tmtheme, Default.au3.tmtheme} ==> Dateien Speichern in "C:\Users\USERNAME\AppData\Roaming\Sublime Text 2\Packages\Color Scheme - Default\"

    Das ganze schaut dann so aus:
    autoit.de/wcf/attachment/21097/

    • Offizieller Beitrag

    Ich habe inzwischen die "Scope Rules/ Naming Conventions" ausfindig gemacht und anhand dieser eine .tmLanguage erstellt, die somit auch bei vorhandenen Farbschemes genutzt werden kann.
    Es gibt in diesen Regeln eine vordefinierte Struktur mit entsprechenden Begriffen.
    Bsp.: Kommentarzeile
    Scope (Basis) = "comment.line"
    Es gibt bereits vordefinierte Sub-Scopes:

    Code
    "comment.line.double-slash" — // Kommentar
    "comment.line.double-dash"  — -- Kommentar
    "comment.line.number-sign"  — #  Kommentar
    "comment.line.percentage"   - %  Kommentar

    Da davon nichts für AutoIt zutrifft, wird der Sub-Scope:
    "comment.line.character" verwendet.

    Um doppelte Scope-Namen zu vermeiden, wird an den Scope immer die Syntaxbezeichnung angehängt, für uns also: ".autoit".

    Im Gegensatz zum Highlighting mit Lexxer, wird hier die Farbgebung über Syntaxerkennung mittels der vergebenen Regex-Definition aus der .tmLanguage gesteuert.
    Bei einem Match liest der Parser den Namen aus der .tmLanguage und sucht im aktuellen Farbschema nach größtmöglicher Übereinstimmung im Namen.
    Bsp.:
    Ich verwende im Muster eine Erkennung von Integer und separat von Hexadezimalzahlen. Dazu habe ich die Scopes
    - "constant.numeric.hex.any" und
    - "constant.numeric.number.any"
    Beide Scopes kennt der Parser nicht, also wird jeweils von rechts eine Ebene nach vorn gegangen und erneut geprüft. Für beide Scopes findet der Parser dann mit
    "constant.numeric"
    eine Übereinstimmung. Es werden also beide Scopes mit den Font-/Farbanweisungen für diesen "Stamm" angezeigt.
    In einem individuell erstellten Farbschema kann ich natürlich jeden vergebenen Scope auch einzeln ansprechen und nach meinem Geschmack formatieren.

    Hier mal eine Auflistung der Scop-Namen in dieser Musterdatei mit Zuordnung der AutoIt-Syntax:
    Den allgemeingültigen Scope (Root) habe ich zur Veranschaulichung zwischen 2 Pipes gesteckt.


    Im Anhang findet ihr die Musterdatei "Test.JSON-Language". Jetzt werden auch SentKeys korrekt erkannt.
    Wenn ihr euch die *.tmTheme aus dem vorigen Beitrag zur Hand nehmt, sollte es kein Problem sein ein eigenes Farbschema zu erstellen.
    Bevor ihr aus der .JSON-Language die .tmLanguage erstellt dann natürlich noch die ersten 3 Zeilen anpassen:

    Code
    { "name": "Test",
      "scopeName": "source.any",
      "fileTypes": [""],

    "Test" wird der Language-Name, der dann auch in der Syntaxübersicht erscheint (also z.B. AutoIt), "source.any" wird dann zu "source.autoit" und '[""]' zu '["au3"]'.

    Um die Übersicht über Standard-Packages und eigene Werke zu behalten, empfiehlt es sich, eigene Definitionen unter:
    "C:\Users\USERNAME\AppData\Roaming\Sublime Text 2\Packages\User\"
    abzuspeichern.

    Ein Hinweis noch: Falls ihr selbst an den Syntaxdefinitionen (Regex-Pattern) herumbasteln möchtet, probiert diese vorher ausserhalb des Editors aus. Die Regex-Syntax weicht gering von der uns bekannten ab. Sublime Text verwendet die Regex-Engine "Oniguruma".

    Und nun viel Spaß damit.

    • Offizieller Beitrag

    Hier nun die AutoIt-Version im Stil von SciTE-OldStyle und zusätzlicher Einzelfärbung für Hexzahlen und Klammern (dabei moch 2 kleine Bugs aus der im vorigen Post gepinnten Syntaxdefinition gefixed).
    Damit ist jetzt erst mal der optische Grundstein gelegt. Nun gehts ans Eingemachte. :D

    (Anhang in den Ordner "C:\Users\USERNAME\AppData\Roaming\Sublime Text 2\Packages\User\" entpacken)

    Edit:
    - Noch einen Fehler beim Com-Objects-Parsing gefixed.
    - "AutoIt.sublime-settings" hinzugefügt


    "AutoIt-Definition_plus_Theme-OldStyle.zip" enthält:

    Code
    - AutoIt.JSON-tmLanguage
    - AutoIt.tmLanguage
    
    
    - AutoIt.JSON-tmtheme
    - AutoIt.tmtheme
    
    
    - AutoIt.sublime-settings
  • BugFix - Dazu kann ich nur eins sagen wow. :thumbup:
    Du sagst es geht jetzt "ans Eingemachte" und da ich nicht davon ausgehe, dass du vor hast dich über deine Marmeladen-Vorräte herzumachen wollte ich mal fragen: Was kommt denn da noch? bzw. Was hast du noch vor oder was lässt sich mit Sublime da noch alles machen? :P

    LG
    Christoph :)

    • Offizieller Beitrag

    Als kleines Nebenbei habe ich die Definitionen für die Textdatei erweitert und mal ordentlich aufgehübscht. :D

    Aus dem Anhang:
    "Text.zip" in den Ordner "..\Packages\Text\" entpacken (vorhandene "Plain text.tmLanguage" überschreiben)
    "User.zip" in den Ordner "..Packages\User\" entpacken

    Damit ein bestimmter Dateityp immer mit derselben Syntaxdatei angezeigt wird, wie folgt vorgehen:
    - Datei öffnen
    - In der Statusbar unten rechts ist die aktuell genutzte Syntax sichtbar
    - Diesen Syntaxnamen anklicken
    - ersten Menüpunkt wählen ("Open all with current extension as..")
    - im Submenü "GEWÜNSCHTE_SYNTAX" auswählen
    Nun wird jede Datei diesen Typs immer mit dieser Syntaxdefinition geöffnet

    Damit zusätzlich auch mit einem Dateityp ein Schema automatisch verknüpft wird, so vorgehen:
    - Datei erstellen (od. wenn vorhanden öffnen) "SUFFIX.sublime-settings"
    - Inhalt:

    Code
    {
                "color_scheme": "Packages/Color Scheme - Default/iPlastic.tmTheme"
            }

    Das wäre ein Standardthema
    Für eigene Themes auf den Pfad verweisen, z.B. hier für Text

    Code
    {
                "color_scheme": "Packages/User/Plain Text.tmtheme",
                "extensions": ["txt"]
            }

    Die Settings-Datei für PlainText ist im Anhang bereits enthalten.


    Und so kann Text dann aussehen:
    autoit.de/wcf/attachment/21147/

    • Offizieller Beitrag

    Die Plain-Text Variante habe ich jetzt noch um Eerkennung von Ordinalzahlen und Paragrafen erweitert. Die Standardtextfarbe habe ich jetzt auch etwas kräftiger gewählt.
    Wie das funktioniert und aussieht könnt ihr dem Bild entnehmen:

    autoit.de/wcf/attachment/21177/

    • Offizieller Beitrag

    Da der Server-Crash die Daten gefressen hat, hier nochmal:

    - Sprachdefinitionsdatei auf Stable 3.3.12.0 angepaßt
    - seperate Erkennung von: Hexzahlen, Klammern, Variablen die mit Funktionen verknüpft sind

    autoit.de/wcf/attachment/24510/

    • Offizieller Beitrag

    Ähnlich wie Lua in SciTE, ist die Implementierung von Python in ST rudimentär. Wesentliche Teile der Standardbibliotheken sind nicht enthalten (z.B. tkinter). Somit lassen sich keine komplexen GUI erstellen, was in Bezug auf einen schicken AutoIt-Wrapper sehr schade ist.
    Mit einer zusätzlichen Python-Installation ließe sich das lösen, aber das ist natürlich keine allgemeingültige Option.
    Ich habe die GUI schan mal analog wie in AutoIt mit tkinter erstellt. Das war aber mehr zum Test, wie man mit tkinter umgeht. Eventuell setze ich mich später mal an die Portierung des entsprechenden Codes nach Python. Das ist aber nicht ganz ohne. Also rechnet nicht mit baldigem Vollzug. ;)

    Edit:
    So sieht es z. Zt. aus:
    Link

    • Offizieller Beitrag

    An diesem könnte man sich doch die Kommunikation mit Sublime abschauen und den Wrapper basteln.

    Die Kommunikation ist kein Problem. Es ist ein API implementiert, darüber läßt sich das machen.
    Ich wollte nur gerne auch eine im System (Python) eingebundene GUI nutzen.
    Den AutoIt-internen Wrapper kann man nicht übernehmen, der ist für SciTE konfiguriert. Alternativ bliebe, ihn weiterhin als AU3-exe zu erstellen aber mit Kommunikation über STDOUT und damit ST füttern.

    darf ich dein Sublime Theme auf meinen Blog mit anbieten? Selbstverständlich unter deinem Namen?

    Na klar, dazu habe ich es schließlich erstellt.

    • Offizieller Beitrag

    @rynow
    Ein kleiner Typo auf deiner Seite:

    Zitat

    Im nächsten Teil werde ich euch einige Erweiterungen und weiter tolle Futures von Sublime Text vorstellen.

    ;)


    Hier nochmal meine Anleitung, die ich im EN-Forum gepostet hatte. Dort sind noch einige zusätzliche Punkte enthalten (Toggle Konsole, Bindung Dateityp an Color-Scheme):

    Spoiler anzeigen

    Here i will you give the first steps for work with ST2/ST3:

    1. Download "Sublime Text 2/3" and installation
    You find it here: Sublime Text

    2. Shortcut-File open with: <Preferences> <Key Bindings - User>
    Following shortcut insert in this file to toggle console with "Strg+,"
    (default shortcut does'nt work in Windows)

    Code
    [
            { "keys": ["ctrl+,"], "command": "show_panel", "args": {"panel": "console", "toggle": true} }
        ]


    3. Urgent required Package "Package Control" install
    - Open console
    - insert following text (it's all in one line!)

    Code
    import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print('Please restart Sublime Text to finish installation')


    - Hit <Enter> to install. After restart you'll find it on menu:
    <Preferences> <Package Control>

    4. You need a possibility to create JSON-files and to convert them to plist (.tmLanguage/ .tmTheme). For this you'll need the Package "AAAPackageDev"
    - <Preferences> <Package Control> <Package Control: Install Package> - click
    - Insert "AAA", than the Package is on top, or scroll with mouse to this
    - With clicking the Package it will installed (State is shown bottom in the status line, left)
    Needs also an restart.

    Now you have a new menu: [ the following is some different in ST3, but you will see it by using ]
    <Tools>
    <Packages> <Package Development>
    ...
    ...
    <New Syntax Definition> -- that's what you need to create a new definition or theme file (JSON)

    And in menu <Tools><Build System> you find now "JSON to Property List" and "Property List to JSON". You need this for convert "*.JSON-tmLanguage" to "*.tmLanguage" and "*.JSON-tmtheme" to "*.tmtheme"

    You can bind color schemes to a file type. You need a settings file like "AutoIt.sublime-settings".
    Inside this you declare the scheme:

    Code
    {
        "color_scheme": "Packages/User/AutoIt.tmtheme",
        "extensions": ["au3"]
    }


    Also you can determine, that all files of one file type will opened with the syntax definition of your choice. For this open a file with the required file type (i.e *.au3) and now you see bottom in the status line, right side, the current used syntax definition. Click this and go ahead to "Open all with current extension as..". Select than the syntax definition you like.


    In attachement you find my syntax definition file for autoit. Its based with the used scopes on the naming convention from TextMate, which also used in Sublime Text. It makes sense to work with naming convention. So you can use other color schemes (themes) and have a detection of a lot of definitions.
    Here is a list of used scopes. I've marked with pipes the scope name from naming convention: