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:

    Fehlermeldungen

    ...ers\User1\AppData\Local\AutoIt v3\SciTE\SciTEStartup.lua:112: module 'MeinModul' not found:

    no field package.preload['MeinModul']

    no file '\MeinModul.lua'

    no file '\MeinModul\MeinModul.lua'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\lua\MeinModul.lua'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\lua\MeinModul\init.lua'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\MeinModul.lua'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\MeinModul\init.lua'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\..\share\lua\5.3\MeinModul.lua'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\..\share\lua\5.3\MeinModul\init.lua'

    no file '.\MeinModul.lua'

    no file '.\MeinModul\init.lua'

    no file '\MeinModul.dll'

    no file '\MeinModul\MeinModul.dll'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\MeinModul.dll'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\..\lib\lua\5.3\MeinModul.dll'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\loadall.dll'

    no file '.\MeinModul.dll'

    >Lua: error occurred while running startup script

    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()
    Spoiler anzeigen

    ...ers\User1\AppData\Local\AutoIt v3\SciTE\SciTEStartup.lua:113: module 'C:\Code\Lua\MeinModul' not found:

    no field package.preload['C:\Code\Lua\MeinModul']

    no file '\C:\Code\Lua\MeinModul.lua'

    no file '\C:\Code\Lua\MeinModul\C:\Code\Lua\MeinModul.lua'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\lua\C:\Code\Lua\MeinModul.lua'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\lua\C:\Code\Lua\MeinModul\init.lua'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\C:\Code\Lua\MeinModul.lua'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\C:\Code\Lua\MeinModul\init.lua'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\..\share\lua\5.3\C:\Code\Lua\MeinModul.lua'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\..\share\lua\5.3\C:\Code\Lua\MeinModul\init.lua'

    no file '.\C:\Code\Lua\MeinModul.lua'

    no file '.\C:\Code\Lua\MeinModul\init.lua'

    no file '\C:\Code\Lua\MeinModul.dll'

    no file '\C:\Code\Lua\MeinModul\C:\Code\Lua\MeinModul.dll'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\C:\Code\Lua\MeinModul.dll'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\..\lib\lua\5.3\C:\Code\Lua\MeinModul.dll'

    no file 'C:\Program Files (x86)\AutoIt3\SciTE\loadall.dll'

    no file '.\C:\Code\Lua\MeinModul.dll'

    >Lua: error occurred while running startup script

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

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    • Offizieller Beitrag

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

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

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

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

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

    Install
    • Altes SciTE4AutoIt3 in Windows "Programme und Features" desinstalliert.
    • Gelöscht: "C:\Program Files (x86)\AutoIt3\SciTE\"
    • Gelöscht: "C:\Users\User1\AppData\Local\AutoIt v3\"
    • SciTE4AutoIt3 Setup 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.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • 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

    ext.lua-Eigenschaften

    Die ext.lua-Eigenschaften sind spezifisch für die SciTE Lua Scripting Extension. Die Eigenschaft extension.filepattern ist Teil der generischen SciTE-Erweiterungsschnittstelle, wird derzeit jedoch nur von der Lua Scripting-Erweiterung verwendet.

    Die Eigenschaft ext.lua.startup.script definiert den Dateinamen eines Lua-Skripts, das geladen wird, wenn SciTE mit dem Einrichten des globalen Status für Lua beginnt. Der Standardwert ist $(SciteUserHome)/SciTEStartup.lua. Sie sollten für diese Eigenschaft einen absoluten Pfad verwenden, können jedoch auf die Eigenschaften $(SciteDefaultHome) oder $(SciteUserHome) verweisen. Hier können globale Ereignishandler, Befehlsfunktionen sowie andere Funktionen und Objekte definiert werden.

    Die Eigenschaft ext.lua.auto.reload bestimmt, was passiert, wenn Sie das Startskript oder das aktive Erweiterungsskript in SciTE speichern. Wenn es auf 0 gesetzt ist, wird das Startskript nur zum Startzeitpunkt oder beim Wechseln der Puffer (abhängig von ext.lua.reset) angewendet, und Änderungen am Erweiterungsskript werden nur angewendet, wenn Sie die Puffer wechseln. Wenn ext.lua.auto.reload auf 1 gesetzt ist (Standardeinstellung), initialisiert SciTE den globalen Bereich sofort neu, wenn eines der Skripte in SciTE gespeichert wird. Selbst wenn ext.lua.auto.reload aktiviert ist, bemerkt SciTE nicht, wenn die Dateien von außerhalb der aktuellen SciTE-Instanz geändert werden. Siehe dazu ext.lua.reset unten.

    Die Eigenschaft ext.lua.reset dient hauptsächlich zum Debuggen. Wenn ext.lua.reset 0 ist (Standardeinstellung), wird die Eigenschaft des Startskripts nur einmal überprüft - beim Start von SciTE. Wenn ext.lua.reset auf 1 geändert wird, überprüft SciTE die Eigenschaft des Startskripts und lädt das neue Startskript jedes Mal neu, wenn Sie die Puffer wechseln. Als solches hat es eine andere (größere) Reihe von Nebenwirkungen als ext.lua.auto.reload. In einigen Situationen ist es sinnvoll, sowohl auto.reload als auch reset zu aktivieren, aber normalerweise reicht ext.lua.auto.reload allein aus.

    Abgesehen von ext.lua.startup.script bietet die Eigenschaft extension.filepattern eine Möglichkeit, zusätzliche Funktionen und Ereignishandler zu laden, die für einen bestimmten Dateityp spezifisch sein können. Wenn der Wert der Erweiterungseigenschaft auf .lua endet und eine vorhandene Datei benennt, wertet die Erweiterung Lua das Skript aus, sodass im Skript definierte Ereignishandler und Befehle verfügbar sind, während dieser Puffer aktiv ist. Über ext.lua.startup.script definierte Funktionen und Objekte sind weiterhin verfügbar, sofern sie nicht überschrieben werden.

    Die Erweiterungseigenschaft kann auch ein Verhalten definieren, das für ein bestimmtes Verzeichnis spezifisch ist. Wenn in der Erweiterungseigenschaft ein bloßer Dateiname (kein Pfad) angegeben ist, sucht SciTE die Datei an den Speicherorten der Standardeigenschaftendateien, beginnend mit dem lokalen Verzeichnis. Dies kann in Kombination mit einer lokalen SciTE.properties-Datei sehr nützlich sein.

    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

    2 Mal editiert, zuletzt von Bitnugger (5. Oktober 2020 um 12:01)

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

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

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

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • #~ "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?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    • Offizieller Beitrag

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

    In Properties ja, du hast aber dort eine Zeile reinen Lua-Codes mit # verunreinigt.

    dostring ist der Beginn von Lua-Code. Dort darfst du nicht auskommentierte!

  • 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 properties files das Zeilefortsetzungszeichen. Das erklärt natürlich einiges. :thumbup:

    Edit: Korrigiert entspechend dem nächsten Beitrag von BugFix: Nicht in Lua sondern in properties files.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    Einmal editiert, zuletzt von Professor Bernd (5. Oktober 2020 um 22:40)

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

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    Einmal editiert, zuletzt von Professor Bernd (5. Oktober 2020 um 23:09)

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