Lua - Grundkenntnisse

  • Da ich den Beitrag schon erstellt und die Forensoftware hat ihn gelöscht hatte, versuche ich nun aus dem Gedächtnis zu rekonstruieren.


    Im Thread FAQ - SciTE Editor ging es darum "Wie kann man in SciTE4AutoIt3 eine weitere Hilfedatei einbinden, z.B. für Lua?". Im Posting #48 hat BugFix eine Antwort geschrieben und nützliche Dateien angehängt.


    Lua.User.Scripts.Path ist eine Property, die vorher definiert werden muss, z.B. Lua.User.Scripts.Path=C:\Code\Lua


    Leider kriege ich es nicht hin, dass Lua den Pfad zu meinen eigenen Scripts findet. Ich habe die Ordnerstruktur auf meiner Festplatte genau so eingerichtet, wie du sie bei dir hast. "C:\Code\Lua\..." Den Code habe ich genauso wie in deinem Beitrag beschrieben von der Forenwebseite in meine Dateien kopiert. Leider erscheint beim Drücken von F1 eine Fehlermeldung:


    Das verwirrt mich total, weil der Pfad von der MsgBox in meinen Scripts nirgends vorkommt.


    Das gleiche Problem gibt es generell, wenn Lua eine Datei aus "C:\Code\Lua\..." benutzen soll. Beispiel: In einem Script "MeinModul.lua" habe ich eine Funktion "foo":

    Code: MeinModul.lua
    function foo()
    print("Hello World!")
    end


    In der "SciTEStartup.lua" rufe ich die Funktion auf mit:

    Code: SciTEStartup.lua
    require "MeinModul"
    foo()


    Wenn ich nun MeinModul.lua im gleichen Ordner habe wie die SciTEStartup.lua und die die SciTEStartup.lua öffne, wird die MeinModul.lua natürlich gefunden und schreibt "Hello World" in die SciTE Console. Wenn ich aber irgendeine andere Datei mit SciTE öffne, gibts folgende Fehlermeldungen:

    Das gleiche Spiel, wenn ich die MeinModul.lua in den Ordner "C:\Code\Lua\..." verschiebe, nur dass sie dann auch von der SciTEStartup.lua nicht mehr gefunden wird. Auch einen kompletten Pfad habe ich probiert:

    Code
    require "C:\\Code\\Lua\\MeinModul"
    foo()


    Scheinbar muss Lua mitgeteilt werden, dass es in "C:\Code\Lua\" suchen soll. Wie macht man das?

  • Leider kriege ich es nicht hin, dass Lua den Pfad zu meinen eigenen Scripts findet.

    Hast du in deiner SciTEUser.properties das genau so eingetragen: Lua.User.Scripts.Path=C:\Code\Lua ?


    Deine gepostete Fehlermeldung verweist auf eine "..SciTEDoc.html" - was ist das für eine Datei?


    Wenn du etwas in der Startup-Datei laden willst, musst du die Pfade bekannt machen. Wie das geht habe ich detailliert beschrieben. Du musst in der Startupdatei die Propertie auslesen und dem package.path hinzufügen. Wie gesagt, steht genau beschrieben im verlinkten Post.

  • Hast du in deiner SciTEUser.properties das genau so eingetragen: Lua.User.Scripts.Path=C:\Code\Lua ?

    Habs gerade erneut kontrolliert und es ist genauso eingetragen. Es steht als aller erstes in der SciTEUser.properties (nach dem "# END => DO NOT CHANGE ANYTHING BEFORE THIS LINE #-#-#-#-#-#" Hinweis, der wahrscheinlich nur ein Überbleibsel aus Urzeiten ist!?)


    Deine gepostete Fehlermeldung verweist auf eine "..SciTEDoc.html" - was ist das für eine Datei?

    Ich hab keine Ahnung. :( Siehe:

    Das verwirrt mich total, weil der Pfad von der MsgBox in meinen Scripts nirgends vorkommt.


    Wenn du etwas in der Startup-Datei laden willst, musst du die Pfade bekannt machen. Wie das geht habe ich detailliert beschrieben.

    Das werde ich mir zu Gemüte führen und einrichten.



    OffTopic Deine Hilfe ist von unschätzbarem Wert. Kannst du deine beiden Beiträge im Startpost von "FAQ - SciTE Editor" aufnehmen? (Nützt bestimmt dem ein oder anderen.)

  • dass ab und an (habe vergessen warum) trotzdem nach der SciTEDoc.html gefragt wird, ist wohl ein Bug.

    Könnte so sein, denn es ist schon seltsam dass die SciTEDoc.html in der Fehler-MsgBox genannt wird, weil ich sie (wissentlich) nirgends aufgerufen habe. Vielleicht komme ich heute Abend dazu, mich mehr mit den SciTE und Lua Sachen auseinander zu setzen und die Infos von BugFix zu verarbeiten.

  • Könnte so sein, denn es ist schon seltsam dass die SciTEDoc.html in der Fehler-MsgBox genannt wird, weil ich sie (wissentlich) nirgends aufgerufen habe.

    Mit F1 hast du sie aufgerufen... der Dateiname SciTEDoc.html ist in der SciTE.exe enthalten und wird auch im selben Pfad gesucht, aus der die SciTE.exe gestartet wurde - wobei in der MsBox hinter file: ein / zu wenig steht.

    Bsp.:

    c:\Program Files (x86)\AutoIt3\SciTE\SciTE.exe

    file:///c:\Program Files (x86)\AutoIt3\SciTE/SciTEDoc.html

  • Habe gerade SciTE4AutoIt3 komplett neu installiert.

    Danach die "C:\Program Files (x86)\AutoIt3\SciTE\lua\SciTEStartup.lua" kopiert nach "C:\Users\User1\AppData\Local\AutoIt v3\SciTE\SciTEStartup.lua".


    In der "C:\Users\User1\AppData\Local\AutoIt v3\SciTE\SciTEStartup.lua" ganz am Schluss print("hallo") hinzugefügt.

    Code
    ...
    -- Start up the events (Calls OnStartup()).
    EventClass:BeginEvents()
    print("hallo")


    SciTEStartup.lua gespeichert => nichts passiert, die SciTE Console öffnet sich NICHT und es wird nicht "hallo" hineingeschrieben.

    SciTEStartup.lua geschlossen und dann SciTE geöffnet => nichts passiert.


    Muss ich sonst noch etwas machen, damit Code aus der SciTEStartup.lua ausgeführt wird? Habe ich was falsch gemacht? Blicke gerade nicht durch.


    Ich muss jetzt weg, bin erst abends zurück. Hoffentlich weiß jemand, was ich übersehen habe.

  • Muss ich sonst noch etwas machen, damit Code aus der SciTEStartup.lua ausgeführt wird?

    Ja, du musst SciTE mitteilen, dass es nicht die vordefinierte, sondern die angegebene SciTEStartup.lua benutzen soll. Das machst du in der SciTEUser.properties mit folgendem Eintrag:

    #~ Lua script that will be loaded when SciTE starts to set up the global state for Lua.

    ext.lua.startup.script=$(SciteUserHome)\SciTEStartup.lua


    Worauf du auch achten solltest:

    ext.lua.auto.reload

    ext.lua.reset

    extension.filepattern


    PS: In der SciTE4AutoIt3.chm sind teils andere Werte als Default angegeben, wie in der SciTEGlobal.properties tatsächlich verwendet werden!

    Z.B.:

    ext.lua.reset=0 ; SciTE4AutoIt3.chm

    ext.lua.reset=1 ; SciTEGlobal.properties

  • Besser! :)


    Ich habe die "C:\Program Files (x86)\AutoIt3\SciTE\SciTEUser.properties"

    kopiert nach "C:\Users\User1\AppData\Local\AutoIt v3\SciTE\SciTEUser.properties"

    und dort den Verweis zur SciTEStartup.lua hinein gesetzt.

    Code
    import au3.UserUdfs
    import au3.keywords.user.abbreviations
    #~ Lua script that will be loaded when SciTE starts to set up the global state for Lua.
    ext.lua.startup.script=$(SciteUserHome)\SciTEStartup.lua

    Wenn ich nun eine Datei per Doppelklick mit SciTE öffne, wird in dessen Console 2x "hallo" geschrieben, wenn ich die SciTE.exe doppelklicke, wird sogar 5x "hallo" geschrieben. Ist das so in Ordnung? Wenn andere Anweisungen in der SciTEStartup.lua hinzukommen, werden die dann alle mehrfach ausgeführt?


    ext.lua.auto.reload

    ext.lua.reset

    extension.filepattern

    Wo kommen denn diese Einträge hin?


    Ich habe deinen Info-Text kurz überflogen, muss mich aber erst um den Haushalt kümmern. Danach lese ich genauer und teste es dann.

  • Ok, folgendermaßen habe ich es verstanden: ext.lua.reset=0 bewirkt, dass die SciTEStartup.lua nur 1x beim SciTE Start aufgerufen wird. Nun wird nur 1x "hallo" in die Console geschrieben. Meine SciTEUser.properties sieht nun so aus:


    extension.filepattern ist mir noch ein Rätsel, aber soweit ich es verstanden habe, wird das nicht wirklich gebraucht (zumindest vorläufig).


    Als nächstes versuche ich, die Hilfe für Lua einzubinden.

    Im Thread FAQ - SciTE Editor ging es darum "Wie kann man in SciTE4AutoIt3 eine weitere Hilfedatei einbinden, z.B. für Lua?". Im Posting #48 hat BugFix eine Antwort geschrieben und nützliche Dateien angehängt.

  • #~ "ext.lua.startup.script=..." muss als erstes in der SciTEUser.properties
    #~ stehen, weil alle nachfolgende Anweisungen mit diesem Pfad arbeiten.

    Es muss nicht als erstes in der SciTEUser.properties stehen, jedoch vor der ersten Benutzung und es sind definitiv nicht alle nachfolgenden Anweisungen, die mit diesem Pfad arbeiten. Bei dir und auch bei mir steht keine Zeile in der SciTEUser.properties, die diese Variable benötigt - kein einziges Lua-Script bei mir braucht diese Variable.


    ext.lua.auto.reload=1

    Kannst du dir sparen (auskommentieren), denn so ist es ja bereits in der SciTEGlobal.properties gesetzt.


    # Dokumente in mehreren SciTE-Instanzen laden, statt in 1 Fenster mit mehreren Tabs.

    Richtig ist: Mehrere SciTE-Instanzen erlauben.

    Denn auch bei mehreren SciTE-Instanzen kann jede Instanz per Default bis zu 20 Tabs haben, wobei die Anzahl der Tabs aber beliebig erhöht werden kann.

    #~ Anzahl der parallel (gleichzeitig) geöffneten Tabs von 20 auf 25 erhöhen

    buffers=25

  • Boah, ist das schwierig! Ich krieg die Hilfe für Lua nicht ins Laufen. Meine Scripts sehen so aus:


    Die Test mit "MeinModul" waren erfolgreich, was wohl bedeuted, dass Lua.User.Scripts.Path=C:\Code\LUA funktioniert. Aber die Lua Hilfe lässt sich nicht aufrufen. Wenn ich ein Lua Script öffne, ein Wort (z.B. function) markiere und F1 drücke, kommt folgende Fehlermeldung in der SciTE Console:


    [string "#~ local chrome = "C:/Program Files (x86)/Goo..."]:1: unexpected symbol near '#'

    >Lua: error occurred while processing command


    Das # kommentiert doch in den properties files die Zeile aus, also wieso interessiert es Lua, was in der auskommentierte Zeile steht?

  • Das # kommentiert doch in den properties files die Zeile aus, also wieso interessiert es Lua, was in der auskommentierte Zeile steht?

    Das ist hier ähnlich wie mit AutoIt... wenn eine Befehlszeile auf mehrere Zeilen umgebrochen wird. Bei AutoIt ist es der _, in SciTE bzw. den Properties der \, mit dem signalisiert wird, dass die nächste Zeile noch dazu gehört. Dies gilt auch für Kommentarzeilen!


    Bsp.:


    In den Properties also besser keine Kommentarzeilen zwischen umgebrochenen Zeilen einfügen und auch keine direkt davor oder direkt dahinter, wenn sie mit \ endet!!!

  • Ach so, der "\" ist in Lua das Zeilefortsetzungszeichen.

    Von Lua hatte ich nichts gesagt...


    Die Syntax für dostring ist:

    dostring(s) -- executes s as a Lua string, like Lua 4's dostring


    In den Properties werden mehrere Zeilen lediglich der besseren Lesbarkeit wegen umgebrochen... doch bevor sie an dostring übergeben werden, müssen sie wieder zu einer Zeile zusammengefügt werden.

    Und ja... mit Lua kannst du dein ganzes Script in nur einer Zeile haben... ist Lua egal.

    Code: *.lua
    -- so...
    print('a')
    print('b')
    print('c')
    -- oder so...
    print('a') print('b') print('c')
  • Der Abschnitt in der SciTEUser.properties sieht nun bei mir so aus:

    Code: SciTEUser.properties
    command.help.$(file.patterns.lua)=dostring \
    local waterfox = "C:/Program Files/Waterfox/waterfox.exe" \
    local manual = "file:///C:/CODE/Lua/doc/lua5.3/manual.html#pdf-" \
    local sel = props["CurrentSelection"] \
    if sel == "" then manual = "file:///C:/CODE/Lua/doc/lua5.3/manual.html" end \
    os.execute('start "" "'..manual..sel..'"') \
    print('>'..props["CurrentSelection"]..'<')
    command.help.subsystem.$(file.patterns.lua)=3

    Damit wird der Browser gestartet, aber leider immer mit der Startseite. "sel" scheint immer leer zu sein, wie kann ich das denn überprüfen? Ein print(props["CurrentSelection"]) funktioniert in der SciTEUser.properties nicht und in der SciTEStartup.lua wird ein leerer String geprinted.


    BugFix  Bitnugger


    Edit: Ich habe einen print-Befehl in die dostring Anweisung integriert und diesen Beitrag aktualisiert. Man muss also tatsächlich ein Wort erst markieren, damit es erfasst wird. Ein einfaches Platzieren in ein Wort genügt nicht. - Aber ok, für den Moment ginge das so, aber es funktioniert nicht. Es wird immer nur die Startseite des Manuals geöffnet. Ich probiere mal die alte Lua Hilfe 5.1.

  • "sel" scheint immer leer zu sein, wie kann ich das denn überprüfen?

    Indem du das print einfach noch dem Block für dostring hinzufügst...

    Code: SciTEUser.properties
    command.help.$(file.patterns.lua)=dostring \
    local waterfox = "C:/Program Files/Waterfox/waterfox.exe" \
    local manual = "file:///C:/CODE/Lua/doc/lua5.3/manual.html#pdf-" \
    local sel = props["CurrentSelection"] \
    if sel == "" then manual = "file:///C:/CODE/Lua/doc/lua5.3/manual.html" end \
    os.execute('start "" "'..manual..sel..'"') \
    print("CurrentSelection = " .. props["CurrentSelection"])
    command.help.subsystem.$(file.patterns.lua)=3

    CurrentSelection ist natürlich nur dann ~= "", wenn du einen Text markierst, bevor du F1 drückst!


    So sieht das bei mir aus:

    Code: SciTEUser.properties
    command.help.$(file.patterns.lua)=dostring \
    local firefox = "C:/Program Files/Mozilla Firefox/firefox.exe" \
    local manual = "file:///f:/Meine%20Webseiten/lua5.3/manual.html" \
    local sel = props["CurrentSelection"] \
    if sel ~= "" then manual = manual.."#pdf-"..sel else sel = props["CurrentWord"] if sel ~= "" then manual = manual.."#pdf-"..sel else sel = '' end end \
    shell.exec('"'..firefox..'" "'..manual..'"') \
    if sel ~= "" then editor:SetSel(editor.SelectionStart, editor.SelectionStart) end
    command.help.subsystem.$(file.patterns.lua)=3