Double Commander

2.15. Scripts Lua

Contenu

1. Introduction
2. DLL requises
3. Bibliothèques de fonctions de Double Commander
3.1. Bibliothèque DC
3.1.1. Exemple d'utilisation de DC.ExecuteCommand
3.2. Bibliothèque Système (SysUtils)
3.2.1. Détails sur la valeur de retour de SysUtils.FileGetAttr
3.2.2. Exemple d'utilisation de SysUtils.FileGetAttr
3.2.3. Exemple d'utilisation de FindFirst, FindNext et FindClose
3.3. Bibliothèque Presse-papiers (Clipbrd)
3.3.1. Exemple d'utilisation de la bibliothèque Presse-papiers
3.4. Bibliothèque Dialogues (Dialogs)
3.4.1. Boutons affichés dans Dialogs.MessageBox
3.4.2. Styles de fenêtre de Dialogs.MessageBox
3.4.3. Bouton actif par défaut de Dialogs.MessageBox
3.4.4. Valeurs de retour de Dialogs.MessageBox
3.4.5. Exemple d'utilisation de Dialogs.MessageBox
3.4.6. Exemple d'utilisation de Dialogs.InputQuery
3.5. Bibliothèque UTF-8 (LazUtf8)
3.6. Bibliothèque Caractères (Char)
3.7. Bibliothèque Système d'exploitation (os)
4. Index

1. Introduction

Pour des informations détaillées sur le langage de programmation de script Lua, veuillez visiter le site web de Lua.

