Double Commander

2.15. Lua Yazısı

İçerik

1. Giriş
2. gerekli DLL
3. Double Commander Kullanımı
3.1. DC Kütüphanesi
3.1.1. DC.ExecuteCommand Kullanımı
3.2. Sistem kütüphanesi
3.2.1. SysUtils.FileGetAttr Değer Detayları döndürür
3.2.2. SysUtils.FileGetAttr kullanımı örneği
3.2.3. FindFirst, FindNext ve FindClose kullanma örnekleri
3.3. Pano Kitaplığı
3.3.1. Pano kitaplığı kullanma örneği
3.4. İletişim kutusu kitaplığı
3.4.1. Dialogs.MessageBox 'ta görüntülenen düğmeler
3.4.2. Dialogs.MessageBox için pencere stili
3.4.3. Dialogs.MessageBox için varsayılan etkinlik düğmesi
3.4.4. Dialogs.MessageBox 'ın geri dönüş değeri
3.4.5. Dialogs.MessageBox Kullanımı
3.4.6. Dialogs.InputQuery Kullanımı
3.5. UTF-8 kütüphanesi
3.6. Karakter kitaplıkları
3.7. İşletim Sistemi Kütüphanesi
4. Dizinler

1. Giriş

Lua script programlama dili hakkında daha fazla bilgi için,Lua web sitesiniziyaret edin.

