Ausführliche Informationen zur Programmiersprache Lua finden Sie auf der Lua-Website.
Double Commander kann Lua-Skripte über den Befehl cm_ExecuteScript ausführen.
Skriptparameter müssen im Originalzustand ohne Maskierung (keine Anführungszeichen oder „\“) übergeben werden. Dazu müssen wir die Variable %"0 verwenden: Verwenden Sie beispielsweise %"0%p0 anstelle von %p0 für die Datei unter dem Cursor und %"0%D anstelle von %D für das aktuelle Verzeichnis. Andernfalls, wenn Double Commander automatisch Anführungszeichen hinzufügt, werden diese als Teil des Parameters übergeben, was Sie berücksichtigen müssten.
Um eine Liste aller ausgewählten Dateien abzurufen, können wir Variablen (%LU, %FU oder %RU) oder interne Befehle (cm_SaveSelectionToFile, cm_SaveFileDetailsToFile, cm_CopyFullNamesToClip oder cm_CopyFileDetailsToClip) verwenden.
Beispielsweise können wir %p verwenden: In diesem Fall übergibt Double Commander die Namen aller ausgewählten Dateien in einer einzigen Zeile, getrennt durch Leerzeichen.
Es ist auch möglich, Inhalts-Plugins mit Lua-Skripten zu schreiben. Beispiele finden Sie im Programmordner (plugins/wdx/scripts). Im Wiki gibt es eine eigene Seite zur Entwicklung von Plugins. Einschränkung: Nur die folgenden Datentypen werden unterstützt:
Die obige Liste enthält die Namen aus den Header-Dateien. In Lua-Skripten müssen wir die in Klammern angegebenen numerischen Werte verwenden.
Über Textkodierung
Alle unten beschriebenen zusätzlichen Funktionen akzeptieren UTF-8-kodierte Zeichenfolgenparameter und geben UTF-8-kodierte Zeichenfolgen zurück (mit Ausnahme der Funktion LazUtf8.ConvertEncoding).
Einige Funktionen in den Standard-Lua-Bibliotheken wurden durch Funktionen von Double Commander oder Free Pascal/Lazarus ersetzt (oder neue Funktionen wurden geschrieben), um UTF-8-Unterstützung zu bieten.
Beim Schreiben von Plugins sollten wir ebenfalls UTF-8 für Textdaten verwenden (ft_multiplechoice, ft_string und ft_fulltext).
Speichern Sie Skripte bitte in der UTF-8-Kodierung ohne BOM.
Besondere Hinweise
Die Automatisierung mit Lua bietet enorme Möglichkeiten, aber in manchen Fällen müssen bestimmte Details beachtet werden. Wir versuchen, diese in diesem Unterabschnitt zu sammeln.
1. Wenn die Optionen Automatisches Aktualisieren und Dateiliste in separatem Thread laden aktiviert sind, arbeitet die Aktualisierungsfunktion asynchron. Da das Skript jedoch im Hauptthread von Double Commander ausgeführt wird, kann dies unter bestimmten Umständen die Ausführung Ihres Skripts beeinträchtigen. Beispielsweise kann die aufeinanderfolgende Ausführung von Navigationsbefehlen fehlschlagen (z. B. bei großen Verzeichnissen oder langsamen Datenträgern). Versuchen Sie in diesem Fall, Dateiliste in separatem Thread laden zu deaktivieren oder eine alternative Lösung zu finden.
Wenn Ihr Skript eine neue Datei im aktuellen Panel erstellt oder eine vorhandene umbenennt, danach aber nicht beendet wird, sondern zusätzliche Aktionen ausführt (z. B. eine Datei auswählt oder den Cursor bewegt), werden diese Aktionen unter Umständen nicht wirksam: Möglicherweise befinden sich noch nicht alle Dateien im Panel und Sie müssen zuerst den Befehl cm_Refresh aufrufen. Unter den genannten Bedingungen wird cm_Refresh ebenfalls asynchron ausgeführt, sodass Double Commander eventuell nicht genügend Zeit hat, die Dateiliste nach Ihren Änderungen vollständig zu aktualisieren.
Da das automatische Aktualisieren und das Laden der Dateiliste in einem separaten Thread komfortable Funktionen des Dateimanagers sind, wurde durch Experimente eine stabile Arbeitsmethode gefunden, um die Kontrolle vorübergehend an das Programm zurückzugeben und die Dateiliste vollständig aktualisieren zu lassen:
DC.ExecuteCommand("cm_Refresh") i = 10 while i > 0 do SysUtils.Sleep(10) DC.ExecuteCommand("") i = i - 1 end
2. Die Lua-Funktion io.open verwendet die Standard-C-Funktion fopen: Im Textmodus kann diese Funktion beim Lesen und Schreiben Zeilenenden (CRLF, LF oder CR) konvertieren, was zu unerwarteten Ergebnissen führen kann. Wenn Sie mit Dateien arbeiten, die unterschiedliche Zeilenenden aufweisen, oder plattformübergreifende Skripte schreiben, müssen Sie dies berücksichtigen. Praktischer ist es meist, den Binärmodus zu bevorzugen.
3. Unter Linux und anderen Unix-ähnlichen Betriebssystemen wird beim Aufruf der Funktion ContentGetValue für den Dialog Dateieigenschaften das Flag CONTENT_DELAYIFSLOW (vierter Parameter mit dem Wert 1) übergeben. Dies verhindert Verzögerungen beim Öffnen des Fensters: Wenn die Datenabfrage langsam ist, können wir diese Daten ausschließen, indem wir einfach den Flag-Wert prüfen und nil für diese Felder oder das Plugin zurückgeben.
4. Wenn das Plugin eine leere Zeichenfolge zurückgeben soll, ist die Übergabe von nil schneller als die von "".
Um Lua-Skriptdateien interpretieren zu können, wird eine Lua-DLL (bzw. gemeinsam genutzte Bibliothek) benötigt. Double Commander unterstützt die Versionen 5.1 bis 5.4.
Wir können Bibliotheksdateien aus dem LuaJIT-Projekt verwenden. LuaJIT kombiniert einen in Assembler geschriebenen Hochgeschwindigkeits-Interpreter mit einem fortschrittlichen JIT-Compiler. Darüber hinaus erhalten wir die FFI-Bibliothek, mit der externe C-Funktionen aufgerufen und C-Datenstrukturen direkt aus reinem Lua-Code verwendet werden können.
Die Windows-Versionen von DC enthalten standardmäßig die Lua-DLL (ab DC 0.9.7 aus dem LuaJIT-Projekt). Auf anderen Systemen können wir sie über den Paketmanager suchen und installieren oder selbst kompilieren. Wenn wir eine 64-Bit-Version von DC verwenden, muss auch die DLL in der 64-Bit-Version vorliegen.
Standardmäßig sucht DC in seinem Verzeichnis und in den Systemverzeichnissen nach einer Datei namens lua5.1.dll (Windows), liblua5.1.so.0 (Unix oder GNU/Linux) oder liblua5.1.dylib (macOS). Wir können den Dateinamen (und Pfad) im Parameter Zu verwendende Lua-Bibliotheksdatei ändern.
Double Commander stellt unseren Lua-Skripten mehrere Funktionsbibliotheken zur Verfügung.
Nachfolgend finden Sie eine Liste dieser Bibliotheken.
| Liste der Bibliotheken | ||
|---|---|---|
| Bibliotheksname | Skriptname | Kurzbeschreibung |
| DC | Double Commander-spezifische Funktionen | |
| SysUtils | Verschiedene Systemfunktionen | |
| Clipbrd | Bietet externe Zwischenablagefunktionen | |
| Dialogs | Interaktion mit dem Benutzer | |
| LazUtf8 | UTF-8-Zeichenfolgenfunktionen | |
| Char | Informationen über Zeichen abrufen | |
| os | Betriebssystembezogene Funktionen | |
Diese Bibliothek enthält Double Commander-spezifische Funktionen.
Sie stellt alle ihre Funktionen in der Tabelle DC bereit.
| Bibliothek DC | |
|---|---|
| Funktionsname | Beschreibung |
|
DC.LogWrite(sMessage, iMsgType, bForce, bLogFile) Schreibt eine Nachricht in das Protokollfenster (Log):
|
|
|
iPanel = DC.CurrentPanel() Gibt das aktive Panel zurück: 0 für das linke Panel, 1 für das rechte Panel. DC.CurrentPanel(iPanel) Setzt das aktive Panel: iPanel gleich 0 aktiviert das linke Panel, gleich 1 das rechte Panel. |
|
|
DC.ExecuteCommand(sCommand, Param1, Param2,...,ParamX) Ermöglicht dem Skript den Aufruf von internen Befehlen von Double Commander. sCommand ist der eigentliche Name des internen Befehls. Wir können beliebig viele Parameter Param... übergeben, die vom Befehl unterstützt werden. |
|
Zusätzlich zu internen Befehlen können wir in Skripten den speziellen Befehl cm_ExecuteToolBarItem verwenden, mit dem Schaltflächen der Symbolleiste über eine eindeutige Kennung (ID) aufgerufen werden können (dies ermöglicht es, Tastenkombinationen für Symbolleistenschaltflächen zuzuweisen). Dieser Befehl wird ähnlich wie ein normaler interner Befehl verwendet (siehe Beispiel unten) und akzeptiert folgende Parameter:
| Parameter | Wert | Beschreibung |
|---|---|---|
| ToolBarID | TfrmOptionsToolbar | Schaltflächen der Hauptsymbolleiste |
| TfrmOptionsToolbarMiddle | Schaltflächen der mittleren Symbolleiste | |
| (nicht vorhanden) | Schaltflächen der Hauptsymbolleiste | |
| ToolItemID | Kennung (ID) | Eindeutige ID der Schaltfläche |
Die eindeutige ID wird im Tag ID gespeichert, und es gibt mehrere Möglichkeiten, sie zu ermitteln: Sie finden sie in der Datei doublecmd.xml, in einer Symbolleisten-Sicherungsdatei, oder indem Sie die Schaltfläche einfach in die Zwischenablage kopieren und ihren Code in einen Texteditor einfügen.
Hinweis: Die IDs werden automatisch generiert und müssen nicht unbedingt mit ähnlichen Schaltflächen in einer anderen Programmkopie übereinstimmen. Bei Bedarf können wir jedoch manuell eigene Werte festlegen.
In diesem Beispiel schreiben wir ein einfaches Skript, das folgende Aktionen ausführt:
-- 1. Fokus auf das rechte Panel setzen. DC.ExecuteCommand("cm_FocusSwap", "side=right") -- 2. Alle Tabs schließen. DC.ExecuteCommand("cm_CloseAllTabs") -- 3. In ein bestimmtes Verzeichnis wechseln. DC.ExecuteCommand("cm_ChangeDir", "E:\\FakeKey\\Documents\\Music") -- 4. Fokus auf das linke Panel setzen. DC.ExecuteCommand("cm_FocusSwap", "side=left") -- 5. Alle Tabs schließen. DC.ExecuteCommand("cm_CloseAllTabs") -- 6. In ein bestimmtes Verzeichnis wechseln. DC.ExecuteCommand("C:\\Users\\Public\\Music") -- 7. Neuen Tab öffnen. DC.ExecuteCommand("cm_NewTab") -- 8. In ein bestimmtes Verzeichnis wechseln. DC.ExecuteCommand("cm_ChangeDir", "E:\\VirtualMachines\\ShareFolder")
Mit dem internen Befehl cm_ExecuteScript können wir eine Symbolleistenschaltfläche so konfigurieren, dass sie unser Skript ausführt.
Angenommen, diese Skriptdatei befindet sich unter E:\scripts\lua\music.lua, dann können wir die Schaltfläche wie folgt konfigurieren:

