Bibliothek im Editor öffnen

  • In AutoIt können wir mit <Alt + I> die Includedatei aus der Zeile, in der der Cursor steht, öffnen.

    Das habe ich nun auch für Lua umgesetzt. Geöffnet werden natürlich nur Bibliotheken *.lua. Sind die Bibliotheken *.dll wird ein Hinweis ausgegeben.

    Die shell.dll ist erforderlich!


    Wir können hier denselben Hotkey nutzen, dann brauchen wir nicht umdenken:

    Code: SciTEUser.properties (command-Nummer bitte anpassen)
    1. # 23 Open Require
    2. command.23.$(file.patterns.lua)=dofile $(Lua.User.Scripts.Path)/open_require.lua
    3. command.name.23.$(file.patterns.lua)=Require Datei Öffnen
    4. command.mode.23.$(file.patterns.lua)=subsystem:lua,savebefore:no
    5. command.is.filter.23.$(file.patterns.lua)=1
    6. command.shortcut.23.$(file.patterns.lua)=Alt+I


    EDIT: v0.1 hatte mögliche Punkte im Bibliotheksnamen nicht berücksichtigt.

    EDIT 15.08.2019:

    Mit den Punkten innerhalb einer require Datei habe ich mich in die Irre treiben lassen. Jetzt ist mir die Bedeutung erst klar geworden:

    Ein Punkt im require (z.B. require alien.core) bedeutet, Öffne die Datei core(dll od. lua, hier dll) im Verzeichnis alien.

    Bei richtiger Definition von package.path & package.cpath kann ich Bibliotheken in Ordnern mit exakt demselben Namen, wie die Datei (ohne Erweiterung), speichern. Das ist bei der Alien-Bibliothek der Fall:

    Ordner: alien

    Dateien: alien.lua / core.dll / struct.dll

    require "alien" bewirkt: Öffne alien.lua

    require "alien.core" bewirkt: Öffne Ordner "alien" und dort die Datei "core"(.dll)


    ..,und weitere Änderung: Da Lua nicht zeilenbasiert ist (mehrere Befehle können hintereinander stehen: require "shell" require "bit"), werden diese Varianten jetzt auch erkannt. Befindet sich der Cursor im Bereich: Vor require bis hinter Bibliothekname wird diese Bibliothek geöffnet. Steht der Cursor irgendwo in der Zeile und eine/mehrere require Aufrufe sind vorhanden wird der erste Aufruf verwendet.


    Dieses Verhalten berücksichtigt die v0.5 jetzt.


    EDIT 16.08.2019:

    Ich habe jetzt noch berücksichtigt, dass bei mehreren require in einer Zeile, diese auch noch mit unterschiedlichen Stringbegrenzern eingefasst sind. Wenn dann der Cursor ausserhalb des require steht soll das erste Vorkommen verwendet werden, was aber nicht zwingend das zuerst gefundene ist, da in zwei Schritten gesucht wird.

    Aktuelle Version v0.6

  • Immer noch nicht ganz...


    tPathes[1] = f:\\AutoIt\\AutoIt3_LuaScripts\alien.core.lua

    tPathes[2] = f:\\AutoIt\\AutoIt3_LuaScripts\alien.core\alien.core.lua

    tPathes[3] = .\alien.core.lua

    tPathes[4] = C:\Program Files (x86)\AutoIt3\SciTE\lua\alien.core.lua

    tPathes[5] = C:\Program Files (x86)\AutoIt3\SciTE\alien.core.lua

    @_REQUIRE_IS_DLL_FILE__CAN'T_OPEN__LINE 3


    Richtig wäre:

    tPathes[1] = f:\\AutoIt\\AutoIt3_LuaScripts\alien\core.lua

  • Richtig wäre:

    tPathes[1] = f:\\AutoIt\\AutoIt3_LuaScripts\alien\core.lua

    Nein, das ist absolut falsch. Regeln für die Registrierung der Dateien:

    REGISTRIERTER_ORDNER\BIBLIOTHEK\BIBLIOTHEK.lua oder

    REGISTRIERTER_ORDNER\BIBLIOTHEK.lua

    Identisch für Dll-Bibliotheken.

    Zitat


    Die Art der Registrierung ermöglicht, dass die Dateien direkt im benannten Pfad gespeichert sind oder in einem Unterordner, der denselben Namen wie die Datei trägt

    Dein Aufruf: require "alien.core" war also schon falsch, weil es diese Bibliothek nicht gibt. Require kann nur den Namen der Bibliothek, aber keinen Pfad enthalten!

    core.lua ist keine require-Datei. Die tatsächlich existierende Datei wäre sowieso die core.dll. Sie wird intern von Alien aufgerufen und ist im Alien-Ordner abgelegt. Erklärung s. hier

    Mit meinem Skript stelle ich aus allen registrierten Pfaden mögliche Dateinamen der Form BIBLIOTHEK.lua zusammen. Dann prüfe ich, ob eine dieser Dateien tatsächlich existiert. Ist das der Fall, ist es eine Lua Datei und wird geöffnet, anderenfalls muss es eine Dll sein und nur eine Info wird in die Konsole ausgegeben.

  • Dein Aufruf: require "alien.core" war also schon falsch, weil es diese Bibliothek nicht gibt.

    Der stammt nicht von mir, sondern steht in der alien.lua drin und weil der Aufruf funktioniert, kann er nicht falsch sein, oder?


    @_REQUIRE_IS_DLL_FILE__CAN'T_OPEN__LINE 3 ist aber wohl die korrekte Antwort, denn mit require "alien.core" wird die core.dll und nicht core.lua aus dem Verzeichnis ..\alien\ geladen.


  • Der stammt nicht von mir, sondern steht in der alien.lua drin und weil der Aufruf funktioniert, kann er nicht falsch sein, oder?

    Laut Regeln für die Verwendung von Require geht das nicht - und tut es auch nicht! Was du geladen hast, ist nicht die core.dll, sondern alien.

    Die core.dll kann in SciTE nicht geladen werden.


    Edit: Ich habe jetzt aber korrigiert, dass require mit Dateiendung erkannt wird.

  • Laut Regeln für die Verwendung von Require geht das nicht - und tut es auch nicht! Was du geladen hast, ist nicht die core.dll, sondern alien.

    Die core.dll kann in SciTE nicht geladen werden.

    Ich habe nichts geladen... das local core = require "alien.core" steht so in der alien.lua drin, die ich mir aus deinem Thread besorgt habe und wie es der Zufall will, habe ich dieses require halt mal mit Alt+I testen wollen.


    Wenn ich dich also recht verstehe, ist das ein Fehler in der alien.lua...

  • Ich habe nichts geladen... das local core = require "alien.core" steht so in der alien.lua drin,

    Ist mir schon klar. Die Zeile local core = require "alien.core" wird in der Verarbeitung von require zu local core = require "alien" eingedampft. Ob der require Befehl in der alien.lua so gewollt oder nur ein Schreibfehler war, ist unklar. Durch das rekursive Laden sollen wohl die Alien-Funktionen im eigenen Modul verfügbar sein (könnte ich mir vorstellen, ist aber nur geraten).

  • Durch das rekursive Laden sollen wohl die Alien-Funktionen im eigenen Modul verfügbar sein (könnte ich mir vorstellen, ist aber nur geraten).

    Ja, das klingt logisch... denn es wird ja core.* verwendet... und ein Schreibfehler kann man nahezu ausschließen, denn das require schlägt fehl, wenn ich "alien" oder "core" weglasse/ändere... es geht nur mit "alien.core".


    Wieder was gelernt...

    5.3 Module

  • Die Zeile local core = require "alien.core" wird in der Verarbeitung von require zu local core = require "alien" eingedampft.

    Das hatte ich wohl falsch interpretiert.

    Wie mir jetzt klar wurde, bedeutet der Punkt schlicht und einfach: "this folder" und gibt an, dass die nachfolgend benannte Datei aus diesem Ordner geladen werden soll. Ist ja auch sinnvoll, da einige Bibliotheken selbst zusätzliche, nur für diesen Zweck gültige, Bibliotheken nachladen, die aber namentlich mit anderen Bibliotheken identisch sind (core, struct). So bleibt ordentlich beisammen, was zusammen gehört.


    Die Funktionsweise habe ich jetzt im Skript im Startpost angepasst. -- Noch ergänzt um Erkennung von Mehrfach-require in einer Zeile.