Lua - Grundkenntnisse

  • In einer Test-Lua-Datei hatte ich "function" oder "print" markiert. Nun habe ich "string" dazu geschrieben, aber nichts davon bewirkt etwas, es wird immer die Startseite des Manuals geöffnet.


    Ich habe nun auch Google Chrome installiert, aber dann öffnet sich gar nichts. Wenn ich io.popen benutze, flackert kurz das SciTE Fenster, aber auch da öffnet sich kein Browser.


    os.execute('"'..chrome..'" "'..manual..sel..'"')

    io.popen('"'..chrome..'" "'..manual..sel..'"')


    Kannst du deinen funktionierenden Befehlsblock posten? Dann werden ich alle Programme (Chrome, ...) so einrichten, wie bei dir. Google Chrom hat sich bei mir in "C:/Program Files/Google/Chrome/Application/chrome.exe" ohne das "(x86)" installiert, das dürfte aber keinen Unterschied machen, wenn ich den Pfad im Befehlsblock angepasst habe: local chrome = "C:/Program Files/Google/Chrome/Application/chrome.exe" \


    Liegt es vielleicht an os.execute/io.popen? Oder dem command.help.subsystem.$(file.patterns.lua)=3?

  • print('"'..chrome..'" "'..manual..sel..'"') ergibt


    "C:/Program Files/Google/Chrome/Application/chrome.exe" "file:///C:/CODE/Lua/doc/lua5.3/manual.html#pdf-string"


    Kannst du mal bei dir probieren, wie es mit os.execute oder io.popen funktioniert?

  • Code: AutoIt Text.au3
    Run("C:/Program Files/Google/Chrome/Application/chrome.exe" & " " & "file:///C:/CODE/Lua/doc/lua5.3/manual.html#pdf-string")

    In AutoIt funktioniert der Aufruf einwandfrei, die Webseite wird aufgerufen und zeigt "6.4 – String Manipulation" an. Also wirds an os.execute/io.popen liegen.


    Edit: Da hatten wir wohl die gleiche Idee zur gleichen Zeit. Gute Nacht. :sleeping:

  • Ich mache das beim Debuggen auch gerne so:

    print('shell.exec = ', shell.exec('"'..firefox..'" "'..manual..'"'))

    shell.exec = true Der Vorgang wurde erfolgreich beendet


    Eine Zeile geändert, um einen Fehler zu provozieren:

    local firefox = "C:/Program Files/Mozillas Firefox/firefox.exe" \

    shell.exec = false Das System kann die angegebene Datei nicht finden


    Evtl. liegt es daran, dass os noch unbekannt ist... das kannst du so testen:

    command.help.$(file.patterns.lua)=dostring \

    if type(os) ~= 'table' then print('require "os"!!!', 'type(os) = ', type(os)) return end \

    ...


    Für os.execute musst du die Zeile etwas ändern... hier beide Zeilen zum Vergleich:

    shell.exec('"'..firefox..'" "'..manual..'"')

    os.execute('""'..firefox..'" "'..manual..'""')

  • Dank eurer Hilfe funktioniert es nun. Mein Befehlsblock sieht nun so aus:

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


    Folgende positiven Dinge sind hervorzuheben:

    • os.execute('start "" "'..chrome..'" "'..manual..sel..'"') lässt das Windows CMD Fenster nur kurz aufblitzen, anstatt die ganze Zeit zu laufen, bis der Browser geschlossen wird.
    • local sel = props["CurrentWord"] ermöglicht es, die Hilfe aufzurufen, ohne dass ein Wort markiert ist. Es genügt, wenn das Caret in oder an einem Wort steht.
    • Zusätzlich funktioniert damit auch das Markieren des Suchwortes, so wie mit local sel = props["CurrentSelection"]. was nützlich ist bei Suchworten, die mit Punkt verbunden sind, z.B. "os.execute" oder "string.format".

    Wer auch das Markieren von Suchworten, die mit Punkt verbunden sind, automatisch haben will, kann folgendes in die SciTEUser.properties hinzufügen.

    Code: SciTEUser.properties
    # Wort-Erkennung in Lua Dateien auf zweiteilige Wörter mit Punkt "." dazwischen erweitern.
    # Dadurch wird z.B. beim Aufrufen der Hilfe mit Param "CurrentWord" ein zweiteiliges Wort
    # mit Punkt dazwischen als Suchbegriff erkannt, z.B. "os.execute", wenn das Caret darin steht.
    # Auch werden beide Wortteile markiert, wenn man auf nur einen Wortteil doppelklickt.
    word.chars.lua=$(chars.alpha)$(chars.numeric)$(chars.accented)._%
    word.characters.$(file.patterns.lua)=$(word.chars.lua)
  • Code
    command.help.$(file.patterns.lua)=dostring \
    ...
    shell.exec('"'..chrome..'" "'..manual..sel..'"')
    ...


    Muss man für shell.exec noch etwas in der SciTEUser.properties einfügen, um die Bibliothek einzubinden?

  • Muss man für shell.exec noch etwas in der SciTEUser.properties einfügen, um die Bibliothek einzubinden?

    Wäre ich gehässig, würde ich jetzt einfach nein sagen... doch du hast unverdienterweise unverschämtes Glück. 8o


    Einfügen muss man was, aber wie in aller Welt kommst du dabei auf SciTEUser.properties?


    Tatsächlich muss dies entweder lokal in dem Lua-Script, welches Funktionen der shell.dll benötigt, oder aber global in der SciTEStartup.lua geschehen, womit dann alle Scripts darauf zugreifen können.

    -- load library - Info --> shell.html

    require "shell"

    --~ if shell then table.foreach(shell, print) end


    Das funktioniert allerdings nur bis SciTE-Version 3.7.5.0, denn in den neueren ist der Einsprungpunkt luaL_register nicht mehr enthalten, weil veraltet.

    Liest du hier: RE: Erkennen wenn User eine öffnende runde Klammer schreibt, unabhängig vom Keyboard Layout


    Folgende positiven Dinge sind hervorzuheben:

    Zu 1.) os.execute() lässt das Windows CMD Fenster nur kurz aufblitzen und versteckt es dann wieder - es wird nicht geschlossen und läuft im Hintergrund weiter, bis SciTE beendet wird.

    Zu 2.) Die Hilfe kann auch ohne props["CurrentWord"] aufgerufen werden... wenn kein Text markiert wurde, ist dies allerdings eine gute Alternative, um den Text, der unter dem Caret steht, zu verwendet, oder halt nichts, wenn das Caret nicht vor/in/hinter einem Word oder in einer leeren Zeile steht.

    Zu 3.) Mit props["CurrentWord"] und auch mit props["CurrentSelection"] wird nichts markiert. props liefern lediglich die Werte der angefragten Eigenschaften, welche von SciTE bereitgestellt werden.


    Wer auch das Markieren von Suchworten, die mit Punkt verbunden sind, automatisch haben will, kann folgendes in die SciTEUser.properties hinzufügen.

    Keine schlechte Idee... sollte aber gut überlegt sein... denn andere Scripte gehen evtl. davon aus, das diese Properties auf Default stehen.

  • Wäre ich gehässig, würde ich jetzt einfach nein sagen... doch du hast unverdienterweise unverschämtes Glück. 8o

    Hast du deine Schuhe und Strümpfe ausgezogen? ;)


    Zu 1.) os.execute() lässt das Windows CMD Fenster nur kurz aufblitzen und versteckt es dann wieder - es wird nicht geschlossen und läuft im Hintergrund weiter, bis SciTE beendet wird.

    Das kommt darauf an, ob du den neuen Schalter "create.hidden.console" gesetzt hast. Wenn gesetzt (=1), blitzt das CMD Fenster 1x bei SciTE Start auf und läuft dann im Hintergrund, bis SciTE beendet wird. Wenn nicht gesetzt, wird mit jedem os.execute das CMD Fenster gezeigt. Wenn du "start" im Aufruf benutzt, blitzt das CMD Fenster bei jedem Aufruf auf, ohne "start" läut das CMD Fenster bis das damit gestartete Programm beendet ist.


    Keine schlechte Idee... sollte aber gut überlegt sein... denn andere Scripte gehen evtl. davon aus, das diese Properties auf Default stehen.

    Das sehe ich auch so. Beim Aufrufen der Lua Hilfe ist es einerseits angenehm, das Caret z.B. in "package.cpath" zu setzen und F1 zu drücken - dann öffnet sich die Lua Hilfe automatisch an der richtigen Stelle. Andererseits ist es aber auch nicht immer gewollt, wenn man z.B. im Text "Lua.User.Scripts.Path" auf "Path" doppelklickt und dann alle 4 Wörter markiert werden. Auch an deinem Argument, dass andere Scripts davon betroffen werden, ist was dran. - Aber das ist wohl mit allem so, dass es 2 Seiten gibt. :saint:


    Viel wichtiger wäre, Informationen z.B. zu "table.foreach" zu finden, ohne zusätzlich noch Google und anderes bemühen zu müssen. :/


    Einfügen muss man was, aber wie in aller Welt kommst du dabei auf SciTEUser.properties?

    Geraten? :P


    Das funktioniert allerdings nur bis SciTE-Version 3.7.5.0, denn in den neueren ist der Einsprungpunkt luaL_register nicht mehr enthalten, weil veraltet.

    Das betrifft nur DLLs, nicht lua Bibliotheken.


    Ich habe an einem Ersatz für shell.execute gearbeitet, bisher soweit erfolgreich, dass es z.B. in der SciTEStartup.lua funktioniert. Leider lässt sich meine Funktion aus meiner Lua Bibliothek NICHT mit "dostring" in der SciTEUser.properties benutzen. Deshalb habe ich gefragt. - Auch mit require "MeinModul" lässt sich meine Funktion zwar in der SciTEStartup.lua benutzen, aber nicht mit "dostring" in der SciTEUser.properties.

  • Wie kann man Shift+F1 und Alt+F1 benutzen, um andere Lua Hilfen aufzurufen? (Ctrl+F1 ist von der SciTE4AutoIt3 Hilfe belegt.)


    Mit eurer Hilfe habe ich den Tipp von BugFix ins Laufen gebracht, um mit F1 die lokale Lua Hilfe aufzurufen. Manche Sachen findet man dort, manche nicht. Deshalb würde ich gerne andere Quellen zusätzlich einbinden, z.B. Garry's Mod Wiki (online!) und mit Shift+F1 aufrufen. (Möglichst OHNE einen der wenigen Tool-Menu Shortcuts 35 - 49 zu opfern!)


    Aufruf: https://wiki.facepunch.com/gmod/Suchbegriff

    Beispiel: https://wiki.facepunch.com/gmod/table.foreach

  • Wofür ist denn "OHK = {}" am Anfang der OHKfuncs.lua?

    Code: http://lua-users.org/wiki/TablesTutorial
    Creating tables
    Tables are created using table constructors, which are defined using curly brackets, e.g. { } . To define an empty table we can do the following.
    > t = {} -- construct an empty table and assign it to variable "t"
    > print(t)
    table: 0035AE18
    Notice when the value of a table is displayed only the type and unique id of the object are displayed. To print out the contents of a table we must do so explicitly. We'll learn how to do this later.
  • Wofür ist denn "OHK = {}" am Anfang er OHKfuncs.lua? In anderen Scripts habe ich z.B. "F = {}" gesehen.

    Mal noch als Hintergrund:

    Lua besteht intern ausschließlich aus Arrays - in Lua: Tables.

    Alle Funktionen und Werte sind darin gespeichert. Daraus resultiert auch, dass Lua extrem davon profitiert, wenn Funktionen/Variablen explizit lokal deklariert werden.