Zudem können wir den internen Editor von Double Commander verwenden, um das Skript zu bearbeiten. Wenn die Datei die Endung .lua hat, erkennt der interne Editor dies und bietet eine Syntaxhervorhebung für die Sprache Lua:

Diese Bibliothek enthält verschiedene Systemfunktionen.
Sie stellt alle ihre Funktionen in der Tabelle SysUtils bereit.
| Systembibliothek | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Funktionsname | Beschreibung | ||||||||||
|
SysUtils.Sleep(iMilliseconds) Pausiert die Ausführung des Skripts für die angegebene Anzahl an Millisekunden iMilliseconds. |
|||||||||||
|
SysUtils.GetTickCount() Gibt einen inkrementellen CPU-Taktzähler zurück. Dieser kann für Zeitmessungen verwendet werden, es sollte jedoch nicht von festen Intervallen zwischen den Takten ausgegangen werden. |
|||||||||||
|
bExists = SysUtils.FileExists(sFileName) Prüft, ob eine bestimmte Datei im Dateisystem vorhanden ist. Wenn eine Datei namens sFileName auf der Festplatte existiert, wird in bExists der Wert |
|||||||||||
|
bExists = SysUtils.DirectoryExists(sDirectory) Prüft, ob das Verzeichnis sDirectory im Dateisystem vorhanden ist und tatsächlich ein Verzeichnis ist. Falls ja, gibt die Funktion in bExists den Wert |
|||||||||||
|
iAttr = SysUtils.FileGetAttr(sFileName) Gibt die Attributeinstellungen der Datei sFileName in iAttr zurück. Eine detaillierte Beschreibung der Rückgabewerte finden Sie hier. |
|||||||||||
|
Handle, FindData = SysUtils.FindFirst(sPath) Sucht nach Dateien, die dem Suchmuster sPath entsprechen (normalerweise unter Verwendung von Platzhaltern). Wenn keine Datei gefunden wird, ist Handle gleich Wenn mindestens ein Element gefunden wurde, kann das zurückgegebene Handle in nachfolgenden Aufrufen von Die Tabelle FindData enthält Informationen zur gefundenen Datei bzw. zum gefundenen Verzeichnis. Die Felder der Tabelle FindData sind wie folgt:
|
|||||||||||
|
Result, FindData = SysUtils.FindNext(Handle) Sucht die nächste Übereinstimmung einer Suchsequenz, die durch Wenn eine Datei oder ein Verzeichnis gefunden wird, ist der zurückgegebene Wert Result nicht leer, andernfalls Es gelten dieselben Hinweise wie für Hinweis: Auf den letzten Aufruf von |
|||||||||||
|
SysUtils.FindClose(Handle) Beendet eine Reihe von Gibt jeglichen von diesen Aufrufen belegten Speicher frei. Dieser Aufruf ist absolut notwendig, um Speicherlecks zu vermeiden. |
|||||||||||
|
bResult = SysUtils.CreateDirectory(sDirectory) Erstellt ein Verzeichnis oder eine Reihe von Verzeichnissen. sDirectory ist der vollständige Pfad des Verzeichnisses. Gibt |
|||||||||||
|
bResult = SysUtils.CreateHardLink(sFileName, sLinkName) Erstellt einen Hardlink sLinkName für die Datei sFileName. Gibt |
|||||||||||
|
bResult = SysUtils.CreateSymbolicLink(sFileName, sLinkName) Erstellt einen symbolischen Link sLinkName für das Verzeichnis oder die Datei sFileName. Gibt |
|||||||||||
|
sTarget = SysUtils.ReadSymbolicLink(sLinkName, bRecursive) Liest das Ziel des symbolischen Links sLinkName aus. Wenn bRecursive auf Gibt den Pfad zurück, auf den der symbolische Link sLinkName verweist, oder eine leere Zeichenfolge, wenn der Link ungültig ist oder die Zieldatei nicht existiert (wenn bRecursive auf |
|||||||||||
|
sName = SysUtils.ExtractFileName(sFileName) Extrahiert den Dateinamenteil aus einem vollständigen Pfadnamen. Der Dateiname besteht aus allen Zeichen nach dem letzten Verzeichnis-Trennzeichen („/“ oder „\“) bzw. nach dem Laufwerksbuchstaben. |
|||||||||||
|
sExt = SysUtils.ExtractFileExt(sFileName) Gibt die Dateiendung des Dateinamens zurück (alle Zeichen nach dem letzten Punkt „.“, einschließlich des Punkts selbst). |
|||||||||||
|
sPath = SysUtils.ExtractFilePath(sFileName) Extrahiert den Pfad (einschließlich des Laufwerksbuchstabens) aus dem Dateinamen. Der Pfad besteht aus allen Zeichen vor dem letzten Verzeichnis-Trennzeichen („/“ oder „\“), einschließlich des Trennzeichens selbst. |
|||||||||||
|
sDir = SysUtils.ExtractFileDir(sFileName) Extrahiert nur das Verzeichnis aus sFileName, einschließlich des Laufwerksbuchstabens. Der Verzeichnisname hat im Gegensatz zu |
|||||||||||
|
sDrive = SysUtils.ExtractFileDrive(sFileName) Extrahiert das Laufwerk aus dem Dateinamen. Beachten Sie bitte, dass einige Betriebssysteme keine Laufwerksbuchstaben unterstützen. |
|||||||||||
|
sName = SysUtils.GetAbsolutePath(sFileName, sBaseDirectory) Gibt den absoluten (vollständigen) Pfad der Datei zurück:
Wenn der absolute Pfad nicht ermittelt werden kann, gibt die Funktion den Wert von sFileName zurück. |
|||||||||||
|
sName = SysUtils.GetRelativePath(sFileName, sBaseDirectory) Gibt den Pfad des Dateinamens relativ zum angegebenen Verzeichnis zurück:
Wenn sFileName and sBaseDirectory denselben Wert enthalten, gibt die Funktion eine leere Zeichenfolge ("") zurück. Wenn der relative Pfad nicht ermittelt werden kann, gibt die Funktion den Wert von sFileName zurück. |
|||||||||||
|
bResult = SysUtils.MatchesMask(sFileName, sMask, iMaskOptions) Gibt iMaskOptions (optionaler Parameter, Standardwert ist 0) wird als Summe der folgenden Werte festgelegt:
|
|||||||||||
|
bResult = SysUtils.MatchesMaskList(sFileName, sMaskList, sSeparator, iMaskOptions) Gibt sSeparator und iMaskOptions (siehe oben) sind optionale Parameter. |
|||||||||||
|
sTempFileName = SysUtils.GetTempName() Gibt einen Namen zurück, der als temporärer Dateiname (im temporären Systemverzeichnis) verwendet werden kann, ähnlich der Funktion os.tmpname. Die Datei wird jedoch in einem Unterverzeichnis erstellt, das beim Schließen von Double Commander automatisch gelöscht wird. |
|||||||||||
|
SysUtils.PathDelim Das Zeichen, das vom aktuellen Betriebssystem verwendet wird, um Verzeichnisnamen in einem vollständigen Dateinamen zu trennen. Unter Unix/Linux-Systemen ist das Verzeichnis-Trennzeichen „/“, unter Windows „\“. |
|||||||||||
FileGetAttr gibt die Attributeinstellungen der Datei sFileName zurück.
Das Attribut ist eine ODER-Kombination der folgenden Konstanten:
| In Rückgabewerten von SysUtils.FileGetAttr verwendete Konstanten | |
|---|---|
| Wert | Bedeutung |
0x00000001 faReadOnly |
Die Datei ist schreibgeschützt. |
0x00000002 faHidden |
Die Datei ist versteckt. Unter Unix/Linux bedeutet dies, dass der Dateiname mit einem punkt beginnt. |
0x00000004 faSysFile |
Die Datei ist eine Systemdatei. Unter Unix/Linux bedeutet dies, dass es sich um eine Zeichen- oder Blockgerätedatei oder eine Named Pipe (FIFO) handelt. |
0x00000008 faVolumeId |
Datenträgerbezeichnung (Volume ID). Gilt nur für Standard-FAT-Dateisysteme (nicht VFAT oder FAT32) unter DOS/Windows. |
0x00000010 faDirectory |
Das Element ist ein Verzeichnis. |
0x00000020 faArchive |
Die Datei wurde archiviert. Unter Unix/Linux nicht möglich. |
0x00000400 faSymLink |
Das Element ist ein symbolischer Link. |
| Hinweis: Tritt ein Fehler auf, wird -1 zurückgegeben. | |
Siehe das Beispiel im nächsten Abschnitt.
Das folgende Skript ist ein Beispiel für die Verwendung von SysUtils.FileGetAttr.
Wenn erkannt wird, dass der Parameter ein Verzeichnis ist, wird ein neuer Tab im aktiven Panel geöffnet und in dieses Verzeichnis gewechselt.
local params = {...} local iAttr if #params == 1 then -- Haben wir mindestens einen Parameter erhalten? iAttr = SysUtils.FileGetAttr(params[1]) if iAttr > 0 then -- Haben wir ein gültiges Attribut erhalten? if math.floor(iAttr / 0x00000010) % 2 ~= 0 then -- Ist Bit 4 gesetzt? Es handelt sich also um ein Verzeichnis. DC.ExecuteCommand("cm_NewTab") DC.ExecuteCommand("cm_ChangeDir", params[1]) end end end
Im obigen Beispiel ist params[1] der erste an das Skript übergebene Parameter.
Bei Verwendung des internen Befehls cm_ExecuteScript ist dies der erste Parameter, der nach dem Skriptnamen übergeben wird.
Daher können wir in unserem Beispiel eine Symbolleistenschaltfläche wie folgt konfigurieren:

In diesem Beispiel wird der Parameter %"0%p an das Skript übergeben. Dieser steht für den nicht in Anführungszeichen gesetzten Dateinamen des aktuell ausgewählten Elements im aktiven Panel.
Im folgenden Skriptbeispiel durchsuchen wir den Inhalt eines als ersten Parameter übergebenen Verzeichnisses und speichern das Ergebnis in einer Textdatei, deren Name als zweiter Parameter übergeben wird.
Dies vermittelt ein gutes Verständnis für die Verwendung von FindFirst, FindNext und FindClose.
local params = {...} if #params == 2 then -- Haben wir zwei Parameter erhalten? local Result = nil local hOutputFile = nil hOutputFile = io.output(params[2]) local Handle, FindData = SysUtils.FindFirst(params[1] .. "\\*") if Handle ~= nil then repeat io.write(FindData.Name .. "\r") io.write(FindData.Size .. "\r") io.write("---------------\r") Result, FindData = SysUtils.FindNext(Handle) until Result == nil SysUtils.FindClose(Handle) io.close(hOutputFile) end end
Im obigen Beispiel müssen wir zwei Parameter an das Skript übergeben:
Daher ist es sehr einfach, eine Symbolleistenschaltfläche mit dem internen Befehl cm_ExecuteScript zu konfigurieren und die Parameter zu übergeben, um all dies zu erledigen.

In diesem Beispiel wird der Parameter %"0%Ds als erster Parameter an das Skript übergeben. Dieser steht für das aktuell im aktiven Panel angezeigte Verzeichnis ohne Anführungszeichen.
Double Commander kann unseren Lua-Skripten externe Zwischenablagefunktionen zur Verfügung stellen.
Die folgende Tabelle zeigt die relevanten Funktionen:
| Zwischenablagebibliothek | |
|---|---|
| Funktionsname | Beschreibung |
|
Clipbrd.Clear() Löscht den Inhalt der Zwischenablage. |
|
|
sVar = Clipbrd.GetAsText() Ruft den aktuellen Textinhalt der Zwischenablage ab und weist ihn sVar zu. Wenn die Zwischenablage keinen Text enthält, gibt die Funktion eine leere Zeichenfolge zurück. |
|
|
Clipbrd.SetAsText(sVar) Speichert den Textinhalt von sVar in der Zwischenablage. |
|
|
Clipbrd.SetAsHtml(sHtml) Fügt der Zwischenablage HTML-formatierten Text sHtml hinzu (Zwischenablageformat Dieser Inhalt kann in Anwendungen eingefügt werden, die dieses Zwischenablageformat unterstützen, wie MS Word, LO Writer usw. Es ist völlig in Ordnung, Daten sowohl mit Beispielsweise können wir Folgendes haben:
Wenn wir in Notepad wechseln und versuchen, etwas einzufügen, wird die Nachricht, die wir mit |
|
Das folgende Beispiel verwendet drei Funktionen zur Zwischenablage: Clear, GetAsText und SetAsText.
Dies ist ein relativ langes Skript, aber es kombiniert einige der zuvor besprochenen Funktionen sehr gut.
Es setzt voraus, dass sich unser aktives Panel derzeit in einem Verzeichnis mit vielen Quelltextdateien befindet.
Es setzt außerdem voraus, dass wir derzeit ein Wort in der Zwischenablage haben und dass das Skript den aktuellen aktiven Ordner als einzigen Parameter erhält.
Das Skript durchsucht die Dateien auf der aktuellen Verzeichnisebene und liest deren Inhalt einzeln, um Textzeilen zu finden, die das Wort aus der Zwischenablage enthalten.
Die Namen der Dateien, die dieses Wort in mindestens einer Zeile enthalten, werden dann in der Zwischenablage abgelegt.
Anschließend verwendet das Skript den internen Befehl cm_LoadSelectionFromClip, um diese Dateien auszuwählen.
Am Ende wird das ursprünglich gesuchte Wort wieder in der Zwischenablage abgelegt.
local params = {...} local Result = nil local iAttr local bFound = false local sCompleteFilename = "" local hInputFile = nil local sLine = "" local iPosS local iPosE local sFileToSelect = "" local sSearchString = "" if #params == 1 then -- Haben wir den Parameter erhalten? sSearchString = Clipbrd.GetAsText() -- Ruft den zu suchenden Ausdruck ab. Clipbrd.Clear() -- Stellt sicher, dass die Zwischenablage leer ist. DC.ExecuteCommand("cm_MarkUnmarkAll") -- Stellt sicher, dass nichts ausgewählt ist. -- Wir durchsuchen alle Dateien im Verzeichnis nacheinander. local Handle, FindData = SysUtils.FindFirst(params[1] .. "\\*") if Handle ~= nil then repeat sCompleteFilename = params[1] .. "\\" .. FindData.Name iAttr = SysUtils.FileGetAttr(sCompleteFilename) if iAttr > 0 then -- Haben wir ein gültiges Attribut erhalten? -- Wir benötigen Dateien, keine Verzeichnisse! if math.floor(iAttr / 0x00000010) % 2 == 0 then -- Nun lesen wir die Datei Zeile für Zeile, bis zum Ende oder bis wir fündig werden. hInputFile = io.open(sCompleteFilename, "r") bFound = false while bFound == false do sLine = hInputFile:read() if sLine == nil then break end iPosS, iPosE = string.find(sLine, sSearchString) if iPosS ~= nil then bFound = true end end if bFound == true then sFileToSelect = sFileToSelect .. FindData.Name .. "\n" end io.close(hInputFile) end end Result, FindData = SysUtils.FindNext(Handle) until Result == nil SysUtils.FindClose(Handle) end -- Wenn wir etwas gefunden haben, wählen wir es aus! if sFileToSelect ~= "" then Clipbrd.SetAsText(sFileToSelect) DC.ExecuteCommand("cm_LoadSelectionFromClip") end Clipbrd.SetAsText(sSearchString) -- Stellt das gesuchte Wort in der Zwischenablage wieder her. end
Diese Bibliothek ermöglicht es unseren Skripten, mit dem Benutzer zu interagieren, Nachrichten anzuzeigen, Antworten abzufragen usw.
Die folgende Tabelle listet die verfügbaten Funktionen auf:
| Dialogbibliothek | |
|---|---|
| Funktionsname | Beschreibung |
|
iButton = Dialogs.MessageBox(sMessage, sTitle, iFlags) Zeigt ein Meldungsfenster an, das den Benutzer zum Klicken auf eine Schaltfläche auffordert, die dann von der Funktion zurückgegeben wird:
|
|
|
bResult, sAnswer = Dialogs.InputQuery(sTitle, sMessage, bMask, sDefault) Zeigt ein Eingabefenster an, in das der Benutzer eine Zeichenfolge eingeben kann:
|
|
|
sItem, iItem = Dialogs.InputListBox(sTitle, sMessage, aItems, sDefault) Zeigt einen Dialog an, der es dem Benutzer ermöglicht, aus einer Liste von Elementen auszuwählen:
|
|
Die von der Funktion Dialogs.MessageBox angezeigten Schaltflächen werden durch die bitweise ODER-Kombination der folgenden Konstanten gesteuert:
| ButFlags-Konstanten für in Dialogs.MessageBox angezeigte Schaltflächen | |
|---|---|
| Konstantenwert | Angezeigte Schaltflächen (von links nach rechts) |
0x0000 MB_OK |
|
0x0001 MB_OKCANCEL |
|
0x0002 MB_ABORTRETRYIGNORE |
|
0x0003 MB_YESNOCANCEL |
|
0x0004 MB_YESNO |
|
0x0005 MB_RETRYCANCEL |
|
Die von der Funktion Dialogs.MessageBox angezeigten Fensterstile werden durch die bitweise ODER-Kombination der folgenden Konstanten gesteuert:
| ButFlags-Konstanten für Symbole und Stile in Dialogs.MessageBox | |
|---|---|
| Konstantenwert | Fensterstil |
0x0040 MB_ICONINFORMATION |
|
0x0030 MB_ICONWARNING |
|
0x0020 MB_ICONQUESTION |
|
0x0010 MB_ICONERROR |
|
Die standardmäßig aktive Schaltfläche in Dialogs.MessageBox wird durch die bitweise ODER-Kombination der folgenden Konstanten gesteuert:
| ButFlags-Konstanten für Standardschaltflächen in Dialogs.MessageBox | |
|---|---|
| Konstantenwert | Standardschaltfläche |
0x0000 MB_DEFBUTTON1 |
Standardmäßig die erste Schaltfläche von links |
0x0100 MB_DEFBUTTON2 |
Standardmäßig die zweite Schaltfläche von links |
0x0200 MB_DEFBUTTON3 |
Standardmäßig die dritte Schaltfläche von links |
Die von der Funktion Dialogs.MessageBox zurückgegebene Zahl stellt die vom Benutzer gedrückte Schaltfläche dar:
| Rückgabewerte (ButPressed) bei Tastendruck in Dialogs.MessageBox | |
|---|---|
| Konstantenwert | Gedrückte Schaltfläche |
0x0000 mrNone |
Keine Schaltfläche gedrückt |
0x0001 mrOK |
|
0x0002 mrCancel |
|
0x0003 mrAbort |
|
0x0004 mrRetry |
|
0x0005 mrIgnore |
|
0x0006 mrYes |
|
0x0007 mrNo |
|
Hinweis: Wenn das Fenster über das „x“ oben rechts oder durch Drücken von Esc geschlossen wird, wird der Wert der Schaltfläche „Abbrechen“ (Cancel) zurückgegeben.
Hier ist ein kleines Skript zur Verwendung von Dialogs.MessageBox und das resultierende Fenster, das angezeigt wird:
-- Schaltflächen, die angezeigt werden MB_OK = 0x0000 MB_OKCANCEL = 0x0001 MB_ABORTRETRYIGNORE = 0x0002 MB_YESNOCANCEL = 0x0003 MB_YESNO = 0x0004 MB_RETRYCANCEL = 0x0005 -- Fensterstile MB_ICONINFORMATION = 0x0040 MB_ICONWARNING = 0x0030 MB_ICONQUESTION = 0x0020 MB_ICONERROR = 0x0010 -- Standardschaltflächen MB_DEFBUTTON1 = 0x0000 MB_DEFBUTTON2 = 0x0100 MB_DEFBUTTON3 = 0x0200 -- Rückgabewerte der gedrückten Schaltfläche mrNone = 0x0000 mrOK = 0x0001 mrCancel = 0x0002 mrAbort = 0x0003 mrRetry = 0x0004 mrIgnore = 0x0005 mrYes = 0x0006 mrNo = 0x0007 iFlags = MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2 iButton = Dialogs.MessageBox("Möchten Sie beenden?", "Frage", iFlags) if iButton == mrYes then DC.ExecuteCommand("cm_Exit") end

Hier ist ein kleines Skript zur Verwendung von Dialogs.InputQuery und das resultierende Fenster, das angezeigt wird:
bResult, sAnswer = Dialogs.InputQuery("Authentifizierung", "Bitte geben Sie Ihren Namen ein:", false, "John") if bResult == true then Dialogs.MessageBox("Hallo " .. sAnswer .. "!", "Willkommen!", 0x0040) end

Diese Bibliothek bietet grundlegende Unterstützung für die UTF-8-Kodierung.
Sie stellt alle ihre Funktionen in der Tabelle LazUtf8 bereit.
| UTF-8-Bibliothek | |
|---|---|
| Funktionsname | Beschreibung |
|
iResult = LazUtf8.Pos(SearchText, SourceText, Offset) Sucht nach einer Teilzeichenfolge in einer Zeichenfolge ab einer bestimmten Position. Die Suche berücksichtigt die Groß-/Kleinschreibung. Gibt die Position des ersten Vorkommens der Teilzeichenfolge SearchText in der Zeichenfolge SourceText zurück, beginnend ab der Position Offset (Standardwert ist 1). Gibt Null zurück, wenn SearchText nach dem angegebenen Offset nicht in SourceText vorkommt. |
|
|
LazUtf8.Next(String) Eine Iteratorfunktion, die bei jedem Aufruf das nächste Zeichen in String sowie die Byte-Startposition dieses Zeichens zurückgibt. Beispiel: -- Gibt die Wertepaare im Format „Position : Zeichen“ aus for iPos, sChar in LazUtf8.Next(String) do DC.LogWrite(iPos .. " : " .. sChar) end |
|
|
sResult = LazUtf8.Copy(String, iIndex, iCount) Kopiert einen Teil einer Zeichenfolge. Gibt eine Zeichenfolge zurück, die eine Kopie von iCount Zeichen ab der Position iIndex aus String darstellt. Wenn iCount größer als die Länge der Zeichenfolge String ist, wird das Ergebnis abgeschnitten. Wenn iIndex größer als die Länge der Zeichenfolge String ist, wird eine leere Zeichenfolge zurückgegeben. |
|
|
iResult = LazUtf8.Length(String) Gibt die Anzahl der UTF-8-Zeichen in einer Zeichenfolge zurück. |
|
|
sResult = LazUtf8.UpperCase(String) Akzeptiert eine Zeichenfolge und gibt eine Kopie dieser Zeichenfolge zurück, in der alle Kleinbuchstaben in Großbuchstaben umgewandelt wurden. |
|
|
sResult = LazUtf8.LowerCase(String) Akzeptiert eine Zeichenfolge und gibt eine Kopie dieser Zeichenfolge zurück, in der alle Großbuchstaben in Kleinbuchstaben umgewandelt wurden. |
|
|
sResult = LazUtf8.ConvertEncoding(String, FromEnc, ToEnc) Konvertiert die Kodierung von String von FromEnc in ToEnc. Liste der unterstützten Kodierungswerte:
Unter Windows (Englisch oder Russisch):
|
|
|
sEnc = LazUtf8.DetectEncoding(String) Gibt die erkannte Kodierung des übergebenen Textes zurück. |
|
Diese Bibliothek enthält Funktionen zur Überprüfung, ob Zeichen zu bestimmten Unicode-Kategorien gehören, sowie zum Abrufen von Zeichenkategorien.
Liste der in dieser Bibliothek verfügbaren Funktionen:
| Zeichenbibliothek | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Funktionsname | Beschreibung | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
iResult = Char.GetUnicodeCategory(Character) Gibt die Unicode-Kategorie des Zeichens
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
bResult = Char.IsDigit(Character) Gibt |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
bResult = Char.IsLetter(Character) Gibt |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
bResult = Char.IsLetterOrDigit(Character) Gibt |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
bResult = Char.IsLower(Character) Gibt |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
bResult = Char.IsUpper(Character) Gibt |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Darüber hinaus unterstützen diese Funktionen die Übergabe von zwei Parametern: Anstelle eines einzelnen Zeichens können wir eine Zeichenfolge und die Position des Zeichens in dieser Zeichenfolge angeben.
Diese Bibliothek enthält Funktionen, die sich auf das Betriebssystem beziehen, unter dem Double Commander ausgeführt wird.
Liste der in dieser Bibliothek verfügbaren Funktionen:
| Betriebssystembibliothek | |
|---|---|
| Funktionsname | Beschreibung |
|
iResultCode = os.execute(sCommand) Führt sCommand aus, als ob es in der Befehlszeile eingegeben worden wäre, und gibt den Ergebnismeldungscode der Operation zurück. sCommand kann Folgendes sein:
|
|
|
sTempFileName = os.tmpname() Gibt einen Namen zurück, der als temporärer Dateiname (im temporären Systemverzeichnis) verwendet werden kann. |
|
|
bResult, sError, iError = os.remove(sFileName) Löscht die Datei oder das Verzeichnis namens sFileName. Gibt bei Erfolg Bei einem Fehler gibt die Funktion drei Werte zurück:
|
|
|
bResult, sError, iError = os.rename(sOldName, sNewName) Benennt die Datei sOldName in sNewName um. HINWEIS: Wenn eine Datei namens sNewName bereits existiert, wird sie überschrieben! Gibt bei Erfolg Bei einem Fehler gibt die Funktion drei Werte zurück:
|
|
|
Value = os.getenv(VariableName) Gibt den Wert Value der als Parameter übergebenen Umgebungsvariable VariableName zurück. |
|
|
os.setenv(VariableName, Value) Fügt die Umgebungsvariable VariableName hinzu oder ändert sie. Tritt ein Fehler auf, gibt die Funktion -1 zurück. |
|
|
os.unsetenv(VariableName) Entfernt die Umgebungsvariable VariableName. Tritt ein Fehler auf, gibt die Funktion -1 zurück. |
|