Double Commander peut exécuter des scripts Lua via la commande cm_ExecuteScript.
Les paramètres du script doivent être transmis tels quels, sans échappement (sans guillemets ni "\"), pour cela nous devons utiliser la variable %"0 : par exemple, pour le fichier sous le curseur, utilisez %"0%p0 au lieu de %p0, et pour le répertoire courant, utilisez %"0%D au lieu de %D. Sinon, si Double Commander ajoute automatiquement des guillemets, ils seront transmis comme faisant partie des paramètres et vous devrez en tenir compte.
Pour obtenir une liste de tous les fichiers sélectionnés, nous pouvons utiliser des variables (%LU, %FU ou %RU) ou des commandes internes (cm_SaveSelectionToFile, cm_SaveFileDetailsToFile, cm_CopyFullNamesToClip ou cm_CopyFileDetailsToClip). Par exemple, nous pouvons utiliser %p : dans ce cas, Double Commander transmettra les noms de tous les fichiers sélectionnés sur une seule ligne, en séparant les noms par des espaces.

Les scripts Lua peuvent également être utilisés pour écrire des plugins de contenu, des exemples peuvent être trouvés dans le dossier du programme (plugins/wdx/scripts). Il existe une page dédiée au développement de plugins sur le Wiki. Limitations : seuls les types de données suivants sont pris en charge

La liste ci-dessus contient les noms des fichiers d'en-tête, dans les scripts Lua, nous devons utiliser les valeurs numériques spécifiées entre parenthèses.


À propos de l'encodage du texte

Toutes les fonctions supplémentaires décrites ci-dessous acceptent des arguments de chaîne encodés en UTF-8 et retournent des chaînes avec cet encodage (à l'exception de la fonction LazUtf8.ConvertEncoding).

Certaines fonctions des bibliothèques Lua standard ont été remplacées par des fonctions de Double Commander ou de Free Pascal/Lazarus (ou de nouvelles fonctions ont été écrites), ce qui assure le support de l'UTF-8.

Lors de l'écriture de plugins, nous devrions également utiliser l'UTF-8 pour les données textuelles (ft_multiplechoice, ft_string et ft_fulltext).

Lors de l'enregistrement de scripts, veuillez utiliser l'encodage UTF-8 sans BOM.


Remarques

L'utilisation de Lua pour l'automatisation offre de grandes possibilités, mais dans certains cas, il faut prêter attention à certains détails. Essayons de les rassembler dans cette sous-section.

1. Si les options Actualisation automatique et Chargement de la liste de fichiers dans un thread séparé sont activées, la fonction d'actualisation fonctionnera de manière asynchrone. Parallèlement, le script s'exécute dans le thread principal de Double Commander, ce qui peut affecter l'exécution de votre script dans certains cas. Par exemple, l'exécution consécutive de commandes de navigation peut parfois ne pas fonctionner (par exemple, grands répertoires, disques lents). Dans ce cas, essayez de désactiver Chargement de la liste de fichiers dans un thread séparé ou cherchez une solution alternative.

Si votre script crée de nouveaux fichiers ou renomme des fichiers existants dans le panneau actuel, mais ne se termine pas ensuite et effectue des opérations supplémentaires (par exemple, sélection de fichiers ou déplacement du curseur), dans certains cas, ces opérations ne prendront pas effet : il se peut que tous les fichiers ne soient pas encore dans le panneau, vous devez d'abord appeler la commande cm_Refresh. Dans les conditions mentionnées, cm_Refresh s'exécutera également de manière asynchrone, et Double Commander pourrait ne pas avoir le temps de rafraîchir complètement la liste des fichiers après vos modifications.

L'actualisation automatique et le chargement de la liste de fichiers dans un thread séparé sont des fonctionnalités pratiques du gestionnaire de fichiers. Une méthode de travail stable a donc été trouvée expérimentalement, consistant à rendre temporairement le contrôle au programme et à permettre à la liste des fichiers de se rafraîchir complètement :

DC.ExecuteCommand("cm_Refresh")
i = 10
while i > 0 do
  SysUtils.Sleep(10)
  DC.ExecuteCommand("")
  i = i - 1
end

2. La fonction Lua io.open utilise la fonction C standard fopen : en mode texte, cette fonction peut convertir les types de fin de ligne (CRLF, LF ou CR) lors de la lecture et de l'écriture, ce qui peut entraîner des résultats inattendus. Si vous travaillez avec des fichiers ayant différents types de fin de ligne ou si vous écrivez des scripts multiplateformes, vous devez en tenir compte, ou plus pratiquement, privilégier le mode binaire.

3. Sous Linux et d'autres systèmes d'exploitation de type Unix, pour la boîte de dialogue Propriétés du fichier, la fonction ContentGetValue est appelée avec le drapeau CONTENT_DELAYIFSLOW (quatrième paramètre, valeur 1), ce qui évite les retards lors de l'ouverture de la fenêtre : si la récupération des données est lente, nous pouvons exclure ces données en ajoutant simplement une vérification de la valeur du drapeau et en retournant nil pour ces champs ou plugins.

4. Si un plugin doit retourner une chaîne vide, transmettre nil est plus rapide que de transmettre "".

2. DLL requises

Pour pouvoir interpréter les fichiers de script Lua, nous avons besoin d'un fichier DLL Lua. Double Commander prend en charge les versions 5.1 à 5.4.

Nous pouvons utiliser les fichiers DLL du projet LuaJIT. LuaJIT combine un interpréteur haute vitesse écrit en assembleur avec un compilateur JIT avancé. De plus, nous obtenons la bibliothèque FFI, qui permet d'appeler des fonctions C externes et d'utiliser des structures de données C depuis du code Lua pur.

Les versions Windows de DC incluent par défaut la DLL Lua (provenant du projet LuaJIT dans DC 0.9.7 et versions ultérieures). Dans d'autres cas, nous pouvons la trouver et l'installer via un gestionnaire de paquets, ou la compiler nous-mêmes. Si nous utilisons la version 64 bits de DC, la DLL doit également être en version 64 bits.

Par défaut, DC recherche des fichiers nommés lua5.1.dll (Windows), liblua5.1.so.0 (Unix ou GNU/Linux) ou liblua5.1.dylib (macOS) dans son répertoire et dans les répertoires système. Nous pouvons changer le nom du fichier (et le chemin) dans le paramètre Bibliothèque Lua à utiliser.

3. Bibliothèques de fonctions de Double Commander

Double Commander fournit plusieurs bibliothèques de fonctions pour nos scripts Lua.

Voici la liste de ces bibliothèques.

Liste des bibliothèques
Nom de la bibliothèqueNom dans le scriptBrève description
DCFonctions spécifiques à Double Commander
SysUtilsDiverses fonctions système
ClipbrdFournit des fonctions pour le presse-papiers externe
DialogsInteraction avec l'utilisateur
LazUtf8Fonctions pour les chaînes UTF-8
CharObtenir des informations sur les caractères
osFonctions liées au système d'exploitation

3.1. Bibliothèque DC

Cette bibliothèque contient des fonctions spécifiques à Double Commander.

Elle fournit toutes ses fonctions dans la table DC.

Bibliothèque DC
Nom de la fonctionDescription

DC.LogWrite(sMessage, iMsgType, bForce, bLogFile)

Écrit un message dans la fenêtre de journalisation (log) :

  • sMessage : Texte du message.
  • iMsgType : Type de message : 0 - Info, 1 - Succès, 2 - Erreur.
  • bForce : Booléen, si true, affiche la fenêtre de journalisation si elle n'est pas visible.
  • bLogFile : Booléen, si true, écrit également le message dans le fichier de journalisation.

iPanel = DC.CurrentPanel()

Obtient le panneau actif : retourne 0 si le panneau de gauche est actif, sinon retourne 1.

DC.CurrentPanel(iPanel)

Définit le panneau actif : iPanel égal à 0 pour le panneau de gauche, égal à 1 pour le panneau de droite.

DC.ExecuteCommand(sCommand, Param1, Param2,...,ParamX)

Cela permet au script d'appeler les commandes internes de Double Commander.

sCommand est le nom réel de la commande interne.

On peut fournir autant de paramètres Param... que la commande en supporte.

En plus des commandes internes, nous pouvons également utiliser la commande spéciale cm_ExecuteToolBarItem dans les scripts, qui permet d'appeler un bouton de la barre d'outils via son identifiant (dans le programme, cette fonction permet d'utiliser des raccourcis clavier pour les boutons de la barre d'outils). Cette commande s'utilise comme une commande interne normale (voir l'exemple ci-dessous) et possède les paramètres suivants :

Paramètre Valeur Description
ToolBarID TfrmOptionsToolbar Bouton de la barre d'outils principale
TfrmOptionsToolbarMiddle Bouton de la barre d'outils intermédiaire
(Absent) Bouton de la barre d'outils principale
ToolItemID Identifiant Identifiant unique du bouton

L'identifiant unique est stocké dans la balise ID, et nous avons plusieurs façons de l'obtenir : on peut trouver le bouton dans le fichier doublecmd.xml, dans les fichiers de sauvegarde de la barre d'outils, ou simplement copier le bouton dans le presse-papiers et coller son code dans un éditeur de texte.

Note : Les identifiants sont générés automatiquement et ne correspondent pas nécessairement aux identifiants de boutons similaires dans une autre copie du programme, mais nous pouvons définir manuellement nos propres valeurs si nécessaire.

3.1.1. Exemple d'utilisation de DC.ExecuteCommand

Dans cet exemple, nous avons écrit un script simple qui fera les choses suivantes :

  1. Donner le focus au panneau de droite
  2. Fermer tous les onglets ouverts
  3. Passer à un dossier spécifique
  4. Donner le focus au panneau de gauche
  5. Fermer tous les onglets ouverts
  6. Passer à un dossier spécifique
  7. Ouvrir un nouvel onglet
  8. Passer à un dossier spécifique
-- 1. Focus sur le panneau de droite.
DC.ExecuteCommand("cm_FocusSwap", "side=right")

-- 2. Fermer tous les onglets.
DC.ExecuteCommand("cm_CloseAllTabs")

-- 3. Aller dans un répertoire spécifique.
DC.ExecuteCommand("cm_ChangeDir", "E:\\FakeKey\\Documents\\Music")

-- 4. Focus sur le panneau de gauche.
DC.ExecuteCommand("cm_FocusSwap", "side=left")

-- 5. Fermer tous les onglets.
DC.ExecuteCommand("cm_CloseAllTabs")

-- 6. Aller dans un répertoire spécifique.
DC.ExecuteCommand("cm_ChangeDir", "C:\\Users\\Public\\Music")

-- 7. Ouvrir un nouvel onglet.
DC.ExecuteCommand("cm_NewTab")

-- 8. Aller dans un répertoire spécifique.
DC.ExecuteCommand("cm_ChangeDir", "E:\\VirtualMachines\\ShareFolder")

En utilisant la commande interne cm_ExecuteScript, nous pouvons configurer un bouton de la barre d'outils pour exécuter notre script.

Supposons que ce fichier de script est E:\scripts\lua\music.lua, nous pouvons configurer le bouton comme ceci :

Appeler un script Lua depuis la barre d'outils

De plus, nous pouvons utiliser l'éditeur interne de Double Commander pour modifier les scripts. Si le nom du fichier a l'extension .lua, l'éditeur interne le reconnaîtra et fournira une coloration syntaxique pour le langage Lua :

Coloration syntaxique Lua avec l'éditeur interne

3.2. Bibliothèque Système (SysUtils)

Cette bibliothèque contient diverses fonctions système.

Elle fournit toutes ses fonctions dans la table SysUtils.

Bibliothèque Système
Nom de la fonctionDescription

SysUtils.Sleep(iMilliseconds)

Met en pause l'exécution du script pendant le nombre de millisecondes spécifié iMilliseconds.
Une fois le temps écoulé, l'exécution du script reprend.

SysUtils.GetTickCount()

Retourne un compte de tics (ticks) d'horloge croissant. Il peut être utilisé pour mesurer le temps, mais ne présumez pas de l'intervalle entre les tics.

bExists = SysUtils.FileExists(sFileName)

Vérifie si un fichier spécifique existe dans le système de fichiers.

Retourne la valeur true dans bExists si un fichier nommé sFileName existe sur le disque, sinon retourne false.

bExists = SysUtils.DirectoryExists(sDirectory)

Vérifie si sDirectory existe dans le système de fichiers et s'il s'agit bien d'un répertoire.

Si c'est le cas, la fonction retourne la valeur true dans bExists, sinon retourne false.

iAttr = SysUtils.FileGetAttr(sFileName)

Retourne les paramètres d'attributs du fichier sFileName dans iAttr.

Voir ici pour une explication détaillée des valeurs de retour.

Handle, FindData = SysUtils.FindFirst(sPath)

Recherche les fichiers correspondant à sPath, généralement en utilisant des caractères génériques (wildcards).

Si aucun fichier n'est trouvé, Handle sera nil.

Lorsqu'au moins un élément est trouvé, le Handle retourné peut être utilisé dans les appels suivants à SysUtils.FindNext pour trouver d'autres correspondances pour le même motif.

La table FindData contient des informations sur le fichier ou le répertoire trouvé.

Les champs de la table FindData sont les suivants :

  • Name : Nom du fichier (sans le chemin).
  • Attr : Attributs du fichier (voir ici pour plus de détails).
  • Size : Taille du fichier (en octets).
  • Time : Horodatage du fichier (nombre de secondes écoulées depuis le 1er janvier 1970).

Result, FindData = SysUtils.FindNext(Handle)

Recherche la correspondance suivante d'une séquence de recherche initiée par FindFirst, en réutilisant le Handle précédemment retourné.

Si un fichier ou un répertoire est trouvé, le Result retourné sera non vide, sinon il sera nil.

Les mêmes remarques que pour SysUtils.FindFirst s'appliquent ici.

Remarque : Un dernier appel à SysUtils.FindNext doit toujours être suivi d'un appel à SysUtils.FindClose en utilisant le même Handle. Sinon, cela entraînera une fuite de mémoire.

SysUtils.FindClose(Handle)

Termine une série d'appels à SysUtils.FindFirst/SysUtils.FindNext.

Libère toute mémoire utilisée par ces appels.

Il est absolument nécessaire d'effectuer cet appel, sous peine de provoquer une fuite de mémoire.

bResult = SysUtils.CreateDirectory(sDirectory)

Crée une série de répertoires, sDirectory étant le chemin complet du répertoire.

Retourne true si sDirectory existe déjà ou a été créé avec succès. Retourne false si la création d'une partie quelconque a échoué.

bResult = SysUtils.CreateHardLink(sFileName, sLinkName)

Crée un lien matériel (hard link) sLinkName vers le fichier sFileName.

Retourne true en cas de succès, sinon false.

bResult = SysUtils.CreateSymbolicLink(sFileName, sLinkName)

Crée un lien symbolique sLinkName vers le fichier ou le répertoire sFileName.

Retourne true en cas de succès, sinon false.

sTarget = SysUtils.ReadSymbolicLink(sLinkName, bRecursive)

Lit la cible du lien symbolique sLinkName.

Si bRecursive est true et que le lien pointe vers un autre lien, il est résolu récursivement jusqu'à ce qu'un nom de fichier valide (non-lien) soit trouvé.

Retourne le chemin vers lequel pointe le lien symbolique sLinkName, ou une chaîne vide si le lien n'est pas valide ou si le fichier vers lequel il pointe n'existe pas et que bRecursive est true.

sName = SysUtils.ExtractFileName(sFileName)

Extrait la partie nom de fichier d'un nom de fichier avec son chemin complet.

Le nom de fichier se compose de tous les caractères situés après le dernier caractère séparateur de répertoire ("/" ou "\") ou après la lettre du lecteur.

sExt = SysUtils.ExtractFileExt(sFileName)

Retourne l'extension du nom de fichier (tous les caractères après le dernier "." (point), y compris le caractère ".").

sPath = SysUtils.ExtractFilePath(sFileName)

Extrait le chemin (y compris la lettre du lecteur) du nom de fichier.

Le chemin se compose de tous les caractères situés avant le dernier caractère séparateur de répertoire ("/" ou "\"), y compris le séparateur lui-même.

sDir = SysUtils.ExtractFileDir(sFileName)

Extrait uniquement la partie répertoire de sFileName, y compris la lettre du lecteur.

Le nom du répertoire n'a pas de séparateur de répertoire final, contrairement à SysUtils.ExtractFilePath.

sDrive = SysUtils.ExtractFileDrive(sFileName)

Extrait la partie lecteur (drive) du nom de fichier.

Veuillez noter que certains systèmes d'exploitation ne supportent pas les lettres de lecteur.

sName = SysUtils.GetAbsolutePath(sFileName, sBaseDirectory)

Retourne le chemin absolu (complet) du fichier :

  • sFileName : Nom de fichier avec chemin relatif.
  • sBaseDirectory : Répertoire utilisé comme base pour sFileName.

Si le chemin absolu ne peut être obtenu, la fonction retourne la valeur de sFileName.

sName = SysUtils.GetRelativePath(sFileName, sBaseDirectory)

Retourne le nom du fichier par rapport au répertoire spécifié :

  • sFileName : Nom de fichier complet (absolu).
  • sBaseDirectory : Répertoire qui sera utilisé comme base pour sFileName.

Si sFileName et sBaseDirectory contiennent la même valeur, la fonction retourne une chaîne vide (""). Si le nom de fichier avec chemin relatif ne peut être obtenu, la fonction retourne la valeur de sFileName.

bResult = SysUtils.MatchesMask(sFileName, sMask, iMaskOptions)

Retourne true si sFileName correspond au masque sMask transmis.

iMaskOptions (paramètre optionnel, 0 par défaut) est défini comme la somme des valeurs suivantes :

Valeur Description
1
Sensible à la casse
2
Ignorer les accents et les ligatures
4
Filtre style Windows : "*.*" correspond aussi aux fichiers sans extension, etc.
8
Activer le support Pinyin (le fichier pinyin.tbl sera utilisé)

bResult = SysUtils.MatchesMaskList(sFileName, sMaskList, sSeparator, iMaskOptions)

Retourne true si sFileName correspond à au moins un des masques transmis dans sMaskList, séparés par sSeparator (";" par défaut).

sSeparator et iMaskOptions (voir ci-dessus) sont des paramètres optionnels.

sTempFileName = SysUtils.GetTempName()

Retournera un nom de fichier utilisable comme nom de fichier temporaire (dans le répertoire système des fichiers temporaires), similaire à la fonction os.tmpname, mais le fichier sera créé dans un sous-répertoire qui sera automatiquement supprimé à la fermeture de Double Commander.
Si la fonction ne peut pas créer de nom unique, elle retourne une chaîne vide.

SysUtils.PathDelim

Caractère utilisé par le système d'exploitation actuel pour séparer les noms de répertoires dans un nom de fichier complet.

Dans les systèmes Unix/Linux, le séparateur de répertoire sera "/", et sous Windows, ce sera "\".

3.2.1. Détails sur la valeur de retour de SysUtils.FileGetAttr

FileGetAttr retourne les paramètres d'attributs du fichier sFileName.

Les attributs sont une combinaison OU des constantes suivantes :

Constantes utilisées dans la valeur de retour de SysUtils.FileGetAttr
ValeurSignification
0x00000001
faReadOnly
Le fichier est en lecture seule.
0x00000002
faHidden
Le fichier est caché.
Sous Unix/Linux, cela signifie que le nom du fichier commence par un point.
0x00000004
faSysFile
Le fichier est un fichier système.
Sous Unix/Linux, cela signifie que le fichier est un périphérique caractère ou bloc, un tube nommé (FIFO).
0x00000008
faVolumeId
Nom de volume.
Uniquement applicable aux systèmes de fichiers FAT ordinaires (non VFAT ou FAT32) sous DOS/Windows.
0x00000010
faDirectory
Le fichier est un répertoire.
0x00000020
faArchive
Le fichier est archivé.
Impossible sous Unix/Linux.
0x00000400
faSymLink
Le fichier est un lien symbolique.
Note : En cas d'erreur, -1 sera retourné.

Voir l'exemple dans la section suivante.

3.2.2. Exemple d'utilisation de SysUtils.FileGetAttr

Le script suivant est un exemple d'utilisation de SysUtils.FileGetAttr.

Lorsqu'il détecte que le paramètre est un répertoire, il ouvre un nouvel onglet dans le panneau actif et passe à ce répertoire.

local params = {...}
local iAttr

if #params == 1 then -- Avons-nous au moins un paramètre ?
  iAttr = SysUtils.FileGetAttr(params[1])
  if iAttr > 0 then -- Avons-nous obtenu un attribut valide ?
    if math.floor(iAttr / 0x00000010) % 2 ~= 0 then
      -- Le 4ème bit est défini ? C'est donc un répertoire.
      DC.ExecuteCommand("cm_NewTab")
      DC.ExecuteCommand("cm_ChangeDir", params[1])
    end
  end
end

Dans l'exemple ci-dessus, params[1] est le premier paramètre transmis au script.

Lorsqu'on utilise la commande interne cm_ExecuteScript, il s'agira du premier paramètre transmis après le nom du fichier script.

Ainsi, dans notre exemple, nous pourrions configurer un bouton de la barre d'outils comme ceci :

Utilisation des paramètres avec cm_ExecuteScript

Dans cet exemple, le paramètre %"0%p sera transmis au script. Cela représente le nom du fichier de l'élément sélectionné dans le panneau actuellement actif, sans guillemets.

3.2.3. Exemple d'utilisation de FindFirst, FindNext et FindClose

Dans l'exemple de script suivant, nous allons scanner le contenu du répertoire reçu en paramètre et stocker les données résultantes dans un fichier texte dont le nom est transmis comme second paramètre.

Cela nous donnera une bonne idée de l'utilisation de FindFirst, FindNext et FindClose.

local params = {...}

if #params == 2 then -- Avons-nous deux paramètres ?
  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

Dans l'exemple ci-dessus, nous devons transmettre deux paramètres au script :

  1. params[1] - Le répertoire dont nous voulons le contenu
  2. params[2] - Le nom du fichier de sortie pour stocker les résultats

Il est donc très facile de configurer un bouton de la barre d'outils avec la commande interne cm_ExecuteScript et de transmettre les paramètres pour accomplir tout cela.

Utilisation des paramètres avec cm_ExecuteScript

Dans cet exemple, le paramètre %"0%Ds sera transmis comme premier argument au script. Cela représentera le répertoire affiché par le panneau actif, sans guillemets.

3.3. Bibliothèque Presse-papiers (Clipbrd)

Double Commander peut fournir des fonctions pour le presse-papiers externe à nos scripts Lua.

Le tableau ci-dessous donne les fonctions correspondantes :

Bibliothèque Presse-papiers
Nom de la fonctionDescription

Clipbrd.Clear()

Efface le contenu du presse-papiers.

sVar = Clipbrd.GetAsText()

Récupère le contenu textuel actuel du presse-papiers et l'assigne à sVar. Si le presse-papiers ne contient pas de texte, la fonction retourne une chaîne vide.

Clipbrd.SetAsText(sVar)

Stocke le contenu textuel de sVar dans le presse-papiers.

Clipbrd.SetAsHtml(sHtml)

Ajoute le texte au format html sHtml au presse-papiers (format de presse-papiers CF_HTML).

Ce contenu sera inséré dans les applications supportant ce format de presse-papiers, telles que MS Word, LO Writer, etc.

Il est tout à fait correct de stocker des données en utilisant à la fois Clipbrd.SetAsText et Clipbrd.SetAsHtml. Lors du collage, l'application utilisera le meilleur format qu'elle supporte.

Par exemple, nous pourrions avoir ceci :

  • Clipbrd.SetAsText("Bienvenue sur Double Commander !")
  • Clipbrd.SetAsHtml("Bienvenue sur <b>Double Commander</b> !")

Si nous passons au Bloc-notes et essayons de coller quelque chose, il collera le message que nous avons copié avec Clipbrd.SetAsText sous forme de texte brut. Mais si nous passons à Microsoft Word et collons quelque chose, il collera le second, avec Double Commander en gras, car Microsoft Word reconnaît et supporte ce type de contenu de presse-papiers.

3.3.1. Exemple d'utilisation de la bibliothèque Presse-papiers

L'exemple suivant utilise les trois fonctions liées au presse-papiers : Clear, GetAsText et SetAsText.

C'est un script relativement long, mais il combine bien certaines des fonctions vues précédemment.

Il suppose que notre panneau actif se trouve actuellement dans un répertoire contenant de nombreux fichiers texte sources.

Il suppose également que nous avons actuellement un mot dans le presse-papiers, et il recevra le dossier actif actuel comme paramètre unique.

Le script va scanner les fichiers du répertoire actuel un par un et lire leur contenu pour détecter les lignes de texte contenant le mot présent dans le presse-papiers.

Ensuite, les noms des fichiers contenant au moins une ligne avec ce mot seront placés dans le presse-papiers.

Le script utilisera ensuite la commande interne cm_LoadSelectionFromClip, et les fichiers contenant le mot seront sélectionnés.

De plus, à la fin, nous remettrons le mot original à rechercher dans le presse-papiers.

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 -- Avons-nous le paramètre ?
  sSearchString = Clipbrd.GetAsText() -- Obtenir l'expression à rechercher.
  Clipbrd.Clear() -- S'assurer que le presse-papiers est vide.
  DC.ExecuteCommand("cm_MarkUnmarkAll") -- S'assurer que rien n'est sélectionné.

  -- Scannons tous les fichiers du répertoire un par un.
  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 -- Avons-nous obtenu un attribut valide ?
        -- Nous voulons des fichiers, pas des répertoires !
        if math.floor(iAttr / 0x00000010) % 2 == 0 then

          -- Lisons maintenant le fichier ligne par ligne jusqu'à la fin ou jusqu'à trouver.
          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

  -- Si nous avons trouvé quelque chose, sélectionnons-le !
  if sFileToSelect ~= "" then
    Clipbrd.SetAsText(sFileToSelect)
    DC.ExecuteCommand("cm_LoadSelectionFromClip")
  end

  Clipbrd.SetAsText(sSearchString) -- Restaurer le contenu du presse-papiers.
end

3.4. Bibliothèque Dialogues (Dialogs)

Cette bibliothèque permet à nos scripts d'interagir avec l'utilisateur, d'afficher des messages, de demander des réponses, etc.

Le tableau ci-dessous répertorie les fonctions correspondantes :

Bibliothèque Dialogues
Nom de la fonctionDescription

iButton = Dialogs.MessageBox(sMessage, sTitle, iFlags)

Affiche une boîte de message demandant à l'utilisateur de cliquer sur un bouton, lequel sera retourné par la fonction :

  • sMessage : Le texte à l'intérieur de la boîte de message.
  • sTitle : Le titre de la boîte de message.
  • iFlags : Valeur OR bit à bit de constantes déterminant les boutons affichés, le style de la fenêtre et le bouton par défaut. Voir les tableaux ci-dessous pour les boutons affichés, les styles de fenêtre ou le bouton par défaut.
  • iButton : Valeur de retour représentant le bouton sur lequel l'utilisateur a appuyé (voir ce tableau).

bResult, sAnswer = Dialogs.InputQuery(sTitle, sMessage, bMask, sDefault)

Affiche une boîte de saisie où l'utilisateur peut entrer une chaîne :

  • sTitle : Le titre de la boîte de saisie.
  • sMessage : Le texte à l'intérieur de la boîte de saisie.
  • bMask : Booléen, si true, affiche des "astérisques" pour masquer les caractères.
  • sDefault : Texte suggéré par défaut, que l'utilisateur peut modifier si nécessaire.
  • bResult : Retourne un booléen indiquant si l'utilisateur a effectivement saisi quelque chose.
  • sAnswer : Retourne la chaîne saisie par l'utilisateur lorsqu'il clique sur OK.

sItem, iItem = Dialogs.InputListBox(sTitle, sMessage, aItems, sDefault)

Affiche une boîte de dialogue permettant à l'utilisateur de choisir parmi une liste d'éléments :

  • sTitle : Titre de la boîte de dialogue.
  • sMessage : Texte à l'intérieur de la boîte de dialogue.
  • aItems : Une table Lua où chaque élément doit être une chaîne de caractères.
  • sDefault : L'élément de la liste sélectionné par défaut.
  • sItem : Retourne l'élément sélectionné sous forme de chaîne, ou nil si la boîte de dialogue est annulée.
  • iItem : L'index de l'élément sélectionné (commence à 1, conformément à l'habitude des tables Lua).

3.4.1. Boutons affichés dans Dialogs.MessageBox

Les boutons affichés par la fonction Dialogs.MessageBox sont contrôlés par la valeur OR bit à bit des constantes suivantes :

Constantes ButFlags pour les boutons affichés dans Dialogs.MessageBox
Valeur de la constanteBoutons affichés, de gauche à droite
0x0000
MB_OK
Bouton OK
0x0001
MB_OKCANCEL
Bouton OK Bouton ANNULER
0x0002
MB_ABORTRETRYIGNORE
Bouton ABANDONNER Bouton RÉESSAYER Bouton IGNORER
0x0003
MB_YESNOCANCEL
Bouton OUI Bouton NON Bouton ANNULER
0x0004
MB_YESNO
Bouton OUI Bouton NON
0x0005
MB_RETRYCANCEL
Bouton RÉESSAYER Bouton ANNULER

3.4.2. Styles de fenêtre de Dialogs.MessageBox

Le style de fenêtre affiché par la fonction Dialogs.MessageBox est contrôlé par la valeur OR bit à bit des constantes suivantes :

Constantes ButFlags pour les icônes et styles dans Dialogs.MessageBox
Valeur de la constanteStyle de fenêtre
0x0040
MB_ICONINFORMATION
Icône INFORMATION Fenêtre d'information
0x0030
MB_ICONWARNING
Icône AVERTISSEMENT Fenêtre d'avertissement
0x0020
MB_ICONQUESTION
Icône QUESTION Fenêtre de confirmation
0x0010
MB_ICONERROR
Icône ERREUR Fenêtre d'erreur

3.4.3. Bouton actif par défaut de Dialogs.MessageBox

Le bouton actif par défaut affiché par la fonction Dialogs.MessageBox est contrôlé par la valeur OR bit à bit des constantes suivantes :

Constantes ButFlags pour le bouton par défaut dans Dialogs.MessageBox
Valeur de la constanteBouton par défaut
0x0000
MB_DEFBUTTON1
Le premier bouton en partant de la gauche est le bouton par défaut
0x0100
MB_DEFBUTTON2
Le deuxième bouton en partant de la gauche est le bouton par défaut
0x0200
MB_DEFBUTTON3
Le troisième bouton en partant de la gauche est le bouton par défaut

3.4.4. Valeurs de retour de Dialogs.MessageBox

Le nombre retourné par la fonction Dialogs.MessageBox représente le bouton sur lequel l'utilisateur a appuyé, comme suit :

Valeurs ButPressed retournées lors de l'appui sur un bouton dans Dialogs.MessageBox
Valeur de la constanteBouton appuyé
0x0000
mrNone
Aucun bouton appuyé
0x0001
mrOK
Résultat OK
0x0002
mrCancel
Résultat ANNULER
0x0003
mrAbort
Résultat ABANDONNER
0x0004
mrRetry
Résultat RÉESSAYER
0x0005
mrIgnore
Résultat IGNORER
0x0006
mrYes
Résultat OUI
0x0007
mrNo
Résultat NON

Note : Si vous fermez la fenêtre en appuyant sur le "x" dans le coin supérieur droit ou en appuyant sur Échap, la valeur du bouton "Annuler" sera retournée.

3.4.5. Exemple d'utilisation de Dialogs.MessageBox

Voici un petit script utilisant Dialogs.MessageBox ainsi que la fenêtre de résultat qui sera affichée :

-- Boutons affichés
MB_OK = 0x0000
MB_OKCANCEL = 0x0001
MB_ABORTRETRYIGNORE = 0x0002
MB_YESNOCANCEL = 0x0003
MB_YESNO = 0x0004
MB_RETRYCANCEL = 0x0005

-- Style de la fenêtre
MB_ICONINFORMATION = 0x0040
MB_ICONWARNING = 0x0030
MB_ICONQUESTION = 0x0020
MB_ICONERROR = 0x0010

-- Bouton par défaut
MB_DEFBUTTON1 = 0x0000
MB_DEFBUTTON2 = 0x0100
MB_DEFBUTTON3 = 0x0200

-- Retour du bouton appuyé
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("Voulez-vous quitter ?", "Question", iFlags)

if iButton == mrYes then
  DC.ExecuteCommand("cm_Exit")
end

Exemple d'utilisation de Dialogs.MessageBox

3.4.6. Exemple d'utilisation de Dialogs.InputQuery

Voici un petit script utilisant Dialogs.InputQuery ainsi que la fenêtre de résultat qui sera affichée :

bResult, sAnswer = Dialogs.InputQuery("Authentification", "Veuillez entrer votre nom :", false, "Jean")

if bResult == true then
  Dialogs.MessageBox("Bonjour " .. sAnswer .. " !", "Bienvenue !", 0x0040)
end

Exemple d'utilisation de Dialogs.InputQuery

3.5. Bibliothèque UTF-8 (LazUtf8)

Cette bibliothèque fournit un support de base pour l'encodage UTF-8.

Elle fournit toutes ses fonctions dans la table LazUtf8.

Bibliothèque UTF-8
Nom de la fonctionDescription

iResult = LazUtf8.Pos(SearchText, SourceText, Offset)

Recherche une sous-chaîne dans une chaîne en commençant par une position spécifiée. La recherche est sensible à la casse.

Retourne la position de la première occurrence de la sous-chaîne SearchText dans la chaîne SourceText, la recherche commençant à la position Offset (1 par défaut).

Si SearchText n'apparaît pas dans SourceText après l' Offset donné, retourne zéro.

LazUtf8.Next(String)

Une fonction itératrice qui retourne, à chaque appel, le caractère suivant dans String ainsi que la position de début de ce caractère (en octets).

Exemple :

-- Affiche les paires sous la forme "Position : Caractère"
for iPos, sChar in LazUtf8.Next(String) do
  DC.LogWrite(iPos .. " : " .. sChar)
end

sResult = LazUtf8.Copy(String, iIndex, iCount)

Copie une partie d'une chaîne.

Copy retourne une chaîne qui est une copie de iCount caractères de String en commençant à la position iIndex.

Si iCount est supérieur à la longueur de la chaîne String, le résultat sera tronqué. Si iIndex est supérieur à la longueur de la chaîne String, une chaîne vide est retournée.

iResult = LazUtf8.Length(String)

Retourne le nombre de caractères UTF-8 dans la chaîne.

sResult = LazUtf8.UpperCase(String)

Prend une chaîne et retourne une copie de cette chaîne où toutes les lettres minuscules ont été changées en majuscules.

sResult = LazUtf8.LowerCase(String)

Prend une chaîne et retourne une copie de cette chaîne où toutes les lettres majuscules ont été changées en minuscules.

sResult = LazUtf8.ConvertEncoding(String, FromEnc, ToEnc)

Convertit l'encodage de String de FromEnc vers ToEnc.

Liste des valeurs d'encodage supportées :

  • Encodage système par défaut (selon les paramètres régionaux du système) : "default".
  • Encodage ANSI (Windows) par défaut (selon les paramètres régionaux du système) : "ansi".
  • Encodage OEM (DOS) par défaut (selon les paramètres régionaux du système) : "oem".
  • Unicode : "utf8", "utf8bom", "ucs2le", "ucs2be".
  • ANSI (Windows) : "cp1250", "cp1251", "cp1252", "cp1253", "cp1254", "cp1255", "cp1256", "cp1257", "cp1258".
  • OEM (DOS) : "cp437", "cp850", "cp852", "cp865", "cp866", "cp874", "cp932", "cp936", "cp949", "cp950".
  • ISO 8859 : "iso88591", "iso88592", "iso88593", "iso88594", "iso88595", "iso88597", "iso88599", "iso885910", "iso885913", "iso885914", "iso885915", "iso885916".
  • Autres : "macintosh", "koi8r", "koi8u", "koi8ru".
Signification des encodages spéciaux (exemples).

Sous Windows (anglais ou russe) :
  • "default" - cp1252 ou cp1251
  • "ansi" - cp1252 ou cp1251
  • "oem" - cp850 ou cp866
Sous Linux (anglais ou russe) :
  • "default" - utf8
  • "ansi" - cp1252 ou cp1251
  • "oem" - cp850 ou cp866

sEnc = LazUtf8.DetectEncoding(String)

Retourne la valeur de l'encodage du texte transmis.
La liste des encodages supportés est similaire à celle utilisée dans la fonction LazUtf8.ConvertEncoding.

3.6. Bibliothèque Caractères (Char)

Cette bibliothèque contient des fonctions pour vérifier si un caractère appartient à une catégorie Unicode spécifique, ainsi que pour obtenir la catégorie d'un caractère.

Liste des fonctions disponibles dans cette bibliothèque :

Bibliothèque Caractères
Nom de la fonctionDescription

iResult = Char.GetUnicodeCategory(Character)

Retourne la catégorie Unicode du caractère Character, l'une des valeurs suivantes :

ValeurDescription
  Lettre :
0Lettre majuscule (Lu)
1Lettre minuscule (Ll)
2Lettre de titre (Lt)
3Lettre modificatrice (Lm)
4Autre lettre (Lo)
  Marque :
5Marque sans espacement (Mn)
6Marque de combinaison avec espacement (Mc)
7Marque d'encadrement (Me)
  Nombre :
8Chiffre décimal (Nd)
9Chiffre lettre (Nl)
10Autre nombre (No)
  Ponctuation :
11Ponctuation de connexion (Pc)
12Ponctuation de trait d'union (Pd)
13Ponctuation d'ouverture (Ps)
14Ponctuation de fermeture (Pe)
15Ponctuation initiale (Pi)
16Ponctuation finale (Pf)
17Autre ponctuation (Po)
  Symbole :
18Symbole mathématique (Sm)
19Symbole monétaire (Sc)
20Symbole modificateur (Sk)
21Autre symbole (So)
  Séparateur :
22Séparateur d'espace (Zs)
23Séparateur de ligne (Zl)
24Séparateur de paragraphe (Zp)
  Autre :
25Contrôle (Cc)
26Format (Cf)
27Substitut (Surrogate) (Cs)
28Usage privé (Co)
29Non attribué (Cn)

bResult = Char.IsDigit(Character)

Retourne true si le caractère Character est dans la catégorie Nd.

bResult = Char.IsLetter(Character)

Retourne true si le caractère Character est dans les catégories Lu, Ll, Lt, Lm ou Lo.

bResult = Char.IsLetterOrDigit(Character)

Retourne true si le caractère Character est dans les catégories Lu, Ll, Lt, Lm, Lo, Nd ou Nl.

bResult = Char.IsLower(Character)

Retourne true si le caractère Character est dans la catégorie Ll.

bResult = Char.IsUpper(Character)

Retourne true si le caractère Character est dans la catégorie Lu.

De plus, ces fonctions supportent l'utilisation de deux paramètres : nous pouvons spécifier une chaîne et la position du caractère dans cette chaîne, au lieu d'un seul caractère.

3.7. Bibliothèque Système d'exploitation (os)

Cette bibliothèque contient des fonctions liées au système d'exploitation sur lequel Double Commander s'exécute.

Voici la liste des fonctions disponibles dans cette bibliothèque :

Bibliothèque Système d'exploitation
Nom de la fonctionDescription

iResultCode = os.execute(sCommand)

Exécutera sCommand comme si elle était tapée dans la ligne de commande, et retournera le code de résultat de l'opération.

sCommand peut être :

  • Une commande du terminal, par exemple os.execute("dir > all.txt")
  • Un fichier exécutable, par exemple os.execute("C:\\Windows\\System32\\calc.exe")
  • Un fichier exécutable avec des paramètres :
    os.execute("C:\\Utils\\fsum.exe -md5 test.bin > md5.txt")

sTempFileName = os.tmpname()

Retournera un nom de fichier utilisable comme nom de fichier temporaire (dans le répertoire système des fichiers temporaires).
Si la fonction ne peut pas créer de nom unique, elle retourne une chaîne vide.

bResult, sError, iError = os.remove(sFileName)

Supprimera le fichier ou le répertoire nommé sFileName.

En cas de succès, la fonction retourne true.

En cas d'échec, la fonction retourne trois choses :

  1. nil pour indiquer l'échec
  2. sError comme description du message d'erreur
  3. iError comme numéro du code d'erreur

bResult, sError, iError = os.rename(sOldName, sNewName)

Renommera le fichier sOldName avec le nouveau nom sNewName.

Attention : Si un fichier nommé sNewName existe déjà, il sera remplacé !

En cas de succès, la fonction retourne true.

En cas d'échec, la fonction retourne trois choses :

  1. nil pour indiquer l'échec
  2. sError comme description du message d'erreur
  3. iError comme numéro du code d'erreur

Value = os.getenv(VariableName)

Retournera la Value de la variable VariableName passée en paramètre.
Si aucune variable de ce nom n'existe, elle retourne nil.

os.setenv(VariableName, Value)

Ajoute ou modifie la variable d'environnement VariableName. En cas d'erreur, la fonction retourne -1.

os.unsetenv(VariableName)

Supprime la variable d'environnement VariableName. En cas d'erreur, la fonction retourne -1.

4. Index

Bibliothèque DC

DC.CurrentPanel
DC.ExecuteCommand
DC.LogWrite


Bibliothèque Système

SysUtils.CreateDirectory
SysUtils.CreateHardLink
SysUtils.CreateSymbolicLink
SysUtils.DirectoryExists
SysUtils.ExtractFileDir
SysUtils.ExtractFileDrive
SysUtils.ExtractFileExt
SysUtils.ExtractFileName
SysUtils.ExtractFilePath
SysUtils.FileExists
SysUtils.FileGetAttr
SysUtils.FindClose
SysUtils.FindFirst
SysUtils.FindNext
SysUtils.GetAbsolutePath
SysUtils.GetRelativePath
SysUtils.GetTempName
SysUtils.GetTickCount
SysUtils.MatchesMask
SysUtils.MatchesMaskList
SysUtils.PathDelim
SysUtils.ReadSymbolicLink
SysUtils.Sleep


Bibliothèque Presse-papiers

Clipbrd.Clear
Clipbrd.GetAsText
Clipbrd.SetAsHtml
Clipbrd.SetAsText


Bibliothèque Dialogues

Dialogs.InputListBox
Dialogs.InputQuery
Dialogs.MessageBox


Bibliothèque UTF-8

LazUtf8.ConvertEncoding
LazUtf8.Copy
LazUtf8.DetectEncoding
LazUtf8.Length
LazUtf8.LowerCase
LazUtf8.Next
LazUtf8.Pos
LazUtf8.UpperCase


Bibliothèque Caractères

Char.GetUnicodeCategory
Char.IsDigit
Char.IsLetter
Char.IsLetterOrDigit
Char.IsLower
Char.IsUpper


Bibliothèque Système d'exploitation

os.execute
os.getenv
os.remove
os.rename
os.setenv
os.tmpname
os.unsetenv


HTML 4.0 Transitional valide CSS valide !