ManageIncludes - Includeorganisation in SciTE mit Lua-Skript

    • Offizieller Beitrag

    Hi,
    ich hatte ja schon mein 'Osterei' für euch angekündigt:
    hier nun mein erstes größeres Projekt mit Lua: ManageIncludes

    Sicher kennt ihr OrganizeIncludes von Xenobiologist. Damit lassen sich die Includes für das aktuelle Skript in SciTE ermitteln und einfügen.
    Das tut auch mein Lua-Skript. Mit einem wesentlichen Unterschied:
    Lua ist deutlich schneller als AutoIt. Selbst für ein 20.000 Zeilen-Skript habe ich unter einer Sekunde beim Testen benötigt.
    Weiterhin ermittele ich die rekursiv eingebundenen Includes (Includes aus den Includes aus den Includes...), was zu einer Reduzierung der Includes im Skript führt.
    Beim erstmaligen Start des Skripts werden Dateien erstellt mit Zusammenstellung von Funktionen und Konstanten der existierenden Includes (Prod, sofern installiert Beta, wenn in den properties angegeben: User-Includes). Das dauert etwas länger, je nach Rechner bis zu 6..8 Sekunden.Die Dateien liegen alle im Ordner: "..SciTE\Lua\MILua\". Ab jetzt könnt ihr beim Installen/Updaten das Verzeichnis selbst wählen. Vorgabe bei Auswahl ist @AppData.
    Wenn ihr Veränderungen bei Prod/Beta/User-Includes habt, einfach die Dateien in diesem Ordner löschen. Beim nächsten Skriptaufruf wird, wie beim ersten mal, alles neu erstellt. Ein Auto-Updater ist in Arbeit.
    Eine genaue Beschreibung des Skriptes findet ihr auch im Skriptheader.
    Nebenbei bekommt ihr noch in die Konsole ausgegeben:
    - alle deklarierten Funktionen
    - verwendete Konstanten und Funktionen mit zugehörigem Include
    - Includes im Skript
    - Erforderliche Includes für das Skript
    - Includes, die per Rekursion eingebunden sind
    - Nicht benötigte Includes
    - Fehlende Includes

    Die Includes werden nach folgender Priorität eingefügt (ist ein Punkt nicht zutreffend greift der nächste):
    1. Eintrag an Position nach String der in den properties hinterlegt ist (s. Installations-Info)
    2. Eintrag an der Position des ersten gefundenen Includes
    3. Eintrag nach letzter Kompilerdirektive (#AutoIt3Wrapper..)
    4. Eintrag am Skriptanfang

    Wichtig: Schreibt bitte keine Includes in Zeile 1! gefixed


    ----------------------------------------------------------------------------------------------------------------------------------
    -- Installation oder Update
    --
    -- "ManageIncludes.lua" und "shell.dll" zusammen mit Installationsskript "Install_ManageIncludes.au3" in einen Ordner packen
    -- "Install_ManageIncludes.au3" ausführen
    -- Bereits vorhandene Installationsdaten werden übernommen und können konfiguriert werden
    -- Keinerlei Einträge von Hand erforderlich
    ----------------------------------------------------------------------------------------------------------------------------------

    Ich habe das Skript mehrfach um- und ausgebaut (was ihr auch an der hohen Versionsnr. seht). Da kann sich durchaus auch mal ein Fehler eingeschlichen haben.
    Sollte das Skript also mal mit einem Fehler abbrechen, bitte mir die Fehlermeldung posten. Eigentlich sollte maximal ein nicht abgefangener 'nil'-Wert so etwas verursachen.
    Also testet fleißig und gebt mir Rückmeldung.

    Das Skript poste ich dieses mal nicht (> 800 Zeilen). Es ist zusammen mit der shell.dll im Anhang.

    Edit 09.04.2012
    Da hatte sich noch ein Kopierfehler eingeschlichen für den propertie-Eintrag der Stringdefinition (s. Durchgestrichenes in Installationsanleitung).

    Edit 09.04.2012 #2
    - Habe noch einen Bug entdeckt, wenn kein Include im Skript - gefixt.
    - Etwas Codekosmetik durchgeführt.
    Das Pfadproblem ist etwas tricky und wird noch dauern.
    Aktuelle Version: v0.13

    Edit 10.04.2012
    Das Skript ist noch nicht optimal, ein paar Fehler habe ich beseitigt.
    Neu: Installationsprogramm, auch um bereits vorhandene Version upzudaten. Bereits verwendete Einstellungen werden erkannt und übernommen.
    Install_MI.zip enthält den Ordner mit Install_ManageIncludes.au3, ManageIncludes[v0.14].lua und shell.dll
    Einfach die .au3 aus dem Ordner heraus ausführen, sowohl bei Erstinstallation, als auch bei Update.
    Aktuelle Version: v0.14

    Grr, jetzt hatte ich vergessen das Installationsskript mit zu packen. :wacko:
    Jetzt separat im Anhang
    Nun mit verpackt.
    Im Installer war noch ein kleiner Fehler beim Lesen des Include-Types. Aber jetzt paßt es.

    Noch mal aktualisiert
    - Installer hatte alte ManageInclude.lua nicht überschrieben
    - jetzt werden Includes (wenn keine andere Eigenschaften festgelegt sind) in die erste Zeile geschrieben

    Und ein weiteres Fehlerchen gefixed.
    Aktuelle Version: v0.16

    Und noch eine Korrektur.
    Aktuelle Version: v0.17

    ==== ToDo ====
    Da ich die Include-angaben immer streng trenne (aus Prod-/Beta-/Userverzeichnis eingefaßt in < >, andere Includes mit absolutem Pfad in Quotierung), hatte ich bisher nicht berücksichtigt, dass z.B. Pfade im aktuellen Skriptordner nur mit Angabe des Dateinamens möglich sind. Ebenso ist die Verwendung von Quotierung oder < > variabler als mir lieb ist. :whistling:
    Diese Fälle werden also im Moment noch nicht berücksichtigt, hierfür werde ich noch eine Pfadauflösung implementieren.
    ==============

    DL bisher: 30

  • Super Arbeit :thumbup:
    Habe sehr lange OrganizeIncludes von Xeno benutzt.
    Bin dann vor einem Jahr auf "IncludesHelper" aus dem englischen Forum gestoßen.
    Ist etwas besser als OI.
    Einzig das einlesen der includes dauert sehr lange wenn sich daran was geändert hat.

    Deshalb habe ich deine Version mal getestet. (V0.13)
    Teilweise fehlt ein Include.
    Ich hoffe ich habe alle Datei korrekt geändert.
    Ich habe alles durchgeführt außer den Abschnitt "Soll hinter einem bestimmten Textstring eingefügt werden ..."
    Du kannst die Beispiele bei dir mal gegentesten :rolleyes:

    Bsp 1:

    Spoiler anzeigen
    [autoit]


    $Debug_LV = False ; Prüft den Klassennamen (ClassName), der an die ListView-Funktion übergeben wird. Setze dies versuchsweise auf True und verwende dann ein Handle zu einem anderen Control, um die Funktionsweise zu verstehen.

    [/autoit] [autoit][/autoit] [autoit]

    Example_UDF_Created()

    [/autoit] [autoit][/autoit] [autoit]

    Func Example_UDF_Created()
    Local $GUI, $hImage, $aImage, $hListView

    [/autoit] [autoit][/autoit] [autoit]

    $GUI = GUICreate("ListView: Setzt das Hintergrundbild (UDF)", 600, 550)
    ;=========================================================================================================
    $hListView = _GUICtrlListView_Create($GUI, "", 2, 2, 596, 500, -1, -1, True) ; Der letzte Parameter führt zum Aufruf von CoInitializeEx
    ;=========================================================================================================
    _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))

    [/autoit] [autoit][/autoit] [autoit]

    ; Lädt die Bilder
    $hImage = _GUIImageList_Create()
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
    _GUICtrlListView_SetImageList($hListView, $hImage, 1)

    [/autoit] [autoit][/autoit] [autoit]

    ; Fügt die Spalten hinzu
    _GUICtrlListView_InsertColumn($hListView, 0, "Spalte 1", 120)
    _GUICtrlListView_InsertColumn($hListView, 1, "Spalte 2", 120)
    _GUICtrlListView_InsertColumn($hListView, 2, "Spalte 3", 120)

    [/autoit] [autoit][/autoit] [autoit]

    ; Fügt die Items hinzu
    _GUICtrlListView_AddItem($hListView, "Zeile 1: Spalte 1", 0)
    _GUICtrlListView_AddSubItem($hListView, 0, "Zeile 1: Spalte 2", 1)
    _GUICtrlListView_AddSubItem($hListView, 0, "Zeile 1: Spalte 3", 2)
    _GUICtrlListView_AddItem($hListView, "Zeile 2: Spalte 1", 1)
    _GUICtrlListView_AddSubItem($hListView, 1, "Zeile 2: Spalte 2", 1)
    _GUICtrlListView_AddItem($hListView, "Zeile 3: Spalte 1", 2)

    [/autoit] [autoit][/autoit] [autoit]

    ; Bildet Gruppen
    _GUICtrlListView_EnableGroupView($hListView)
    _GUICtrlListView_InsertGroup($hListView, -1, 1, "Gruppe 1")
    _GUICtrlListView_InsertGroup($hListView, -1, 2, "Gruppe 2")
    _GUICtrlListView_SetItemGroupID($hListView, 0, 1)
    _GUICtrlListView_SetItemGroupID($hListView, 1, 2)
    _GUICtrlListView_SetItemGroupID($hListView, 2, 2)

    [/autoit] [autoit][/autoit] [autoit]

    ; Lädt ein Bild herunter
    Local $sURL = "http://www.autoitscript.com/autoit3/files/graphics/autoit9_wall_grey_800x600.jpg"
    Local $sFilePath = @ScriptDir & "\AutoIt.jpg"
    InetGet($sURL, $sFilePath)

    [/autoit] [autoit][/autoit] [autoit]

    ; Setzt das Hintergrundbild
    _GUICtrlListView_SetBkImage($hListView, $sFilePath)
    $aImage = _GUICtrlListView_GetBkImage($hListView)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    MsgBox(4160, "Information", "Hintergrundbild: " & @CRLF & $aImage[1])

    [/autoit] [autoit][/autoit] [autoit]

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    ;=========================================================================================================
    DllCall('ole32.dll', 'long', 'CoUinitialize') ; Muss für jeden Aufruf von CoInitializeEx ausgeführt werden
    ;=========================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    GUIDelete()
    FileDelete($sFilePath)
    EndFunc ;==>Example_UDF_Created

    [/autoit]


    Es werden nur folgende Includes eingetragen

    Spoiler anzeigen
    [autoit]

    #Include <GUIConstantsEx.au3>
    #Include <ListViewConstants.au3>

    [/autoit]

    Richtig wäre jedoch

    Spoiler anzeigen
    [autoit]

    #Include <GuiListView.au3>
    #Include <GuiImageList.au3>
    #Include <GUIConstantsEx.au3>

    [/autoit]

    Bsp 2:

    Spoiler anzeigen
    [autoit]

    Dim $a[10]
    _ArrayDisplay($a)

    [/autoit]


    Hier wird gar kein Include eingetragen

    Richitg wäre eigentlich

    Spoiler anzeigen
    [autoit]

    #Include <Array.au3>

    [/autoit]

    Verbesserungen:
    1. Wenn ich die Tastenkombination erneut drücke verschwinden die Zeilen mit dem include wieder. Ist dies so gewollt :?:
    2. Du hast geschrieben, dass man bei Änderung der includes die Datei löschen soll, damit diese neu angelegt werden kann. Geht dies nicht automatisch? Beim IncludesHelper geht dies. Ich denke es wird einfach das Änderungsdatum geprüft und dann nach bedarf die Datei automatisch neu erzeugt.
    3. Könntest du bei deiner Anleitung noch ergänzen in welchen Ordner die Datei liegen die geändert werden müssen. Sonst ist das immer so eine Sucherei.

    • Offizieller Beitrag

    Wenn ich die Tastenkombination erneut drücke verschwinden die Zeilen mit dem include wieder. Ist dies so gewollt :?:

    Konnte ich noch nicht reproduzieren.

    dass man bei Änderung der includes die Datei löschen soll, damit diese neu angelegt werden kann. Geht dies nicht automatisch?

    Da muss ich mal testen, wie der Zeitaufwand ist. Vermutlich erheblich, insofern eine nicht sehr optimale Variante.

    in welchen Ordner die Datei liegen die geändert werden müssen.

    Die Dateien liegen alle im Ordner: "..SciTE\Lua\MILua\"

    Die Bsp. werde ich mal testen, Danke schon mal fürs Probieren.

  • Hi,
    ich vermute mal, dass nicht wenige von der "Installation" abgeschreckt werden!
    Ein Installer würde das Procedere wesentlich vereinfachen....

    • Offizieller Beitrag

    Ein Installer würde das Procedere wesentlich vereinfachen....


    OK, werde ich noch erstellen.

    Tweaky:
    Habe jetzt auch die Ursache für die von dir ermittelten Fehler gefunden und beseitigt. Ich probiere mal noch die Pfadgeschichte hinzubekommen und aktualisiere dann (mit Installer).

  • So, nachdem ich mich durch die Installation geschlagen habe ^^ muss ich sagen: Tolles Ostergeschenk und wieder mal ein LUA Script von dir, welches ich dauerhaft nutzen werde. Dankeschön :)

    Ein bisschen blöd finde ich aber die Sache mit den Includes in Zeile 1. Naja, vl. findest du ja noch eine Lösung.

  • Hi, du solltest bei der Include-Suche noch die Reihenfolge der Suchpfade beachten ;) Bei Anführungszeichen wird zuerst im Skriptverzeichnis, dann in den User-Verzeichnissen und zueltzt im Includeverzeichnis gesucht, bei Klammern umgekehrt.

    PS: Brauchst du eine FileGetTime-Funktion für LUA? Ich hätte eine mit alien und Windows-API ;)
    PPS: Kannst du MILua nicht nach @AppData schreiben? Ins SciTE-Verzeichnis ist bei Windows-7 nicht so prickelnd.

    • Offizieller Beitrag

    Hi, du solltest bei der Include-Suche noch die Reihenfolge der Suchpfade beachten ;) Bei Anführungszeichen wird zuerst im Skriptverzeichnis, dann in den User-Verzeichnissen und zueltzt im Includeverzeichnis gesucht, bei Klammern umgekehrt.

    Ja, das ist das, was ich mit der Pfadvielfalt meinte. Da bin ich noch am Suchen, wie ich das am elegantesten einbaue.

    PS: Brauchst du eine FileGetTime-Funktion für LUA? Ich hätte eine mit alien und Windows-API

    Ich habe auch einige Bibliotheken, die ich per Alien nutzen könnte - aber ich habe es noch nicht geschafft Alien mit dem Lua zu nutzen, dass im SciTE integriert ist. Bei mir klappt dass nur, wenn ich auf meine externe Lua-Installation verweise. Insofern für allgemeine Verwendung wenig nützlich.

    PPS: Kannst du MILua nicht nach @AppData schreiben? Ins SciTE-Verzeichnis ist bei Windows-7 nicht so prickelnd.

    Macht bei mir keine Probleme. Aber wenn das z.Teil Probleme bereitet, soll es daran nicht scheitern.

    Ich erstelle gerade das Installationsskript, inkl. rudimentärem HotKey-Generator. Werde ich hoffentlich noch heute Nacht fertig bekommen. :D
    Aber die Anpassungen mit den Pfaden werden noch etwas dauern.

  • Macht bei mir keine Probleme. Aber wenn das z.Teil Probleme bereitet, soll es daran nicht scheitern.


    Macht eben Probleme, wenn man UAC an hat, kein Admin ist und AutoIt in C:\Programme liegt. Eventuell per Option in der Scite.properties? z.B. mode.portable = 0 | 1

    Zitat

    aber ich habe es noch nicht geschafft Alien mit dem Lua zu nutzen, dass im SciTE integriert ist.


    Passende DLLs hab ich bereitgestellt.

    Zitat

    Da bin ich noch am Suchen, wie ich das am elegantesten einbaue.


    Wenn du das Hauptscript ließt, musst du zu jedem Include den Includetyp mitspeichern und beibehalten.
    Dann zur Suche: Standard ist <>. Falls Datei im Userinclude gefunden wird, dann "" falls Datei mit gleichem Namen und falschem Inhalt im Standardincludeverzeichnis. Falls Include im Skriptverzeichnis, dann immer "".

  • Hab die 0.14 getestet.

    Der Installer funktioniert soweit.
    Allerdings wird die "ManageIncludes.lua" nicht überschrieben wenn sie bereits existiert.
    Wäre es nicht sinnvoller die Datei die in "...\AppData\Roaming" geschrieben werden in ein Unterordner zu packen, damit man die Dateien später besser zuordnen kann?

    Die Includes werden immer in die 3. Zeile geschrieben auch wenn in der ersten Zeile Code steht. Ist dies so gewollt?

    Die Beispiele die ich gepostet habe funktionieren nun :thumbup:

    Dieser Fehler existiert noch:
    Wenn ich die Tastenkombination erneut drücke verschwinden die Zeilen mit dem include wieder.
    Ich poste es nur noch einmal, da ich nicht weiß ob du schon versucht hast ihn zu beheben ;)

    Sonst passts :thumbup:

    • Offizieller Beitrag

    Allerdings wird die "ManageIncludes.lua" nicht überschrieben wenn sie bereits existiert.

    Da hatte ich das Überschreib-Flag vergessen - gefixed.

    Wäre es nicht sinnvoller die Datei die in "...\AppData\Roaming" geschrieben werden in ein Unterordner zu packen, damit man die Dateien später besser zuordnen kann?

    Ich lasse den FileSelectFolder-Dialog mit dem Button "Neuer Ordner" anzeigen, damit das jeder nach eigenem Geschmack handhaben kann. Natürlich ist ein Unterordner sinnvoll. Ich mag es immer lieber, wenn ich dann selbst festlegen kann wie was heißt. ;)

    Die Includes werden immer in die 3. Zeile geschrieben auch wenn in der ersten Zeile Code steht. Ist dies so gewollt?

    Ist jetzt auch gefixed.

    Wenn ich die Tastenkombination erneut drücke verschwinden die Zeilen mit dem include wieder.
    Ich poste es nur noch einmal, da ich nicht weiß ob du schon versucht hast ihn zu beheben

    Diesen Fehler konnte ich noch nicht nachbilden.
    Beschreib mal genau:
    Passiert das bei allen Skripten? Welches OS hast du?
    Bei mir, Win7 Pro 64 passiert das nicht.

  • Alle Fehler die du als fixed beschrieben hast, sind gefixt :thumbup:

    Zwecks dem Fehler mit dem löschen:
    Bsp:

    Spoiler anzeigen
    [autoit]

    Dim $a[10]
    _ArrayDisplay($a)

    [/autoit]


    Durch den Tool lautet das Bsp:

    Spoiler anzeigen
    [autoit]

    #Include <Array.au3>
    Dim $a[10]
    _ArrayDisplay($a)

    [/autoit]


    In der Console steht

    Spoiler anzeigen


    Wieder starte ich dein Tool:

    Spoiler anzeigen
    [autoit]

    Dim $a[10]
    _ArrayDisplay($a)

    [/autoit]


    In der Console steht

    Spoiler anzeigen

    Ich habe Win 7 pro 64bit SP1.
    Ja es appiert bei jedem Skript.

  • In dem 3. Spoiler von Tweaky steht übrigens

    Zitat

    insert Includes at fisrt line

    statt

    Zitat

    insert Includes at first line

    Aber ich denke sowas ist eher nebensächlich.

    MfG, James

    • Offizieller Beitrag

    Oh, wie peinlich, ein Array-Fehler. :rofl:
    OK, das ist behoben. Aber da läuft nochwas nicht ganz rund. Wenn keine Includes vorhanden sind, arbeitet das Skript, soweit ich das sehe, fehlerfrei. Aber bei bereits vorhandenen Includes paßt es nicht immer.
    Aber ich hoffe, das werde ich noch alles beheben.
    Eure Unterstützung beim Fehler finden hilft da sehr. :thumbup: