SciTE - Option "MustDeclareVars" mittels Property automatisch setzen

  • In der Shoutbox tauchte die Frage auf, ob es eine Einstellung gibt, dass AutoIt-Skripte immer die Option "MustDeclareVars" enthalten.

    Das ist nicht vorgesehen. Eine Lösung wären Abbrevs (muss man also zumindest einmal in jedem Skript ausführen). Die andere Variante stelle ich hier mit einem Lua-Skript bereit:

    Das Ereignis OnBeforeSave wird dazu ausgewertet in Abhängigkeit von einer Property, die wir in der SciTEUser.properties hinterlegen.

    Das Skript wird aktiv, sowie ein au3-Skript gespeichert wird.


    EDIT: Per Property lässt sich jetzt einstellen, ob die Optionsprüfung nur bei neuen Skripts (1) oder bei jedem Skript(2), das in SciTE geöffnet, und dann gespeichert wird Anwendung findet.


    EDIT_2: Zusätzlich kann gewählt werden, ob bei neuen Skripten die Option in Zeile 1 oder (wenn vorhanden) hinter dem TimeStamp eingefügt wird. Dazu muss in der SciTEStartup.lua in der Reihenfolge zuerst das TimeStamp-Skript aufgerufen werden. -- Aktuelle Version: v 0.2


    - Opt.MustDeclareVars.au3=0 (oder Eintrag nicht vorhanden)

    Option ist im Text mit Flag "0" - keine Aktion / mit Flag 1 - Flag wird auf "0" gesetzt

    Option ist nicht im Text - keine Aktion


    - Opt.MustDeclareVars.au3=1

    Neue Datei wird gespeichert - Option wird an Position 0 (erste Zeile) eingefügt


    - Opt.MustDeclareVars.au3=2

    Bei allen au3-Skripten wird die Optionsprüfung durchgeführt

    Die erste sichtbare Zeile im Editor und ebenso die Cursorposition bleiben unverändert.

    Code: SciTEUser.properties
    1. #~ au3-Skripte ohne/mit(nur neue Datei)/mit(jede Datei) Option "MustDeclareVars" (0/1/2) speichern
    2. Opt.MustDeclareVars.au3=1
    3. #~ Nur bei Neuskripten UND wenn zuerst TimeStamp gesetzt wird (Aufrufreihenfolge in SciTEStartup.lua)
    4. #~ Option einfügen in Zeile hinter TimeStamp (und Leerzeile): "1", sonst erste Zeile: "0" (oder Property nicht besetzt/vorhanden)
    5. Opt.MustDeclareVars.TimeStamp.First=1

    Das Lua-Skript Au3OptMustDeclareVars.lua speichert ihr in eurem Skriptordner mit den Lua-Dateien.

    Die Datei muss nun noch im Startupskript (SciTEStartup.lua) hinterlegt werden.





    Habt ihr einen eigenen Ordner für Lua-Skripte (empfohlen), dann muss dieser über eine Property in der SciTEUser.properties benannt werden und beim Startup geladen werden (Eintrag AM ANFANG):

    EDIT: Der Teil mit "LUA_USER_PATH" ist jetzt ZWINGEND erforderlich.

    Code: SciTEStartup.lua
    1. local sUserLua = props["Lua.User.Scripts.Path"]
    2. LUA_USER_PATH = sUserLua .. "\\?.dll;" .. sUserLua .. "\\?\\?.dll;"
    3. package.cpath = LUA_USER_PATH .. package.cpath
    4. LUA_USER_LUA = sUserLua .. "\\?.lua;" .. sUserLua .. "\\?\\?.lua;"
    5. package.path = LUA_USER_LUA .. package.path

    Um nicht immer den kpl. Pfad beim Laden angeben zu müssen empfiehlt es sich eine Funktion zum Laden der Userskripte AM ENDE des Startup-Skriptes einzufügen:

    Code: SciTEStartup.lua
    1. --------------------------------------------------------------------------------
    2. -- Calls LoadLuaFile() with directory from Lua-User-Script property
    3. --------------------------------------------------------------------------------
    4. function LoadUserLuaFile(file)
    5. LoadLuaFile(file, props["Lua.User.Scripts.Path"] .. "\\")
    6. end -- LoadUserLuaFile()
    7. --------------------------------------------------------------------------------
    8. LoadUserLuaFile("Au3OptMustDeclareVars.lua")

    EDIT: Es wird jetzt die Shell.dll für SciTE-Lua verwendet. Das Einbinden externer Bibliotheken habe ich hier im Detail beschrieben. Den Ordner shell in den Ordner mit den Lua-Skripten kopieren. Und dann, wie im verlinkten Thread beschrieben, die dll registrieren. Die angehängte ZIP entpacken und den Ordner umbenennen zu shell. (Ordnername und Dll-Name müssen identisch sein.




    Falls ihr das Lua-Skript in den Lua-Ordner in SciTE speichert, muss AM ENDE der Startdatei eingefügt werden: LoadLuaFile("Au3OptMustDeclareVars.lua")


    EDIT: Hatte ich vergessen zu erwähnen - SciTE muss neu gestartet werden!

  • Also vorerst schon mal Danke, das du dich meinem Problem angenommen hast :D


    Aber irgendwas mache ich noch falsch. Eingefügt habe ich

    SciTEUser.properties (als letzte Zeile): Opt.MustDeclareVars.au3=1

    SciTEStartup.lua (am Ende, nach "EventClass:BeginEvents()"): LoadLuaFile("Au3OptMustDeclareVars.lua")

    Au3OptMustDeclareVars.lua in den lua Ordner von SciTe


    Beim Kompilieren bekomme ich jedoch keine Warnung.

  • Hi BugFix !

    In der Shoutbox tauchte die Frage auf, ob es eine Einstellung gibt, dass AutoIt-Skripte immer die Option "MustDeclareVars" enthalten.

    Das ist nicht vorgesehen. Eine Lösung wären Abbrevs (muss man also zumindest einmal in jedem Skript ausführen). Die andere Variante stelle ich hier mit einem Lua-Skript bereit:


    Nur der Vollständigkeit halber (hat nichts mit den o.a. LUA Skripten zu tun) :

    BugFix's Beitrag zu "Abbrevs" aus der Shoutbox (ist für Gäste ja nicht sichtbar) :

    SciTE öffnen (au3 Skript!) -> Strg+1 -> Reiter "Other Tools" -> Run AbbrevManager -- abschliessend "Save+Apply! " . Beispiel : omdv als Kürzel für Opt("MustDeclareVars", 1)"


    Verständnisfrage :

    Aktiviert man die LUA Skripte, dann wird beim Speichern eines .au3-Skriptes die Zeile Opt("MustDeclareVars", 1)

    eingetragen, oder ? Das betrifft dann aber auch Fremdskripte (z.B. aus dem Forum), die ohne die Option MustDeclareVars=1 erstellt wurden.

    Folge : Speichert man solche Skripte, bekommt man später haufenweise Syntaxerrors.


    Moombas :

    Wäre es nicht einfacher, diese Option - wie 'üblich' - an den Anfang deiner Skripte zu kopieren ?

    Es ist ja nicht so, dass man 100 Skripte pro Tag erstellt ;).


    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."


  • BugFix : Ja ich habe SciTe neu gestartet (mehrfach) :( Habe zum testen extra einer Variable die Deklaration genommen, aber leider keine Fehlermeldung. Trage ich es direkt ein bzw. über Abbrev, dann funktionierts. Das ich eine bestehende .au3 verwende und keine neue dürfte ja egal sein odeR?


    Musashi : Ich bin diese Prüfung eigentlich generell gewöhnt (Pascal -> Delphi) und kenne es so, das Variablen deklariert werden MÜSSEN, bevor sie verwendet werden. Aktuell ist heute ein Skript auf Fehler gelaufen, weil eine Variable durch eine Besonderheit an einem PC nicht deklariert wurde -> Fehlermeldung im Skript.


    Das würde ich gerne generell vermeiden und wenn ich bei Foren-Skripten halt Variablen nachdeklarieren muss, wäre ja eigentlich sogar sauberer :P



    Nachtrag: Wenn ich JETZT versuche Opt("MustDeclareVars", 1) einzutragen, ändert er es in Opt("MustDeclareVars", 0)!



    Nachtrag 2: Ich habe in deiner Au3OptMustDeclareVars.lua den Eintrag local mustdeclare = tonumber(props["Opt.MustDeclareVars.au3"]) or 0 geändert in local mustdeclare = tonumber(props["Opt.MustDeclareVars.au3"]) or 1. Jetzt gehts!

  • Aktiviert man die LUA Skripte, dann wird beim Speichern eines .au3-Skriptes die Zeile Opt("MustDeclareVars", 1)


    eingetragen, oder ? Das betrifft dann aber auch Fremdskripte (z.B. aus dem Forum), die ohne die Option MustDeclareVars=1 erstellt wurden.

    Folge : Speichert man solche Skripte, bekommt man später haufenweise Syntaxerrors.

    Genau, das gilt für alle Skripte - aber nur, wenn du diese speicherst. Das Öffnen und Ansehen ändert nichts am Skript und somit sehe ich da auch kein Problem.

    Ich habe aber bereits vor Jahren ein Skript veröffentlicht, das alle Variablen eines Skriptes nachträglich deklariert.

  • Musashi : Ich bin diese Prüfung eigentlich generell gewöhnt (Pascal -> Delphi) und kenne es so, das Variablen deklariert werden MÜSSEN, bevor sie verwendet werden.

    Kann ich zu 100% nachvollziehen - ich habe vor Urzeiten mit Turbo Pascal angefangen (ernsthafter) zu programmieren. Für mich ist Opt("MustDeclareVars", 1) daher auch eine Pflichteinstellung ;).

    Es ging weniger um die Frage OB man diese Option setzt, sondern WIE. Ich habe das Kopieren einer Einzelzeile bisher nicht als so zeitkritisch empfunden, dass ich nach einer Automatik gesucht hätte. Sollte es mit LUA klappen, umso besser !


    EDIT : BugFix

    Danke für die Infos, und auch für den Einblick in LUA :thumbup:.


    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."


  • Ich habe in deiner Au3OptMustDeclareVars.lua den Eintrag local mustdeclare = tonumber(props["Opt.MustDeclareVars.au3"]) or 0 geändert in local mustdeclare = tonumber(props["Opt.MustDeclareVars.au3"]) or 1. Jetzt gehts!

    Sehr seltsam. Properties sind immer Text, deshalb wandele ich den gelesenen Wert in eine Zahl und weise den Wert 0 zu, falls die Property nicht existiert. Dann gibt tonumber() nämlich "nil" zurück. val = x or y bewirkt, dass x übernommen wird, aber wenn x = nil, wird y übernommen.

    Dein Eintrag bewirkt jetzt, dass ohne Property immer die Option gesetzt wird.

  • Genau, das gilt für alle Skripte - aber nur, wenn du diese speicherst.

    Kannst du nicht überprüfen, ob die zu speichernde Datei noch nicht exisitiert (dann wäre es ein selbst erstelltes Scripts), und nur dann die Zeile einfügen, wenn Opt.MustDeclareVars.au3=1 ist?

  • Kannst du nicht überprüfen, ob die zu speichernde Datei noch nicht exisitiert (dann wäre es ein selbst erstelltes Scripts), und nur dann die Zeile einfügen, wenn Opt.MustDeclareVars.au3=1 ist?

    Ja, tatsächlich - das geht. :party: --- Werde ich noch einfügen. Füge dann als Option eine Property zum Überprüfen aller Skripte ein.

    Aber kannst du mal testen, ob TimeStamp bei dir noch funktioniert, wenn du dieses Skript aktivierst?

    Eigentlich ist das egal, wenn ich in verschiedenen Skripten dieselbe interne Funktion (OnBeforeSave) mehrfach aufrufe. Intern landet sowieso jedes Skript beim Laden in einem Globalen Array. Die Aufrufe der Event-Funktionen landen dann auf einem Stack und werden nacheinander abgearbeitet.

    Bei mir ist jetzt folgender Effekt:

    In SciTEStartup.lua:

    - Aufruf TimeStamp.lua und danach Aufruf MustDeclare.lua: Nur das Skript für MustDeclare wird ausgeführt

    - Aufrufreihenfolge umgekehrt: Nur TimeStamp wird ausgeführt

    Also immer das zuletzt geladene Skript wird verwendet.


    Das habe ich noch nie erlebt. Ich verwende die Event-Funktionen dutzendfach (z.B. in meiner OHK.lua und den zugehörigen Funktionen) ohne jede Kollision. Im Moment habe ich dafür keine Erklärung. Mal drüber schlafen.

  • So, da hatte ich mir ja ein Ei gelegt - zu lange keine Lua-Skripte mehr geschrieben.

    Ich habe sowohl im TimeStamp-Skript, als auch in diesem Skript vergessen, eine neue Event-Klasse anzulegen für das verwendete Ereignis und die Funktionsaufrufe direkt in das zentrale Ereignis eingesetzt. Und da kann natürlich nur ein Wert landen - immer der letzte. :Face:

    Ich habe das jetzt hier korrigiert und auch die Property entsprechend Bitnugger 's Vorschlag erweitert.


    EDIT: Ich hatte gerade bemerkt, dass mein Lua-Skript im Editor noch nicht gespeichert war. Somit kann es sein, dass die hochgeladene Version noch einen Fehler hat. Habe jetzt die letzte Version geladen.



    Übrigens, wer die TimeStamp.lua nutzt - bitte gleich mal am Skriptanfang ändern

  • Kannst du in dem TimeStamp-Skript noch eine Option einbauen, damit es auch mit Python-Scripts funktioniert?


    SetTimeStamp.py=1

    Erledigt.


    Das Optionsskript habe ich jetzt erweitert.

    Falls ihr das TimeStamp-Skript auch verwendet, könnt ihr nun wählen, ob die Option in Zeile 1 oder erst nach dem TimeStamp (und der folgenden Leerzeile) eingefügt wird. Finde ich optisch ansprechender.

    Aktuelle Version: v 0.2

  • Wenn ich das ganze (auch in der Shoutbox) richtig verfolgt habe, ging es doch eigentlich darum, dass jemand in jedem selbst erstellten Script die Option

    MustDeclareVars 1 gesetzt haben wollte, ohne dass man es eintippen muss…


    Ich hab was bereits vorgeschlagen, doch es wurde gekonnt ignoriert. Darum frag ich jetzt nochmal:


    Warum ändert man nicht einfach das Template dahingehend ab? Was spricht denn dagegen?

  • Dann müsste man neue Skripte immer über das Template erstellen, statt aus SciTE heraus

    Ein vorhandenes Template könnte man mit LUA automatisch einfügen, wenn eine leere Datei gespeichert wird.


    In dem Template.au3 kann dann überprüft werden, ob die Option "MustDeclareVars" enthalten ist.

  • Zitat

    Ein vorhandenes Template könnte man mit LUA automatisch einfügen, wenn eine leere Datei gespeichert wird.

    Dann brauchte man, genau wie jetzt, ein zusätzliches Lua Skript.

    Da wäre es doch überlegenswert, optional die Informationen, die im Template sind, auch hiermit einfügen zu lassen.


    Ich persönlich habe noch keinen Bedarf gehabt das Template zu nutzen. Wenn ich eine UDF oder ein Programm erstellt habe, schreibe ich zum Abschluss sowieso detaillierte Erklärungen zum Skript. Sinnvoller wäre da (für mich), das Template einzufügen, wenn man fertig ist. Dann kann man automatisiert eine Funktions - und Parameterübersicht einfügen.

    Ist halt alles Geschmackssache - alles ist möglich. ;):thumbup: