OrganizeIncludes

  • Moin zusammen,

    ich habe gerade mal mir Organizeincludes angeschaut -> geiles Tool, will ich auch in Delphi und Lazarus haben^^ aber ich schweife ab :D

    Es gibt ja die Option "Remove all includes" bzw. "Remove only unneeded includes".

    Nach ein wenig rum probieren habe ich diese "Funktionen" auch verstanden wie es gemeint ist, jedoch ist mir da eine Kleinigkeit aufgefallen und evtl. ist das auch nur ein Bedienerfehler von mir (oder Wunschdenken^^).

    Wenn ich "Organice Includes" mit den entsprechenden Settings ausführe (oder es auf silent laufen lasse), packt er alle benötigten includes an die gewünschte Stelle (so weit so gut.).

    ABER: Er behält auch alle bereits vorhandenen includes, ich habe sie also ggf. doppelt/mehrfach drin.

    Ich hätte nun gedacht, das er entweder nur fehlende nachträgt oder alle vorhandenen löscht und entsprechend alle benötigten einträgt.

    Denn Laut der Hilfe-Datei soll eben das ja passieren, hab es bei mehreren Dateien ausprobiert.

    Edit: Und er fügt (wenn kein include benötigt wird) eine Leerzeile hinzu.

    Besonderheit: Bei mir stehen die Includes erst nach einem Kommentarblock und Autoit3Wrapper-Anweisungen:

    Das Einfügen nach #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 funktioniert auch 1A.

    Hab ich da irgendeinen Fehler meinerseits drin oder muss ich mich nun im engl. Forum deswegen anmelden um das zu thematisieren?

    Kann man OI auch beim kompilieren drüber laufen lassen anstatt wirklich jedesmal die doch recht üppige Tastenkombination drücken zu müssen, also idealerweise:

    F7 fürs kompilieren -> autom. OI (silent) -> dann autom. erst das kompilieren?

    Und einen "Fehler" habe ich noch gefunden: Er mag keine Umlaute (im Pfad und Dateinamen).

    2 Mal editiert, zuletzt von Moombas (30. April 2020 um 08:43)

  • Zu :

    Opt('MustDeclareVars', 1)

    #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7

    Der Parameter -d steht eigentlich schon für Opt("MustDeclareVars", 1)

    Allerdings verhalten sich die beiden Varianten in Sonderfällen ggf. unterschiedlich. Ich hatte dazu mal was im EN-Forum geschrieben -> hier der Link, falls es Dich interessiert :

    https://www.autoitscript.com/forum/topic/20…tdeclarevars-1/

    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."

    Einmal editiert, zuletzt von Musashi (30. April 2020 um 09:58)

  • Mag sein, gab bisher damit keine Probleme, hat ja aber eigentlich auch nichts mit meinem Problem von OI zu tun:

    - nicht löschen der vorhandenen #includes, obwohl ausgewählt in den Optionen

    - Problem mit Umlauten in Dateiname/Pfad

    Oder?

    Mir ist gerade jedoch etwas eingefallen, was zu dem Problem führen könnte: Ich definiere per Standard das bei mir die AU3 Dateien als UTF8 codiert sind, kann das die Ursache sein?

    • Offizieller Beitrag

    Problem mit Umlauten in Dateiname/Pfad

    Pfui! Wer verwendet denn Umlaute in den Pfaden. :D

    Der Autor des Tools ist nicht mehr in AutoIt aktiv. Mich hat es bisher nie gestört, weil ich die Includes nie einfügen lasse, sondern aus der Konsole ins Skript kopiere.

    Wenn ich mal Muße habe, werde ich mein in Lua angefangenes IncludeManagement mal fertigstellen. Aber da gab es noch einige Baustellen.

    EDIT:

    Zitat

    Ich definiere per Standard das bei mir die AU3 Dateien als UTF8 codiert

    Na, das ist ja (seit vorletzter Version?) Standard, also nicht UTF8, sondern UTF8wBOM. Da OI vor dieser Zeit erstellt wurde, kann das ein Grund sein.

  • Pfui! Wer verwendet denn Umlaute in den Pfaden. :D

    Wer mit Begriffen wie "Begründungsschlüssel" arbeiten muss, da kann das schon mal vor kommen^^

    Na, das ist ja (seit vorletzter Version?) Standard, also nicht UTF8, sondern UTF8wBOM. Da OI vor dieser Zeit erstellt wurde, kann das ein Grund sein.

    Leider muss ich explizit UTF8 verwenden, hängt mit der Nacharbeitung der Skripte in Lazarus zusammen.

    Es war einfacher Scite auf UTF8 umzustellen als in Lazarus das an jeder einzelnen Stelle einzuhämmern das einzulesende anders zu interpretieren...

  • Bitnugger 1. Mai 2020 um 04:56

    Hat den Titel des Themas von „OrganiceIncludes“ zu „OrganizeIncludes“ geändert.
  • Kann man OI auch beim kompilieren drüber laufen lassen anstatt wirklich jedesmal die doch recht üppige Tastenkombination drücken zu müssen, also idealerweise:

    F7 fürs kompilieren -> autom. OI (silent) -> dann autom. erst das kompilieren?

    Ja, das geht, aber es wäre extrem kontraproduktiv. Wieso änderst du nicht einfach die Tastenkombination in der SciTEUser.properties z.B. auf Ctrl + Enter?

    command.shortcut.45.*.au3=Ctrl+Shift+Alt+I

    command.shortcut.45.*.au3=Ctrl+Enter

    ABER: Er behält auch alle bereits vorhandenen includes, ich habe sie also ggf. doppelt/mehrfach drin.

    Das ist mir auch schon vor einiger Zeit aufgefallen... da ich OrganizeIncludes jedoch nur alle 7 Pfingsten benutze, war es mir egal.

    Heute habe ich nun doch mal einen Blick in OrganizeIncludes riskiert... und ich denke es liegt an dem ersten RegEx-Pattern in der Funktion _deleteIncludes.

    Ich habe ein kleines Test-Script erstellt und das Pattern darin korrigiert - und so scheint es nun zu funktionieren:

    Test.au3

    Und einen "Fehler" habe ich noch gefunden: Er mag keine Umlaute (im Pfad und Dateinamen).

    Was macht Er dann? Verzieht Er dann sein Gesicht und schmollt vor sich hin, oder was?8o

    Nein, Quatsch beiseite... das liegt an der Funktion _getSource.

    Dort muss folgende Zeile geändert...

    $SciTECmd = StringReplace($SciTECmd, '\\', '\')

    $SciTECmd = _WinAPI_MultiByteToWideChar(StringReplace($SciTECmd, '\\', '\'), 65001, 0, True)

    ...und ein Include für _WinAPI_MultiByteToWideChar an den Anfang des Scripts eingefügt werden...

    #include <WinAPIConv.au3> ; bzw. #include <WinAPI.au3>

    Dann wäre noch der Fehler mit der Leerzeile... das liegt an der Funktion _insertIncludes.

    Dort muss folgende Zeile...

    If FileWrite($hfile, $includes & @CRLF & $original_source) <> 1 Then

    ...durch diese ersetzt werden:

    If $includes <> '' Then $includes &= @CRLF 

    If FileWrite($hfile, $includes & $original_source) <> 1 Then 

    Im Anhang findest du eine korrigierte Version von OrganizeIncludes... ich habe den Dateinamen so belassen, weil ich sonst an einigen Stellen/PCs schrauben müsste.

    Edit: Habe noch eine Zeile in dem Archiv korrigiert:

    SendSciTE_Command('output:+> "Organize Includes" for AutoIt3 | ' & $scriptVersion & ' | ' & Chr(169) & ' Th.Meger' & Chr(153) & ' | ' & $date)

    SendSciTE_Command(_WinAPI_WideCharToMultiByte('output:+> "Organize Includes" for AutoIt3 | ' & $scriptVersion & ' | ' & Chr(169) & ' Th.Meger' & Chr(153) & ' | ' & $date, 65001))

    Edit: 04.05.2020 - Ausgaben in der SciTE-Output-Pane werden nun auch korrekt dargestellt (wenn in SciTE das IN/OUT-Encoding auf UTF-8 umgestellt wurde).

    • Offizieller Beitrag

    Was mir an OI nicht so gefiel, dass zu viel unnötige Includes eingefügt werden, da nicht rekursiv in den Includes gesucht wird. Z.B. sind mit GDIPlus automatisch auch WinAPI Funktionen über das dortige Include enthalten und brauchen im Hauptskript nicht erneut aufgeführt werden.

    Die rekursive Ermittlung ist aber recht tricky. Da habe ich noch an einem zeitoptimierten Algorithmus gebastelt in der Lua Version.

    Habe es jetzt mal auf den oberen Teil meiner ToDoList gesetzt.

  • Was mir an OI nicht so gefiel, dass zu viel unnötige Includes eingefügt werden, da nicht rekursiv in den Includes gesucht wird.

    Stimmt, da liefert der IncludesHelper in vielen Fällen bessere Ergebnisse, doch der hat auch so seine Tücken, wobei der (gefühlt) auch deutlich schneller als OI ist.

    Die rekursive Ermittlung ist aber recht tricky.

    In der Tat... der einzige Grund, warum ich das Thema nicht schon längst mal angegangen bin. 8o

  • Bitnugger: Danke für deine Mühe schon mal. Getestet habe ich nun deine Version:

    - Umlaute: :thumbup:

    - bestehende Includes löschen: :thumbup:

    Den Shortcut hatte ich noch nicht geändert, da ich nicht zu oft daran Hand anlegen wollte, wenn es halt eine Lösung zur autom. Ausführung vor dem Kompilieren gegeben hätte. Und warum wäre das kontraproduktiv? Bisher hat er alle (selbst "nicht Standard") includes gefunden und eingebunden.

  • Danke für deine Mühe schon mal. Getestet habe ich nun deine Version:

    - Umlaute: :thumbup:

    - bestehende Includes löschen: :thumbup:

    Ich habe noch ein paar Änderungen an OrganizeIncludes gemacht, so dass jetzt auch die Ausgaben in der SciTE-Output-Pane korrekt dargestellt werden. Desweiteren werde ich mich mal dransetzen und versuchen, eine rekursive Ermittlung der Includes einzubauen, bzw. diese zu optimieren, insofern sie bereits vorhanden ist. Die aktuelle Version findet ihr immer in Post #7.

    Den Shortcut hatte ich noch nicht geändert, da ich nicht zu oft daran Hand anlegen wollte, wenn es halt eine Lösung zur autom. Ausführung vor dem Kompilieren gegeben hätte. Und warum wäre das kontraproduktiv? Bisher hat er alle (selbst "nicht Standard") includes gefunden und eingebunden.

    Ja, das geht, aber es wäre extrem kontraproduktiv. Wieso änderst du nicht einfach die Tastenkombination in der SciTEUser.properties z.B. auf Ctrl + Enter?

    command.shortcut.45.*.au3=Ctrl+Shift+Alt+I

    command.shortcut.45.*.au3=Ctrl+Enter

    Den Shortcut musst du nur einmalig ändern - es kann also keine Rede von "zu oft daran Hand anlegen" sein.

    Die automatische Ausführung von OrganizeIncludes ist extrem kontraproduktiv, weil es dann ja bei jedem Kommpiliervorgang ausgeführt wird, auch wenn in dem Script nur marginale Änderungen vorgenommen wurden, z.B.wenn du lediglich einen Text korrigiert hast, wodurch sich an den benötigten Includes ja garantiert nichts ändert.

    Wenn du es dennoch machen willst, dann füge einfach folgende Zeilen an den Anfang deines Script ein:

    AutoIt
    ;~ Achtung: Pfade anpassen!!!
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Run_Before=""c:\Program Files (x86)\AutoIt3\AutoIt3.exe" "f:\AutoIt\AutoIt3_Tools\OrganizeIncludes\OI_1.0.0.50.au3" "%in%""
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

    Im AutoItWrapper (die auszuführende Zeile kannst du alternativ auch dort eintragen) sieht das dann so aus:

    In diesem Bild kann man übrigens sehen, dass OrganizeIncludes die includes nicht wirklich optimal hinzufügt...

    ...da in diesem Fall tatsächlich nur zwei includes benötigt werden... und zwar diese:

    #include <Debug.au3> 

    #include <File.au3>

    #include <Array.au3>, #include <FileConstants.au3> und #include <StringConstants.au3> werden bereits durch #include <File.au3> hinzugefügt und sind somit doppelt gemoppelt! Das produziert zwar keinen Fehler, weil das #include-once in den jeweiligen Includes dafür sorgt, dass diese nur einmalig hinzugefügt werden - es ist aber nichtsdestrotrotz unnötig.

  • Den Shortcut musst du nur einmalig ändern - es kann also keine Rede von "zu oft daran Hand anlegen" sein.

    Jaein^^ ich wollte da keine Hand anlegen (um es erst mal einfacher zu haben) und dann später nochmal ändern weil man das ggf. für die Durchführung vor der Kompilierung ggf. benötigt.

    Die Wrapper-Methode kommt leider nicht in Frage, da auch noch andere mit den Skripten arbeiten und die Pfade dann nicht mehr passen würden.

    Habe nun den Shortcut auf Alt+F7 geleget, so dass ich schnell beides nacheinander drüber laufen lassen kann und gut ist. ;)