Double Commander, Lua betiklerinicm_ExecuteScriptile çalıştırabilir.
Komut dosyası parametreleri olduğu gibi iletilmelidir, kaçış gerektirmez (tırnak işareti veya "\" gerekmez), bunun için%"0 değişkeninikullanmalıyız: örneğin, imlecin altındaki dosyalar için%"0%p0 Hayır.%p0Mevcut dizin için kullanılır.%"0%D Hayır.%D。Aksi takdirde, Double Commander otomatik olarak tırnak işaretleri eklerse, parametrelerin bir parçası olarak geçecekler, bunu dikkate almanız gerekecek.
Seçili tüm dosyaların bir listesini almak içindeğişkenlerikullanabiliriz (%LU%FU Veya%RUveya dahili komutlar (cm_SaveSelectionToFile,cm_SaveFileDetailsToFile,cm_CopyFullNamesToClip veyacm_CopyFileDetailsToClip). Örneğin, kullanabiliriz.%p: Bu durumda, Double Commander, bir satırda seçilen tüm dosyaların adlarını boşluk ile ayırarak geçirir.

Ayrıca program klasöründe bulunan örnekler Lua komut dosyalarını kullanarak içerik eklentileri de yazabilirsiniz (plugins/wdx/scripts). Wiki 'de eklentileri yazmak için özel olarak kullanılan birsayfavardır. Sınırlamalar: Yalnızca aşağıdaki veri türleri desteklenir

Yukarıdaki liste başlık dosyasındaki adları içerir ve Lua komut dosyasında parantez içinde belirtilen sayısal değerleri kullanmamız gerekir.


Metin kodlama hakkında

Aşağıda açıklanan tüm ek işlevler UTF-8 kodlanmış dize parametrelerini kabul eder ve bu kodlanmış dizeyi döndürür (LazUtf8.ConvertEncodingişlevi hariç).

Standart Lua kütüphanesindeki bazı fonksiyonlar Double Commander veya Free Pascal/Lazarus işlevleriyle değiştirildi (veya UTF-8 desteği sağlayan yeni işlevler yazıldı).

Eklentiler yazarken UTF-8 (ft_multiplechoice,ft_string veft_fulltext) de metin verileri için kullanılmalıdır.

Komut dosyasını kaydederken BOM olmadan UTF-8 kodlamasını kullanın.


Not:

Lua 'yı otomasyon için kullanmak büyük bir olasılık, ancak bazı durumlarda bazı ayrıntılara dikkat etmeniz gerekebilir. Bu bölümde bunları toplamayı deneyelim.

1. Otomatik yenilemeveayrı bir iş parçacığında dosya listesi yükleme seçeneği etkinleştirilmişse, yenileme işlevi eşzamansız çalışır. Aynı zamanda, komut dosyası Double Commander 'in ana iş parçacığında çalışır, bu nedenle bazı durumlarda, tüm bunlar komut dosyanızın çalışmasını etkileyebilir. Örneğin, bazengezinme komutlarınınsürekli çalıştırılması çalışmayabilir (örneğin, büyük dizinler, yavaş diskler), bu durumda,ayrı iş parçacıklarına dosya listelerini yüklemeyidevre dışı bırakmayı deneyin veya alternatif çözümler arayın.

Komut dosyanız geçerli panelde yeni bir dosya oluşturur veya varolan bir dosyayı yeniden adlandırırsa, ancak daha sonra tamamlanmazsa ve bazı ek işlemler (örneğin, bir dosya seçmek veya imlecini hareket ettirmek), bazı durumlarda bu eylemler geçerli olmayacaktır: tüm dosyalar panelde olmayabilir, ilk öncecm_Refresh komutunu çağırmanız gerekir. Belirtilen koşullar altında,cm_Refresh de eşzamansız olarak çalıştırılır ve Double Commander değişikliklerinizden sonra dosya listesini tamamen yenilemek için zamanı olmayabilir.

Otomatik yenileme ve ayrı bir iş parçacığında dosya listelerinin yüklenmesi, dosya yöneticisinin kullanışlı işlevleridir, bu nedenle deneysel olarak, kontrolü geçici olarak programa geri döndürmek ve dosya listesinin tamamen yenilenmesine izin vermek için istikrarlı bir çalışma yöntemi bulunur:

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

2. Lua Fonksiyonlarıio.open Standart C Fonksiyonları KullanımıfopenMetin modunda, bu işlev okuma ve yazma sırasında satır sonu türlerini (CRLF, LF veya CR) dönüştürebilir ve bu da beklenmedik sonuçlara neden olabilir. Farklı satır sonu türlerine sahip bir dosyayla karşılaşıyorsanız veya çapraz platform komut dosyası yazıyorsanız, bunu göz önünde bulundurmalısınız veya ikili modu tercih etmek daha pratik bir uygulamadır.

3. Linux ve diğer Unix benzeri işletim sistemlerinde,dosya özellikleri iletişim kutusu için çağrıContentGetValue Fonksiyon yanındaCONTENT_DELAYIFSLOW Bayrak (dördüncü parametre, değer 1), bu, pencere açıldığında gecikmeyi önler: veri yavaş alıyorsa, sadece bayrak değeri kontrolü ekleyerek ve bu alanlar veya eklentiler için geri döndürebiliriznil bu verileri ortadan kaldırmak için.

4. Eklentinin boş bir dize döndürmesi gerekiyorsa, iletmenil Göndermekten daha iyi"" - Daha hızlı.

2. gerekli DLL

Lua betik dosyasını açıklamak için, bir Lua DLL dosyasına ihtiyacımız var ve Double Commander 5.1 - 5.4 sürümleri destekler.

LuaJITprojesinden DLL dosyalarını kullanabiliriz. LuaJIT, derleme ile yazılmış yüksek hızlı bir yorumlayıcı ve gelişmiş JIT derleyicisini birleştirir. Ek olarak, harici C fonksiyonlarının saf Lua kodundan çağrılmasına ve C veri yapısının kullanılmasına izin veren FFI kütüphanesini de aldık.

DC 'nin Windows sürümü varsayılan olarak Lua DLL' yi içerir (DC 0.9.7 ve sonraki sürümlerinde LuaJIT projesinden) ve diğer durumlarda, paket yöneticisi aracılığıyla bulabilir ve kurabiliriz veya kendi kendimizi derleyebiliriz. DC 'nin 64 bit sürümünü kullanıyorsanız, DLL' nin de 64 bit sürümü olması gerekir.

Varsayılan olarak DC, dizin ve sistem dizinindelua5.1.dll (Windows),liblua5.1.so.0(Unix veya GNU/Linux) veyaliblua5.1.dylib (macOS) adlı dosyaları bulur. Dosya adını (ve yolunu)kullanmak için Lua kitaplığı dosyaparametresinde değiştirebiliriz.

3. Double Commander Kullanımı

Double Commander, Lua betiklerimiz için bazı fonksiyonel kütüphaneler sağlar.

İşte bu kitaplıkların listesi.

Kitaplık Listesi
Kütüphane AdıBetiğin AdıKısa Açıklama
DCDouble Commander
SysUtilsSistem Fonksiyonları
Clipbrdharici pano işlevselliği sağlar
Dialogskullanıcılarla etkileşim
LazUtf8UTF-8 dize işlevi
Charkarakter bilgilerini alır
kütüphanesi ileişletim sistemi ile ilgili fonksiyonlar

3.1. DC Kütüphanesi

Bu kütüphane Double Commander'a özel fonksiyonlar içerir.

Burada.DC Tabloda tüm fonksiyonlar mevcuttur.

DC Kütüphanesi
Fonksiyon AdıTanımı

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

Günlük penceresine mesaj yazmak için:

  • sMessage: Mesaj metni.
  • iMsgType: Mesaj türü: 0 -Bilgi, 1 -Başarı, 2 -Hata.
  • bForce: Boolean değeri, true ise günlük penceresi görünmez olduğunda görüntülenir.
  • bLogFile: Boolean değeri, true ise mesaj günlük dosyasına da yazılır.

Önceki yazı: CurrentPanel()

Etkin paneli alma: Sol panel etkinse 0 döndür, aksi halde 1 döndür.

CurrentPanel(iPanel)

Etkin paneli ayarlama:iPanel 0 değerine eşit olduğunda sol panel, 1'e eşittir sağ panel.

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

Bu komut dosyalarının Double Commander 'iniç komutlarınıçağırmasına izin verir.

sCommand, gerçek iç komut adıdır.

Herhangi bir komut desteği sağlayabiliriz Param.... Parametreler.

İç komutlara ek olarak, komut dosyasındacm_ExecuteToolBarItem, tanımlayıcılar aracılığıyla araç çubuğu düğmelerinin çağrılmasına izin veren özel bir komut da kullanabiliriz (programda, bu özellik araç çubuğu düğmeleri için kısayol kullanma işlevi sağlar). Komut normal iç komutlara benzer şekilde kullanılır (aşağıdaki örneğe bakın) ve aşağıdaki parametrelere sahiptir:

parametreler Değer Tanım
ToolBarID. TfrmOptionsToolbar Ana araç çubuğu düğmeleri
TfrmOptionsToolbarMiddle Orta araç çubuğundaki düğmeler
YOK Ana araç çubuğu düğmeleri
ToolItemID Tanımlayıcı Düğme için benzersiz tanımlayıcı

Eşsiz Tanımlayıcı Burada SaklanırID Etikette bunu elde etmenin birkaç yolu vardır: düğmeyidoublecmd.xmldosyasında, araç çubuğu yedekleme dosyasında bulabilir veya sadece düğmeyi panoya kopyalayabilir ve kodunu metin düzenleyicisinde yapıştırabilirsiniz.

Not: Tanımlayıcılar otomatik olarak oluşturulur ve programın başka bir kopyasında bulunan benzer düğmenin tanımlayıcısıyla eşleşmesi gerekmez, ancak gerekirse kendi değerlerimizi elle ayarlayabilirsiniz.

3.1.1. DC.ExecuteCommand kullanımı örneği

Bu örnekte, aşağıdakileri yapacak basit bir komut dosyası yazdık:

  1. Sağ panele odaklan.
  2. Tüm açık sekmeleri kapat
  3. Belirli bir dizine geç
  4. Sol panele odaklan.
  5. Tüm açık sekmeleri kapat
  6. Belirli bir dizine geç
  7. Yeni Sekme Aç
  8. Belirli bir dizine geç
-- 1. 聚焦到右侧面板。
DC.ExecuteCommand("cm_FocusSwap", "side=right")

-- 2. 关闭所有标签页。
DC.ExecuteCommand("cm_CloseAllTabs")

-- 3. 切换到特定目录。
DC.ExecuteCommand("cm_ChangeDir", "E:\\FakeKey\\Documents\\Music")

-- 4. 聚焦到左侧面板。
DC.ExecuteCommand("cm_FocusSwap", "side=left")

-- 5. 关闭所有标签页。
DC.ExecuteCommand("cm_CloseAllTabs")

-- 6. 切换到特定目录。
DC.ExecuteCommand("cm_ChangeDir", "C:\\Users\\Public\\Music")

-- 7. 打开新标签页。
DC.ExecuteCommand("cm_NewTab")

-- 8. 切换到特定目录。
DC.ExecuteCommand("cm_ChangeDir", "E:\\VirtualMachines\\ShareFolder")

İç komutcm_ExecuteScript kullanarak komut dosyamızı çalıştırmak için bir araç çubuğu düğmesi yapılandırabiliriz.

Diyelim ki bu komut dosyasıE:\scripts\lua\music.luaDüğmeyi şu şekilde ayarlayabiliriz:

从工具栏调用 Lua 脚本

Ayrıca, Double Commander dahili editörünü kullanarak komut dosyalarını da düzenleyebiliriz. Eğer dosya adı varsa.lua Uzantı, iç editör onu tanıyacak ve Lua dili için sözdizimi vurgulamaları sağlayacaktır:

使用内部编辑器进行 Lua 语法高亮显示

3.2. Sistem Kütüphanesi

Kitaplık çeşitli sistem fonksiyonları içerir.

Burada.SysUtils Tabloda tüm fonksiyonlar mevcuttur.

Sistem Kütüphanesi
Fonksiyon AdıTanımı

Uyku.

Betiği belirtilen milisaniye sayısını çalıştırmak için duraklatın.
Belirtilen zamandan sonra komut dosyası yürütme devam eder.

GetTickCount

Arttırılmış bir saat tik-tak sayısını döndürür. Bu zaman ölçümü için kullanılabilir, ancak tik tak arasındaki boşluk varsayılmamalıdır.

fileExists(sFileName)

Dosya sisteminde belirli bir dosyanın olup olmadığını kontrol edin.

DisktesFileNameadında bir dosya varsa,bExists'te bir değer döndürülür.trueAksi halde geri dönüşfalse

See also:

sDirectory 'nindosya sisteminde var olup olmadığını ve gerçekten bir dizin olduğunu denetleyin.

Eğer öyleyse, işlevbExists 'te bir değer döndürürtrueAksi halde geri dönüşfalse

FileGetAttr(sFileName)

iAttriçindesFileName dosyasının özellik ayarlarını döndürür.

Döndürme değerlerinin ayrıntılı açıklaması içinburayabakın.

FindFirst

sPathile eşleşen dosyaları bulun ve genellikle joker karakter kullanın.

Eğer dosya bulunamazsa,Handle bunu yapar.nil

En az bir öğe bulunduğunda, dönenHandle sonraki işlemler için kullanılabilir.SysUtils.FindNext Aynı desenin diğer eşleşmelerini bulmak için çağır.

FindDatatablosu bulunan dosya veya dizin hakkında bilgi içerir.

FindDatatablosunun alanları şunlardır:

  • Name: Dosya adı (yol dahil değildir).
  • Attr: Dosyanın özellikleri (ayrıntılar içinburayabakın).
  • Boyut: Dosya boyutu (bayt cinsinden).
  • Time: Bir belgenin zaman damgası (1 Ocak 1970 'ten beri saniye).

Sonraki

Daha önce döndürülenHandle öğesini yeniden kullanarak bulFindFirst Başlatılan arama dizisinin bir sonraki eşleşmesi.

Eğer bir dosya veya dizin bulunursa, döndürülenResult boş değildir, aksi takdirdenil

veSysUtils.FindFirst Aynı not burada da geçerlidir.

Not: Son kezSysUtils.FindNext Çağrı her zaman aynıHandlekullanan birini takip etmelidirSysUtils.FindClose Ara. Aksi halde hafıza kaybına neden olur.

Not:

Bir seri sonuSysUtils.FindFirst/SysUtils.FindNext Ara.

Bu çağrılar tarafından kullanılan herhangi bir belleği serbest bırakın.

Bu çağrıyı yapmak kesinlikle gereklidir, aksi takdirde bellek sızıntısına neden olabilir.

CreateDirectory(sDirectory)

Bir dizi dizin oluşturun vesDirectory dizinlerin tam yoludur.

sDirectoryzaten varsa veya başarılı bir şekilde oluşturulmuşsa, döndürürtrue。Herhangi bir bölüm oluşturulamazsa, geri dönfalse

CreateHardLink(sName, sLinkName)

sFileNamedosyası içinsLinkName oluşturur.

Başarılı olursa geri dön.trueAksi halde geri dönüşfalse

CreateSybolicLink (sFileName, sLinkName)

Dosya veya dizinsFileName içinsLinkNamesembolik bağlantı oluşturur.

Başarılı olursa geri dön.trueAksi halde geri dönüşfalse

SysTarget = SysUtils

Sembolik bağlantılardansLinkNameokumak için hedef.

EğerbRecursivetrue Bağlantı başka bir bağlantıya işaret ediyorsa, geçerli bağlantı olmayan dosya adı bulunana kadar yinelemeli ayrıştırma yapılır.

Sembolik bağlantısLinkName tarafından işaret edilen yolu döndürür veya geçersiz bağlantı veya işaret edilen dosya mevcut değildir vebRecursivetrue Boş dize döndürür.

ExtractFileName(sFileName)

Dosya adı bölümünü tam yolun dosya adından ayıkla.

Dosya adı, son dizin ayırıcı karakterinden ("/" veya "\") veya sürücü harfinden sonraki tüm karakterlerden oluşur.

ExtractFileExt(sFileName)

Dosya adının uzantısını döndürür (son "." (nokta) sonraki tüm karakterler,"." dahil karakterler).

ExtractFilePath(sFileName)

Dosya adından yol ayıklar (sürücü harfleri dahil).

Yol, içindekiler ayırıcısının kendisi de dahil olmak üzere son dizin ayırıcısı karakterinden ("/" veya "\") önceki tüm karakterlerden oluşur.

ExtractFileName (sFileName)

Sürücü harfleri de dahil olmak üzere yalnızcasFileNamedizin bölümleri ayıklanır.

Katalog adının sonu yok ve buSysUtils.ExtractFilePath Farklı.

ExtractFileDrive(sFileName)

Dosya adından sürücü bölümünü ayıkla.

Bazı işletim sistemlerinin sürücü harflerini desteklemediğini lütfen unutmayın.

GetAbsolutePath(sFileName, sBaseDirectory)

Dosyanın mutlak (tam) yolu:

  • sFileName: Göreceli yolu olan dosya adı.
  • sBaseDirectory:sFileName temel dizin olarak kullanılan dizin.

Mutlak yol alınamazsa, işlevsFileName değerini döndürür.

GetRelativePath(sFileName, sBaseDirectory)

Belirtilen dizine göre dosya adını döndürür:

  • sFileName: Tam (mutlak) dosya adı.
  • sBaseDirectory:sFileName temel dizin olarak kullanılır.

sFileNamevesBaseDirectory aynı değerleri içeriyorsa, işlev boş bir dize ("") döndürür. Göreceli yolu olan bir dosya adı alınamıyorsa, işlevsFileName değerini döndürür.

Örnek 1.

sFileName, iletilen sMask maskesi ile eşleşirse, döndürülür.true

iMaskOptions(isteğe bağlı parametre, varsayılan olarak 0) aşağıdaki değerlerin toplamına ayarlanır:

Değer Tanım
1
Büyük/küçük harf duyarlı
2
Aksan İşaretlerini ve Tireleme Yoksay
4
Windows Stil filtresi: "*.*" Uzantı olmayan dosyalarla da eşleşir.
8
Pinyin desteğini etkinleştir (pinyin.tbldosyası kullanılacaktır)

Dikkatli olun, ve bu modülü aldığınız riski bilerek kullanın

sFileName,sSeparator(varsayılan olarak ';') ayrılmış sMaskList öğesinden en az bir geçiş maskesiyle eşleşirsetrue

sSeparatorveiMaskOptions (yukarıdaki bakınız) isteğe bağlı parametrelerdir.

sTempName = SysUtils.

Geçici dosya adı olarak kullanılacak bir dosya adı döndürülür (sistem geçici dosya dizininde),os.tmpname işlevine benzer, ancak dosya Double Commander kapatıldığında otomatik olarak silinen alt dizinde oluşturulur.
Fonksiyon benzersiz bir ad oluşturamazsa, boş bir dize döndürür.

SysUtils.PathDelim

Geçerli işletim sistemi, tam dosya adlarındaki dizinlerin karakterlerini ayırmak için kullanılır.

Unix/Linux sistemlerinde dizin ayırıcısı "/" ve Windows 'da "\" olacaktır.

3.2.1. SysUtils.FileGetAttr Değer Ayrıntılarını döndürür

FileGetAttr sFileNamedosyasının öznitelik ayarlarını döndürür.

Özellikler, aşağıdaki sabitlerinOR birleşimidir:

SysUtils.FileGetAttr döndürülen değerlerde kullanılan sabitler
DeğerAnlamı
0x00000001
FaReadOnly
Dosya sadece okunur.
0x000000002
FaHidden
Belgeler gizlidir.
Unix/Linux 'ta bu, dosya adının bir nokta ile başladığı anlamına gelir.
0x00000004
faSysFile
Dosya bir sistem dosyasıdır.
Unix/Linux 'ta, bu dosyanın bir karakter veya blok aygıtı, adlandırılmış boru hattı (FIFO) olduğu anlamına gelir.
0x00000008
faVolumeId
etiketleri.
Yalnızca DOS/Windows 'ta normal FAT (VFAT veya FAT32 olmayan) dosya sistemlerinde çalışır.
0x00000010
faDirectory
Dosya bir katalog.
0x00000020
(PHP 4 = 4.0.0)
Dosya arşivlendi.
Unix/Linux 'ta mümkün değil.
0x00000400
faSymLink
Dosya sembolik bir bağlantıdır.
Not: Bir hata oluşursa-1 döndürülür.

Birsonraki bölümde örneklere bakın.

3.2.2. SysUtils.FileGetAttr kullanımı örneği

Aşağıdaki senaryo:SysUtils.FileGetAttr Kullanıma bir örnek.

Parametrenin bir dizin olduğunu algılandığında, etkin panelinde yeni bir sekme açar ve dizine geçer.

local params = {...}
local iAttr

if #params == 1 then -- 我们至少得到了一个参数?
  iAttr = SysUtils.FileGetAttr(params[1])
  if iAttr > 0 then -- 我们得到了一个有效的属性?
    if math.floor(iAttr / 0x00000010) % 2 ~= 0 then
      -- 第4位被设置?所以它是一个目录。
      DC.ExecuteCommand("cm_NewTab")
      DC.ExecuteCommand("cm_ChangeDir", params[1])
    end
  end
end

Yukarıdaki örnekte,params[1] komut dosyasına iletilen ilk parametredir.

İç komutcm_ExecuteScript kullanıldığında, komut dosyası dosyasının adından sonra iletilen ilk parametre olacaktır.

Bu nedenle, bizim örneğimizde, aşağıdaki gibi bir araç çubuğu düğmesi yapılandırabiliriz:

使用 cm_ExecuteScript 的参数

Bu örnekte, parametreler%"0%p Bu komut dosyalarına aktarılacaktır. Bu, tırnak işareti olmayan etkin panelde seçili öğenin dosya adını temsil eder.

3.2.3. FindFirst, FindNext ve FindClose kullanma örnekleri

Aşağıdaki komut dosyası örneğinde, parametrelerde alınan dizin içeriğini tarayacak ve sonuç verilerini ikinci parametre ile iletilen dosya adına bir metin dosyasına saklayacağız.

Bu bizi daha iyi anlayacaktır.FindFirstFindNext VeFindClose Kullanalım.

local params = {...}

if #params == 2 then -- 我们得到了两个参数?
  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

Yukarıdaki örnekte, komut dosyasına iki parametre iletmemiz gerekir:

  1. params[1]-İstediğimiz içerik dizini
  2. params[2]-Sonuçları depolamak için kullanılan çıktı dosyasının adı

Bu nedenle, araç çubuğu düğmelerini yapılandırmak ve tüm bunları yapmak için parametreleri iletmek için dahili komutcm_ExecuteScriptkullanmak kolaydır.

使用 cm_ExecuteScript 的参数

Bu örnekte, parametreler%"0%Ds Betiğe ilk parametre olarak iletilir. Bu, tırnak işareti olmayan etkin panelin görüntülendiği dizini temsil eder.

3.3. Pano kitaplığı

Double Commander, Lua betiklerimiz için harici bir pano işlevi sağlayabilir.

Aşağıdaki tabloda ilgili fonksiyonlar verilmiştir:

Pano kitaplığı
Fonksiyon AdıAçıklaması

Not:

Pano içeriğini temizler.

sVar = Clipbrd.GetAsText()

Pano için geçerli metin içeriğini alın vesVar 'a atayın. Pano metin içermiyorsa işlev boş bir dize döndürür.

SetAsText(sVar)

sVar'ın metin içeriğini panoya kaydet.

SetAsHtml(sHtml)

html( ((CF_HTML Pano formatı).

Bu içerik, MS Word, LO Writer gibi bu pano formatını destekleyen uygulamalara eklenecektir.

KullanClipbrd.SetAsText VeClipbrd.SetAsHtml Verilerin depolanması doğru. Yapıştırdığımızda, uygulama desteklediği en iyi formatı kullanacaktır.

Örneğin, şunlara sahip olabiliriz:

  • Clipbrd.SetAsText("欢迎使用 Double Commander!")
  • Clipbrd.SetAsHtml("欢迎使用 <b>Double Commander</b>!")

Not Defteri 'ne geçip bir şeyi yapıştırmayı denersek, bizim kullandığımız düz metin olarak yapıştırılır.Clipbrd.SetAsText Mesajı kopyalayın. Ancak Microsoft Word'e geçer ve bir şey yapıştırırsak, ikincisi, yani Microsoft Word bu pano içerik türünü tanır ve destekler.

3.3.1. Pano kitaplığı kullanma örneği

Aşağıdaki örnek, pano ile ilişkili üç işlev kullanır:ClearGetAsText VeSetAsText

Bu nispeten uzun bir komut dosyasıdır, ancak yukarıda görülen işlevlerin bazılarını bir araya getirmek için iyidir.

Etkin panelimizin şu anda birçok kaynak metin dosyası içeren bir dizinde olduğunu varsayar.

Ayrıca, şu anda panoda bir kelime olduğunu ve geçerli etkin klasörü tek bir parametre olarak alacağını varsayar.

Komut dosyası geçerli dizin düzeyindeki dosyaları tarar ve panodaki sözcükleri içeren metin satırlarını algılamak için içeriğini tek okur.

Daha sonra, sözcüğün en az bir satırını içeren dosya adı panoya yerleştirilir.

Komut dosyası daha sonracm_LoadSelectionFromClipiç komutunu kullanır ve sözcüğü içeren dosya seçilir.

Ayrıca, sonunda, arama yapılması gereken orijinal kelimeleri panoya geri koyacağız.

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 -- 我们得到了参数?
  sSearchString = Clipbrd.GetAsText() -- 获取要搜索的表达式。
  Clipbrd.Clear() -- 确保剪贴板中没有任何内容。
  DC.ExecuteCommand("cm_MarkUnmarkAll") -- 确保没有选中任何内容。

  -- 让我们逐个扫描目录中的所有文件。
  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 -- 我们得到了一个有效的属性?
        -- 我们需要文件,而不是目录!
        if math.floor(iAttr / 0x00000010) % 2 == 0 then

          -- 现在让我们逐行读取文件,直到结束或找到。
          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

  -- 如果我们找到了什么,就选中它!
  if sFileToSelect ~= "" then
    Clipbrd.SetAsText(sFileToSelect)
    DC.ExecuteCommand("cm_LoadSelectionFromClip")
  end

  Clipbrd.SetAsText(sSearchString) -- 恢复我们在剪贴板中的内容。
end

3.4.İletişim kutusu kitaplıkları

Kütüphane, komut dosyalarımızın kullanıcılarla etkileşime girmesine, mesajları görüntülemesine, cevapları girmelerini ve daha fazlasını istemesine izin verir.

Aşağıdaki tabloda ilgili işlevler listelenmektedir:

İletişim kutusu kitaplıkları
Fonksiyon AdıTanımı

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

Kullanıcının işlev tarafından döndürülen bir düğmeye tıklamasını isteyen bir mesaj kutusu görüntüler:

  • sMessage: Mesaj kutusundaki metin.
  • STitle: Mesaj kutusunun başlığı.
  • iFlags: Görüntülenen düğmeleri, pencere stilini ve varsayılan düğmeleri belirlemek için sabitin bit veya değeri. Görüntülenen düğmeler,pencere stilleri veyavarsayılan düğmeler için aşağıdaki tabloya bakın.
  • iButton: Kullanıcının bastığı düğmeyi temsil eden bir değer döndürür (bu tabloyabakın).

Not:

Kullanıcının bir dize girebileceği bir istek kutusu gösterir:

  • STitle: İstek kutusunun başlığı.
  • sMessage: İstek kutusundaki metin.
  • bMask: Boolean değeri, true olduğunda karakterleri gizlemek için "yıldız" görüntülenir.
  • sDefault: Varsayılan önerilen metin, kullanıcıların ihtiyaç duyduğu şekilde değiştirebileceği şekilde değiştirilebilir.
  • bResult: Kullanıcının gerçekten içeriği girip girmediğini gösteren bir Boolean değeri döndürür.
  • sAnswer: Kullanıcı içeriği girdiğinde ve Tamam'a tıkladığında geri dönen dizeyi döndürür.

InputListBox(sTitle, sMessage, aItems, sDefault)

Kullanıcıların proje listesinden seçim yapmasına izin veren bir iletişim kutusu göster:

  • STitle: İletişim kutusunun başlığı.
  • sMessage: İletişim kutusundaki metin.
  • aItems: Bir Lua tablosu ve tablodaki her öğenin bir dize olması gerekir.
  • sDefault: Varsayılan olarak listede seçili olan ögeler.
  • sItem: Seçili öğeyi dize olarak döndürür, iletişim kutusu iptal edilmişse döndürürnil
  • iItem: Seçilen öğenin dizin (Lua tablosunun alışkanlıklarına uyan 1'den başlayarak sayılır).

3.4.1. Dialogs.MessageBox 'ta görüntülenen düğmeler

Dialogs.MessageBox İşlev, aşağıdaki sabitlerin bitsel veya değerleriyle kontrol edilen düğmeleri görüntüler:

Dialogs.MessageBox düğmeler için ButFlags sabitlerini gösterir
Sabit değerleri, soldan sağa düğmeleri gösterir
0x000
MB_OK
按钮 OK
0x0001.
MB_OKANCEL
按钮 OK 按钮 CANCEL
0x0002.
MB_ABORTRETRYIGNORE
按钮 ABORT 按钮 RETRY 按钮 IGNORE
0x0003.
MB_Yesnocancel
按钮 YES 按钮 NO 按钮 CANCEL
0x0004
MB_YESNO
按钮 YES 按钮 NO
0x0005
MB_RETRYCANCEL
按钮 RETRY 按钮 CANCEL

3.4.2. Dialogs.MessageBox için pencere stili

Dialogs.MessageBox İşlev tarafından görüntülenen pencere stili, aşağıdaki sabitlerin bitsel veya değerleriyle denetlenir:

Dialogs.MessageBox simge ve stil ButFlags sabitleri
Sabit DeğerlerPencere Stili
0x0040
MB_ICONINFORMATION
图标 INFORMATION Bilgi Penceresi
0x0030
MB_ICONWARNING
图标 WARNING Uyarı penceresi
0x0020
MB_ICONQUESTION
图标 QUESTION Onay penceresi
0x0010
MB_ICON ERROR
图标 ERROR Yanlış Pencere

3.4.3. Dialogs.MessageBox için varsayılan etkinlik düğmesi

Dialogs.MessageBox Fonksiyon tarafından görüntülenen varsayılan etkin düğmeler, aşağıdaki sabitlerin bitsel veya değerleriyle denetlenir:

Dialogs.MessageBox Varsayılan düğme için ButFlags sabitleri
Sabit DeğerleriVarsayılan düğmesi
0x000
MB_DEFUTON1
Varsayılan olarak soldaki ilk düğme
0x0100
MB_DEFUTON2
Varsayılan olarak soldaki ikinci düğme
0x0200
MB_DEFUTTON 3
Varsayılan olarak soldan üçüncü düğme

3.4.4. Dialogs.MessageBox 'ın geri dönüş değeri

Dialogs.MessageBox İşlev, aşağıdaki gibi kullanıcının bastığı düğmeyi temsil eden bir sayı döndürür:

Dialogs.MessageBox düğmesi basıldığında döndürülen ButPressed değeri
Sabit değerlerdebasılan düğmeler
0x000
mrNone
Hiçbir düğmeye basılmadı.
0x0001.
Mrok.
结果 OK
0x0002.
mrCancel
结果 CANCEL
0x0003.
mrAbort
结果 ABORT
0x0004
mrRetry
结果 RETRY
0x0005
Bay Ignore.
结果 IGNORE
0x0006.
- Evet.
结果 YES
0x0007.
MrNo
结果 NO

Not: Sağ üst köşedeki "x" e basarsanız veya basarsanızEsc Pencereyi kapattığınızda, İptal düğmesinin değeri geri döner.

3.4.5. Dialogs.MessageBox Kullanımı

İşte bir kullanım.Dialogs.MessageBox Küçük komut dosyası ve sonuç penceresi gösterilecek:

-- 显示的按钮
MB_OK = 0x0000
MB_OKCANCEL = 0x0001
MB_ABORTRETRYIGNORE = 0x0002
MB_YESNOCANCEL = 0x0003
MB_YESNO = 0x0004
MB_RETRYCANCEL = 0x0005

-- 窗口样式
MB_ICONINFORMATION = 0x0040
MB_ICONWARNING = 0x0030
MB_ICONQUESTION = 0x0020
MB_ICONERROR = 0x0010

-- 默认按钮
MB_DEFBUTTON1 = 0x0000
MB_DEFBUTTON2 = 0x0100
MB_DEFBUTTON3 = 0x0200

-- 返回按下的按钮
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("您想要退出吗?", "问题", iFlags)

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

Dialogs.MessageBox 使用示例

3.4.6. Dialogs.InputQuery Kullanımı

İşte bir kullanım.Dialogs.InputQuery Küçük komut dosyası ve sonuç penceresi gösterilecek:

bResult, sAnswer = Dialogs.InputQuery("身份验证", "请输入您的姓名:", false, "约翰")

if bResult == true then
  Dialogs.MessageBox("您好 " .. sAnswer .. "!", "欢迎!", 0x0040)
end

Dialogs.InputQuery 使用示例

3.5. UTF-8 kütüphanesi

Kütüphane, UTF-8 kodlaması için temel destek sağlar.

Burada.LazUtf8 Tabloda tüm fonksiyonlar mevcuttur.

UTF-8 kütüphanesi
Fonksiyon AdıTanımı

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

Dizede belirtilen konumdan alt dizeyi aramaya başlayın. Arama büyük/küçük harf duyarlıdır.

SearchTextalt dizesininSourceText dizesinde ilk göründüğü yeri döndürür ve aramakonumu Offset (varsayılan olarak 1) ile başlar.

SearchText, verilenOffset ' ten sonraSourceText ' te görünmüyorsa, sıfır döndürülür.

LazUtf8. Next (String)

Her çağrıdaString 'deki sonraki karakteri ve bu karakterin başlangıç konumunu (bayt cinsinden) döndüren yineleyici işlevi.

Örnek:

-- 以 "位置 : 字符" 的形式打印值对
for iPos, sChar in LazUtf8.Next(String) do
  DC.LogWrite(iPos .. " : " .. sChar)
end

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

Dizenin bir bölümünü kopyalayın.

Copy, String içindekonumdan iIndexile başlayaniCount karakterinin bir kopyası olan bir dize döndürür.

iCount,String dizesinin uzunluğundan büyükse, sonuç kırpılır. iIndex,String dizesinin uzunluğundan büyükse boş bir dize döndürülür.

iResult = LazUtf8. Length (String)

Dizedeki UTF-8 karakter sayısını döndürür.

sResult = LazUtf8. UpperCase (String)

Bir dizeyi alın ve tüm küçük harflerin büyük harflere dönüştürüldüğü dizenin bir kopyasını döndürür.

sResult = LazUtf8. LowerCase (String)

Bir dizeyi alır ve tüm büyük harflerin küçük harflere dönüştürüldüğü dizenin bir kopyasını döndürür.

sResult = LazUtf8. ConvertEncoding

FromEnc'denToEnc' yeStringkodlamasını dönüştürün.

Desteklenen kodlama değerlerinin listesi:

  • Varsayılan sistem kodlama (sistem yerel ayarlarına bağlı olarak):"default".
  • Varsayılan ANSI (Windows) kodlama (sistem yerel ayarlarına bağlı olarak):"anssi".
  • Varsayılan OEM (DOS) kodlama (sistem bölgesel ayarlarına bağlı olarak):"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","cp949","cp950".
  • ISO 8859:"iso88591","iso88592","iso88593","iso8594","iso8595","iso8597","iso8599","iso85910","iso85913" iso85914 "," iso85914 "," iso88595914 "iso8595914","iso859595913","iso859595985","iso85985","iso85914" iso85985 "," iso8595985 "," iso85913 "," iso859595914 "," iso859595985 "," iso85985 "iso
  • Diğer:"macintosh","koi8r","koi8u","koi8ru".
Özel kodlamanın anlamı (örnek).

Windows (İngilizce veya Rusça):
  • "default" - cp1252 veya cp1251
  • "Ansi" - cp1252 veya cp1251
  • "oem" - cp850 veya cp866
Linux 'ta (İngilizce veya Rusça):
  • PHP 4 = 4.0
  • "Ansi" - cp1252 veya cp1251
  • "oem" - cp850 veya cp866

sEnc = LazUtf8. DetectEncoding (String)

İletilen metnin kodlama değerini döndürür.
Desteklenen kod listesi veLazUtf8.ConvertEncoding Fonksiyonlarda kullanılan kodlar benzer.

3.6. Karakter kitaplıkları

Kitaplık, karakterlerin belirli bir Unicode kategorisine ait olup olmadığını denetleyen ve karakter kategorilerini almak için işlevler içerir.

Kitaplıktaki kullanılabilir işlevlerin listesi:

Karakter kitaplıkları
Fonksiyon AdıTanımı

GetUnicodeCategory(Character)

Karakterleri Geri DönCharacter Unicode kategorisi, aşağıdaki değerlerden biri:

DeğerTanımı
  Harfler:
0Büyük harf (Lu)
1Küçük harf (Ll)
2Başlık (Lt)
3Değiştirici Harfler (Lm)
4Diğer Harfler (Lo)
  Etiket:
5Aralık Dışı İşaretler (Mn)
6Mojikumi Küme İşaretleri (Mc)
7Kapalı İşaretler (Me)
  Sayı:
8Ondalık Sayılar (Nd)
9harfli sayılar (Nl)
10Diğer Sayılar (No)
  Noktalama işaretleri:
11Bağlayıcı Noktalama Noktalama (PC)
12çizgi noktalama (Pd)
13Açılış Noktası (PS)
14Açık (Pe)
15Başlangıç noktalama (Pi)
16Son Noktalama Noktaları (Pf)
17Diğer Noktalar (Po)
  Semboller:
18Matematiksel Semboller (Sm)
19Para Birimi Sembolleri (Sc)
20Değiştirici Sembolleri (Sk)
21Diğer semboller (So)
  Ayırıcı:
22Boşluk Ayırıcı (Zs)
23Satır Ayırıcı (Zl)
24Paragraf Ayırıcı (Zp)
  Diğerleri:
25Kontrol (Cc)
26Formatı (Cf)
27. Sınıf (Cs)
28Özel (Co)
29Dağıtılmamış (Cn)

IsDigit(Character)

CharacterkarakterleriNd kategorisinde ise, döndürürtrue

Result = Char.IsLetter(Character)

CharacterkarakterleriLu,Ll,Lt,Lm veyaLo sınıfındaysa döndürülürtrue

This result = Char.

Lu, Ll,Lt,Lm,Lo,Nd veyaNl sınıfındaysa, döndürürtrue

See also result ().

CharacterkarakterleriLl kategorisinde ise geri döner.true

See also result = Char.

CharacterkarakteriLu sınıfında ise döndürülürtrue

Ayrıca, bu işlevler iki parametreyi destekler: tek bir karakter yerine bir dize ve bu dizedeki karakterlerin konumunu belirtebiliriz.

3.7.İşletim Sistemi Kütüphanesi

Kütüphane, Double Commander 'ın çalıştığı işletim sistemiyle ilgili işlevleri içerir.

Aşağıda, kitaplıktaki kullanılabilir işlevlerin listesi verilmiştir:

İşletim Sistemi Kütüphanesi
Fonksiyon AdıTanımı

iResultCode = os.execute(sCommand)

Komut satırına girdiğiniz gibisCommand çalıştırılır ve işlemin sonuç kodunu döndürür.

sCommandşu olabilir:

  • Terminal komutları, örneğinos.execute("dir > all.txt")
  • Çalıştırılabilir dosyalar, örneğinos.execute("C:\\Windows\\System32\\calc.exe")
  • Parametrelerle çalıştırılabilir dosya:
    os.execute("C:\\Utils\\fsum.exe -md5 test.bin > md5.txt")

sTempFileName = os.tmpname()

Geçici dosya adı olarak kullanılan bir dosya adı döndürülür (sistemin geçici dosya dizininde).
Fonksiyon benzersiz bir ad oluşturamazsa, boş bir dize döndürür.

bResult, sError.

sFileNameadlı dosya veya dizin kaldırılır.

Başarılı olursa fonksiyon geri döner.true

Eğer başarısız olursa fonksiyon üç şey döndürür:

  1. nil Başarısız.
  2. sErrorhata mesajı için açıklama
  3. iErrorhata kodu numarasıdır.

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

sOldNamedosyasısNewName yeni adıyla yeniden adlandırılacaktır.

Not: sNewName adlı bir dosya zaten varsa, değiştirilecektir!

Başarılı olursa fonksiyon geri döner.true

Eğer başarısız olursa fonksiyon üç şey döndürür:

  1. nil Başarısız.
  2. sErrorhata mesajı için açıklama
  3. iErrorhata kodu numarasıdır.

Value = os.getenv(VariableName)

Parametrede iletilenVariableName değişkenininValuedöndürülür.
Eğer bu isimde bir değişken yoksa, geri dönecektir.nil

setenv

VariableNameortam değişkenini ekleyin veya değiştirin. Bir hata oluştuğunda işlev-1 döndürür.

os.unsetenv(VariableName)

VariableNameortam değişkenini kaldırın. Bir hata oluştuğunda işlev-1 döndürür.

4. Dizin

DC Kütüphanesi

DC.CurrentPanel
DC.ExecuteCommand
DC.LogWrite


Sistem Kütüphanesi

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


Pano Kitaplığı

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


İletişim kutusu kitaplıkları

Dialogs.InputListBox
Dialogs.InputQuery
Dialogs.MessageBox


UTF-8 Kitaplığı

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


Karakter kitaplıkları

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


İşletim Sistemi Kütüphanesi

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


Valid HTML 4.0 Transitional CSS Valid!