लुआ (Lua) स्क्रिप्टिंग प्रोग्रामिंग भाषा के बारे में विस्तृत जानकारी के लिए, कृपया Lua वेबसाइट पर जाएं।
Double Commander, cm_ExecuteScript कमांड के माध्यम से लुआ स्क्रिप्ट निष्पादित कर सकता है।
स्क्रिप्ट मापदंडों (Parameters) को बिना एस्केप किए (बिना उद्धरण चिह्नों या “\” के) वैसे ही पास किया जाना चाहिए, इसके लिए हमें %"0 चर (Variable) का उपयोग करने की आवश्यकता है: उदाहरण के लिए, कर्सर के नीचे की फ़ाइल के लिए %p0 के बजाय %"0%p0 का उपयोग करें, और वर्तमान निर्देशिका के लिए %D के बजाय %"0%D का उपयोग करें। अन्यथा, यदि Double Commander स्वचालित रूप से उद्धरण चिह्न जोड़ता है, तो वे पैरामीटर के हिस्से के रूप में पास हो जाएंगे और आपको इस पर विचार करना होगा।
सभी चयनित फ़ाइलों की सूची प्राप्त करने के लिए, हम चरों (%LU, %FU या %RU) या आंतरिक कमांडों (cm_SaveSelectionToFile, cm_SaveFileDetailsToFile, cm_CopyFullNamesToClip या cm_CopyFileDetailsToClip) का उपयोग कर सकते हैं।
उदाहरण के लिए, हम %p का उपयोग कर सकते हैं: इस मामले में, Double Commander सभी चयनित फ़ाइलों के नामों को एक ही पंक्ति में स्पेस द्वारा अलग करके पास करेगा।
सामग्री प्लगइन्स (Content Plugins) लिखने के लिए भी लुआ स्क्रिप्ट का उपयोग किया जा सकता है, इसके उदाहरण प्रोग्राम फ़ोल्डर में मिल सकते हैं (plugins/wdx/scripts)। Wiki पर प्लगइन्स लिखने के लिए एक समर्पित पृष्ठ भी है। सीमाएँ: केवल निम्नलिखित डेटा प्रकार समर्थित हैं:
उपरोक्त सूची में हेडर फ़ाइल के नाम शामिल हैं, लुआ स्क्रिप्ट में हमें कोष्ठक में निर्दिष्ट संख्यात्मक मानों का उपयोग करना होगा।
टेक्स्ट एन्कोडिंग के बारे में
नीचे वर्णित सभी अतिरिक्त फ़ंक्शन UTF-8 एन्कोडेड स्ट्रिंग मापदंडों को स्वीकार करते हैं और इसी एन्कोडिंग की स्ट्रिंग लौटाते हैं (सिवाय LazUtf8.ConvertEncoding फ़ंक्शन के)।
कुछ मानक लुआ लाइब्रेरी फ़ंक्शनों को Double Commander या Free Pascal/Lazarus के फ़ंक्शनों द्वारा बदल दिया गया है (या नए फ़ंक्शन लिखे गए हैं), जो UTF-8 समर्थन प्रदान करते हैं।
प्लगइन्स लिखते समय, हमें टेक्स्ट डेटा के लिए भी UTF-8 का उपयोग करना चाहिए (ft_multiplechoice, ft_string और ft_fulltext)।
स्क्रिप्ट सहेजते समय, कृपया बिना BOM के UTF-8 एन्कोडिंग का उपयोग करें।
महत्वपूर्ण बातें
स्वचालन (Automation) के लिए लुआ का उपयोग करने की अपार संभावनाएँ हैं, लेकिन कुछ मामलों में कुछ विवरणों पर ध्यान देने की आवश्यकता हो सकती है। आइए इस उपधारा में उन्हें एकत्र करने का प्रयास करें।
1. यदि स्वचालित रीफ़्रेश और एक अलग थ्रेड में फ़ाइल सूची लोड करें विकल्प सक्षम हैं, तो रीफ़्रेश सुविधा एसिंक्रोनस रूप से काम करेगी। साथ ही, स्क्रिप्ट Double Commander के मुख्य थ्रेड में निष्पादित होती है, इसलिए कुछ मामलों में यह सब आपकी स्क्रिप्ट के चलने को प्रभावित कर सकता है। उदाहरण के लिए, कभी-कभी लगातार नेविगेशन कमांड निष्पादित करना काम नहीं कर सकता है (जैसे, बड़ी निर्देशिकाएँ, धीमी डिस्क), इस मामले में, एक अलग थ्रेड में फ़ाइल सूची लोड करें को अक्षम करने का प्रयास करें या कोई वैकल्पिक समाधान खोजें।
यदि आपकी स्क्रिप्ट वर्तमान पैनल में नई फ़ाइलें बनाती है या मौजूदा फ़ाइलों का नाम बदलती है, लेकिन फिर समाप्त नहीं होती है और कुछ अतिरिक्त संचालन निष्पादित करती है (जैसे, फ़ाइल का चयन करना या कर्सर ले जाना), तो कुछ मामलों में ये संचालन प्रभावी नहीं होंगे: हो सकता है कि सभी फ़ाइलें पैनल में अभी तक न हों, आपको पहले cm_Refresh कमांड कॉल करने की आवश्यकता होगी। उक्त परिस्थितियों में, cm_Refresh भी एसिंक्रोनस रूप से निष्पादित होगा, और Double Commander के पास आपके परिवर्तनों के बाद फ़ाइल सूची को पूरी तरह से रीफ़्रेश करने का समय नहीं हो सकता है।
स्वचालित रीफ़्रेश और अलग थ्रेड में फ़ाइल सूची लोड करना फ़ाइल प्रबंधक की सुविधाजनक विशेषताएं हैं, इसलिए प्रयोगों के माध्यम से एक स्थिर कार्य पद्धति पाई गई है, जो अस्थायी रूप से नियंत्रण को प्रोग्राम को वापस करना और फ़ाइल सूची को पूरी तरह से रीफ़्रेश करने की अनुमति देना है:
DC.ExecuteCommand("cm_Refresh") i = 10 while i > 0 do SysUtils.Sleep(10) DC.ExecuteCommand("") i = i - 1 end
2. लुआ फ़ंक्शन io.open मानक C फ़ंक्शन fopen का उपयोग करता है: टेक्स्ट मोड में, यह फ़ंक्शन पढ़ने और लिखने के दौरान लाइन एंडिंग प्रकारों (CRLF, LF या CR) को बदल सकता है, जिससे अप्रत्याशित परिणाम हो सकते हैं। यदि आपके पास अलग-अलग लाइन एंडिंग प्रकारों वाली फ़ाइलें हैं या आप क्रॉस-प्लेटफ़ॉर्म स्क्रिप्ट लिख रहे हैं, तो आपको इस पर विचार करना होगा, या बाइनरी मोड को प्राथमिकता देना अधिक व्यावहारिक होगा।
3. Linux और अन्य Unix जैसी प्रणालियों में, फ़ाइल विशेषताएँ संवाद के लिए, ContentGetValue फ़ंक्शन को CONTENT_DELAYIFSLOW ध्वज (चौथा पैरामीटर, मान 1) के साथ कॉल किया जाता है, जो विंडो खोलते समय होने वाले विलंब से बचाता है: यदि डेटा पुनर्प्राप्ति धीमी है, तो हम केवल ध्वज मान की जाँच करके और इन फ़ील्ड्स या प्लगइन्स के लिए nil लौटाकर इस डेटा को बाहर कर सकते हैं।
4. यदि प्लगइन को खाली स्ट्रिंग वापस करनी चाहिए, तो "" पास करने की तुलना में nil पास करना अधिक तेज़ है।
लुआ स्क्रिप्ट फ़ाइलों की व्याख्या करने में सक्षम होने के लिए, हमें एक लुआ DLL फ़ाइल की आवश्यकता होती है, Double Commander इसके 5.1 - 5.4 संस्करणों का समर्थन करता है।
हम LuaJIT प्रोजेक्ट से DLL फ़ाइलों का उपयोग कर सकते हैं। LuaJIT असेंबली में लिखे गए एक उच्च-गति दुभाषिए (Interpreter) और एक उन्नत JIT कंपाइलर को जोड़ता है। इसके अलावा, हमें FFI लाइब्रेरी भी मिलती है, जो शुद्ध लुआ कोड से बाहरी C फ़ंक्शनों को कॉल करने और C डेटा संरचनाओं का उपयोग करने की अनुमति देती है।
DC के Windows संस्करण में डिफ़ॉल्ट रूप से लुआ DLL शामिल होता है (DC 0.9.7 और इसके बाद के संस्करणों में LuaJIT प्रोजेक्ट से), अन्य मामलों में, हम इसे पैकेज मैनेजर के माध्यम से ढूंढ और इंस्टॉल कर सकते हैं, या इसे स्वयं संकलित कर सकते हैं। यदि हम DC के 64-बिट संस्करण का उपयोग कर रहे हैं, तो DLL भी 64-बिट संस्करण होना चाहिए।
डिफ़ॉल्ट रूप से, DC अपनी निर्देशिका और सिस्टम निर्देशिका में lua5.1.dll (Windows), liblua5.1.so.0 (Unix या GNU/Linux) या liblua5.1.dylib (macOS) नामक फ़ाइलों की तलाश करता है। हम उपयोग की जाने वाली लुआ लाइब्रेरी फ़ाइल पैरामीटर में फ़ाइल का नाम (और पथ) बदल सकते हैं।
Double Commander हमारी लुआ स्क्रिप्ट के लिए कुछ फ़ंक्शन लाइब्रेरी प्रदान करता है।
नीचे इन पुस्तकालयों (Libraries) की सूची दी गई है।
| लाइब्रेरी सूची | ||
|---|---|---|
| लाइब्रेरी नाम | स्क्रिप्ट नाम | संक्षिप्त विवरण |
| DC | Double Commander विशिष्ट फ़ंक्शन | |
| SysUtils | विभिन्न सिस्टम फ़ंक्शन | |
| Clipbrd | बाहरी क्लिपबोर्ड सुविधा प्रदान करता है | |
| Dialogs | उपयोगकर्ता के साथ बातचीत | |
| LazUtf8 | UTF-8 स्ट्रिंग फ़ंक्शन | |
| Char | वर्ण जानकारी प्राप्त करना | |
| os | ऑपरेटिंग सिस्टम से संबंधित फ़ंक्शन | |
इस लाइब्रेरी में Double Commander विशिष्ट फ़ंक्शन शामिल हैं।
यह DC तालिका (Table) में सभी फ़ंक्शन प्रदान करता है।
| DC लाइब्रेरी | |
|---|---|
| फ़ंक्शन नाम | विवरण |
|
DC.LogWrite(sMessage, iMsgType, bForce, bLogFile) लॉग विंडो में संदेश लिखता है:
|
|
|
iPanel = DC.CurrentPanel() सक्रिय पैनल प्राप्त करें: यदि बायां पैनल सक्रिय है तो 0 लौटाता है, अन्यथा 1 लौटाता है। DC.CurrentPanel(iPanel) सक्रिय पैनल सेट करें: iPanel का मान 0 होने पर बायां पैनल, और 1 होने पर दायां पैनल सेट होता है। |
|
|
DC.ExecuteCommand(sCommand, Param1, Param2,...,ParamX) यह स्क्रिप्ट को Double Commander के आंतरिक कमांडों को कॉल करने की अनुमति देता है। sCommand वास्तविक आंतरिक कमांड का नाम है। हम कमांड द्वारा समर्थित किसी भी संख्या में Param... पैरामीटर प्रदान कर सकते हैं। |
|
आंतरिक कमांडों के अलावा, स्क्रिप्ट में हम विशेष कमांड cm_ExecuteToolBarItem का भी उपयोग कर सकते हैं, जो पहचानकर्ता (Identifier) द्वारा टूलबार बटन को कॉल करने की अनुमति देता है (प्रोग्राम में, यह सुविधा टूलबार बटनों के लिए हॉटकीज़ का उपयोग करने की क्षमता प्रदान करती है)। इस कमांड का उपयोग सामान्य आंतरिक कमांडों के समान ही किया जाता है (नीचे उदाहरण देखें), और इसके निम्नलिखित पैरामीटर हैं:
| पैरामीटर | मान | विवरण |
|---|---|---|
| ToolBarID | TfrmOptionsToolbar | मुख्य टूलबार के बटन |
| TfrmOptionsToolbarMiddle | मध्य टूलबार के बटन | |
| (मौजूद नहीं है) | मुख्य टूलबार के बटन | |
| ToolItemID | पहचानकर्ता | बटन का विशिष्ट पहचानकर्ता (Unique ID) |
विशिष्ट पहचानकर्ता ID टैग में संग्रहीत होता है, और इसे प्राप्त करने के हमारे पास कई तरीके हैं: इसे doublecmd.xml फ़ाइल, टूलबार बैकअप फ़ाइल में पाया जा सकता है, या केवल बटन को क्लिपबोर्ड पर कॉपी करके टेक्स्ट एडिटर में उसका कोड पेस्ट किया जा सकता है।
ध्यान दें: पहचानकर्ता स्वचालित रूप से उत्पन्न होते हैं और प्रोग्राम की किसी अन्य प्रति में समान बटनों के पहचानकर्ताओं से मेल खाना आवश्यक नहीं है, लेकिन यदि आवश्यक हो, तो हम मैन्युअल रूप से अपना मान सेट कर सकते हैं।
इस उदाहरण में, हमने एक सरल स्क्रिप्ट लिखी है जो निम्नलिखित कार्य करेगी:
-- 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")
आंतरिक कमांड cm_ExecuteScript का उपयोग करके, हम अपनी स्क्रिप्ट निष्पादित करने के लिए एक टूलबार बटन कॉन्फ़िगर कर सकते हैं।
मान लीजिए कि यह स्क्रिप्ट फ़ाइल E:\scripts\lua\music.lua है, तो हम बटन को इस प्रकार कॉन्फ़िगर कर सकते हैं:

इसके अलावा, हम स्क्रिप्ट को संपादित करने के लिए Double Commander के आंतरिक संपादक का भी उपयोग कर सकते हैं। यदि फ़ाइल का नाम .lua एक्सटेंशन वाला है, तो आंतरिक संपादक इसे पहचान लेगा और लुआ भाषा के लिए सिंटैक्स हाइलाइटिंग प्रदान करेगा:

इस लाइब्रेरी में विभिन्न सिस्टम फ़ंक्शन शामिल हैं।
यह SysUtils तालिका में सभी फ़ंक्शन प्रदान करता है।
| सिस्टम लाइब्रेरी | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| फ़ंक्शन नाम | विवरण | ||||||||||
|
SysUtils.Sleep(iMilliseconds) निर्दिष्ट मिलीसेकंड iMilliseconds के लिए स्क्रिप्ट निष्पादन को निलंबित (Pause) करता है। |
|||||||||||
|
SysUtils.GetTickCount() एक बढ़ता हुआ घड़ी टिक काउंट (Tick count) लौटाता है। इसका उपयोग समय माप के लिए किया जा सकता है, लेकिन यह नहीं माना जाना चाहिए कि यह टिकों के बीच की सटीक अवधि है। |
|||||||||||
|
bExists = SysUtils.FileExists(sFileName) जांच करता है कि फ़ाइल सिस्टम में कोई विशिष्ट फ़ाइल मौजूद है या नहीं। यदि डिस्क पर sFileName नामक फ़ाइल मौजूद है, तो bExists में |
|||||||||||
|
bExists = SysUtils.DirectoryExists(sDirectory) जांच करता है कि फ़ाइल सिस्टम में sDirectory मौजूद है और क्या यह वास्तव में एक निर्देशिका है। यदि ऐसा है, तो फ़ंक्शन bExists में |
|||||||||||
|
iAttr = SysUtils.FileGetAttr(sFileName) iAttr में फ़ाइल sFileName की विशेषता सेटिंग्स (Attributes) लौटाता है। रिटर्न मानों के विस्तृत विवरण के लिए, कृपया यहाँ देखें। |
|||||||||||
|
Handle, FindData = SysUtils.FindFirst(sPath) आमतौर पर वाइल्डकार्ड का उपयोग करके sPath से मेल खाने वाली फ़ाइलों की खोज करता है। यदि कोई फ़ाइल नहीं मिलती है, तो Handle का मान जब कम से कम एक आइटम मिल जाता है, तो लौटाया गया Handle उसी पैटर्न के अन्य मिलान खोजने के लिए बाद के FindData तालिका में मिली फ़ाइल या निर्देशिका की जानकारी होती है। FindData तालिका के फ़ील्ड इस प्रकार हैं:
|
|||||||||||
|
Result, FindData = SysUtils.FindNext(Handle) पहले लौटाए गए Handle का पुनरुपयोग करके, यदि फ़ाइल या निर्देशिका मिलती है, तो लौटाया गया Result गैर-रिक्त होगा, अन्यथा
नोट: अंतिम |
|||||||||||
|
SysUtils.FindClose(Handle)
इन कॉलों द्वारा उपयोग की गई किसी भी मेमोरी को मुक्त (Free) करता है। यह कॉल करना अत्यंत आवश्यक है, अन्यथा मेमोरी लीक हो सकती है। |
|||||||||||
|
bResult = SysUtils.CreateDirectory(sDirectory) निर्देशिकाओं की एक श्रृंखला बनाता है, जहाँ sDirectory निर्देशिका का पूर्ण पथ है। यदि sDirectory पहले से मौजूद है या सफलतापूर्वक बनाई गई है, तो |
|||||||||||
|
bResult = SysUtils.CreateHardLink(sFileName, sLinkName) फ़ाइल sFileName के लिए हार्ड लिंक sLinkName बनाता है। यदि सफल होता है तो |
|||||||||||
|
bResult = SysUtils.CreateSymbolicLink(sFileName, sLinkName) फ़ाइल या निर्देशिका sFileName के लिए सिंबॉलिक लिंक sLinkName बनाता है। यदि सफल होता है तो |
|||||||||||
|
sTarget = SysUtils.ReadSymbolicLink(sLinkName, bRecursive) सिंबॉलिक लिंक sLinkName के लक्ष्य (Target) को पढ़ता है। यदि bRecursive का मान सिंबॉलिक लिंक sLinkName द्वारा इंगित पथ लौटाता है, या लिंक अमान्य होने या इंगित की गई फ़ाइल मौजूद न होने और bRecursive मान |
|||||||||||
|
sName = SysUtils.ExtractFileName(sFileName) पूर्ण पथ वाले फ़ाइल नाम से केवल फ़ाइल नाम का हिस्सा निकालता है। फ़ाइल नाम अंतिम निर्देशिका विभाजक वर्ण (“/” या “\”) या ड्राइव लेटर के बाद के सभी वर्णों से बना होता है। |
|||||||||||
|
sExt = SysUtils.ExtractFileExt(sFileName) फ़ाइल नाम का एक्सटेंशन लौटाता है (अंतिम “.” (बिंदु) के बाद के सभी वर्ण, जिसमें “.” वर्ण भी शामिल है)। |
|||||||||||
|
sPath = SysUtils.ExtractFilePath(sFileName) फ़ाइल नाम से पथ (ड्राइव लेटर सहित) निकालता है। पथ अंतिम निर्देशिका विभाजक वर्ण (“/” या “\”) से पहले के सभी वर्णों से बना होता है, जिसमें निर्देशिका विभाजक स्वयं भी शामिल होता है। |
|||||||||||
|
sDir = SysUtils.ExtractFileDir(sFileName) केवल sFileName की निर्देशिका का हिस्सा निकालता है, जिसमें ड्राइव लेटर शामिल होता है। निर्देशिका नाम के अंत में निर्देशिका विभाजक नहीं होता है, जो इसे |
|||||||||||
|
sDrive = SysUtils.ExtractFileDrive(sFileName) फ़ाइल नाम से ड्राइव का हिस्सा निकालता है। कृपया ध्यान दें कि कुछ ऑपरेटिंग सिस्टम ड्राइव लेटर का समर्थन नहीं करते हैं। |
|||||||||||
|
sName = SysUtils.GetAbsolutePath(sFileName, sBaseDirectory) फ़ाइल का पूर्ण (Absolute) पथ लौटाता है:
यदि पूर्ण पथ प्राप्त करना असंभव है, तो फ़ंक्शन sFileName का मान लौटाएगा। |
|||||||||||
|
sName = SysUtils.GetRelativePath(sFileName, sBaseDirectory) निर्दिष्ट निर्देशिका के सापेक्ष फ़ाइल का नाम लौटाता है:
यदि sFileName और sBaseDirectory में समान मान हैं, तो फ़ंक्शन खाली स्ट्रिंग ("") लौटाएगा। यदि सापेक्ष पथ के साथ फ़ाइल का नाम प्राप्त करना असंभव है, तो फ़ंक्शन sFileName का मान लौटाएगा। |
|||||||||||
|
bResult = SysUtils.MatchesMask(sFileName, sMask, iMaskOptions) यदि sFileName पास किए गए मास्क sMask से मेल खाता है, तो iMaskOptions (वैकल्पिक पैरामीटर, डिफ़ॉल्ट रूप से 0) निम्नलिखित मानों के योग पर सेट होता है:
|
|||||||||||
|
bResult = SysUtils.MatchesMaskList(sFileName, sMaskList, sSeparator, iMaskOptions) यदि sFileName, sSeparator (डिफ़ॉल्ट रूप से “;”) द्वारा अलग की गई पास की गई मास्क सूची sMaskList में से कम से कम एक से मेल खाता है, तो sSeparator और iMaskOptions (ऊपर देखें) वैकल्पिक पैरामीटर हैं। |
|||||||||||
|
sTempFileName = SysUtils.GetTempName() एक अस्थायी फ़ाइल नाम (सिस्टम अस्थायी फ़ाइल निर्देशिका में) लौटाएगा, जो os.tmpname फ़ंक्शन के समान है, लेकिन फ़ाइल एक ऐसी उपनिर्देशिका में बनाई जाएगी जो Double Commander बंद होने पर स्वचालित रूप से हटा दी जाती है। |
|||||||||||
|
SysUtils.PathDelim वह वर्ण जिसका उपयोग वर्तमान ऑपरेटिंग सिस्टम द्वारा पूर्ण फ़ाइल नाम में निर्देशिका नामों को अलग करने के लिए किया जाता है। Unix/Linux प्रणालियों में, निर्देशिका विभाजक “/” होगा, और Windows में यह “\” होगा। |
|||||||||||
FileGetAttr फ़ाइल sFileName की विशेषता सेटिंग्स (Attributes) लौटाता है।
विशेषताएं निम्नलिखित स्थिरांकों (Constants) का OR संयोजन हैं:
| SysUtils.FileGetAttr रिटर्न मानों में उपयोग किए जाने वाले स्थिरांक | |
|---|---|
| मान | अर्थ |
0x00000001 faReadOnly |
फ़ाइल केवल-पठनीय (Read-Only) है। |
0x00000002 faHidden |
फ़ाइल छिपी हुई (Hidden) है। Unix/Linux में, इसका मतलब है कि फ़ाइल का नाम बिंदु से शुरू होता है। |
0x00000004 faSysFile |
फ़ाइल सिस्टम फ़ाइल है। Unix/Linux में, इसका मतलब है कि फ़ाइल एक वर्ण या ब्लॉक डिवाइस, या नामित पाइप (FIFO) है। |
0x00000008 faVolumeId |
वॉल्यूम लेबल (Volume ID)। केवल DOS/Windows पर सामान्य FAT (गैर VFAT या FAT32) फ़ाइल सिस्टम पर लागू होता है। |
0x00000010 faDirectory |
फ़ाइल एक निर्देशिका (Directory) है। |
0x00000020 faArchive |
फ़ाइल संग्रहीत (Archive) है। Unix/Linux में संभव नहीं है। |
0x00000400 faSymLink |
फ़ाइल एक सिंबॉलिक लिंक है। |
| नोट: त्रुटि के मामले में, -1 लौटाया जाएगा। | |
कृपया अगले अनुभाग में उदाहरण देखें।
निम्नलिखित स्क्रिप्ट SysUtils.FileGetAttr के उपयोग का एक उदाहरण है।
जब यह पता चलता है कि पैरामीटर एक निर्देशिका है, तो यह सक्रिय पैनल में एक नया टैब खोलेगा और उस निर्देशिका में स्विच करेगा।
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
-- क्या चौथा बिट सेट है? तो यह एक निर्देशिका है।
DC.ExecuteCommand("cm_NewTab")
DC.ExecuteCommand("cm_ChangeDir", params[1])
end
end
end
उपरोक्त उदाहरण में, params[1] स्क्रिप्ट को पास किया गया पहला पैरामीटर है।
आंतरिक कमांड cm_ExecuteScript का उपयोग करते समय, यह स्क्रिप्ट फ़ाइल नाम के बाद पास किया गया पहला पैरामीटर होगा।
इसलिए, हमारे उदाहरण में, हम टूलबार बटन को निम्न प्रकार से कॉन्फ़िगर कर सकते हैं:

इस उदाहरण में, पैरामीटर %"0%p स्क्रिप्ट को पहले पैरामीटर के रूप में पास किया जाएगा। यह वर्तमान सक्रिय पैनल में चयनित आइटम का बिना उद्धरण वाला फ़ाइल नाम प्रस्तुत करेगा।
निम्नलिखित स्क्रिप्ट उदाहरण में, हम मापदंड में प्राप्त निर्देशिका की सामग्री को स्कैन करेंगे, और परिणामी डेटा को दूसरे मापदंड के रूप में पास किए गए फ़ाइल नाम वाली एक टेक्स्ट फ़ाइल में सहेजेंगे।
यह हमें FindFirst, FindNext और FindClose के उपयोग की एक अच्छी समझ प्रदान करेगा।
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
उपरोक्त उदाहरण में, हमें स्क्रिप्ट को दो पैरामीटर पास करने की आवश्यकता है:
इसलिए, आंतरिक कमांड cm_ExecuteScript का उपयोग करके टूलबार बटन को कॉन्फ़िगर करना और मापदंड पास करके यह सब करना बहुत आसान है।

इस उदाहरण में, पैरामीटर %"0%Ds स्क्रिप्ट को पहले पैरामीटर के रूप में पास किया जाएगा। यह सक्रिय पैनल द्वारा प्रदर्शित निर्देशिका को बिना उद्धरण के प्रस्तुत करेगा।
Double Commander हमारी लुआ स्क्रिप्ट के लिए बाहरी क्लिपबोर्ड कार्यक्षमता प्रदान कर सकता है।
नीचे दी गई तालिका में संबंधित फ़ंक्शन दिए गए हैं:
| क्लिपबोर्ड लाइब्रेरी | |
|---|---|
| फ़ंक्शन नाम | विवरण |
|
Clipbrd.Clear() क्लिपबोर्ड की सामग्री को साफ़ करता है। |
|
|
sVar = Clipbrd.GetAsText() क्लिपबोर्ड की वर्तमान टेक्स्ट सामग्री प्राप्त करता है और उसे sVar को सौंपता है। यदि क्लिपबोर्ड में कोई टेक्स्ट नहीं है, तो फ़ंक्शन एक खाली स्ट्रिंग लौटाएगा। |
|
|
Clipbrd.SetAsText(sVar) क्लिपबोर्ड में sVar की टेक्स्ट सामग्री संग्रहीत करता है। |
|
|
Clipbrd.SetAsHtml(sHtml) html प्रारूप वाले टेक्स्ट sHtml को क्लिपबोर्ड ( यह सामग्री उन अनुप्रयोगों में सम्मिलित की जाएगी जो इस क्लिपबोर्ड प्रारूप का समर्थन करते हैं, जैसे MS Word, LO Writer आदि। डेटा संग्रहीत करने के लिए उदाहरण के लिए, हमारे पास निम्नलिखित हो सकते हैं:
यदि हम नोटपैड पर स्विच करके कुछ पेस्ट करने का प्रयास करते हैं, तो यह उस संदेश को सादे टेक्स्ट के रूप में पेस्ट करेगा जिसे हमने |
|
निम्नलिखित उदाहरण क्लिपबोर्ड से संबंधित तीन फ़ंक्शनों का उपयोग करता है: Clear, GetAsText और SetAsText।
यह अपेक्षाकृत लंबा स्क्रिप्ट है, लेकिन यह ऊपर देखे गए कुछ फ़ंक्शनों को अच्छी तरह से जोड़ता है।
यह मानता है कि हमारा सक्रिय पैनल वर्तमान में एक ऐसी निर्देशिका में है जिसमें कई स्रोत टेक्स्ट फ़ाइलें हैं।
यह यह भी मानता है कि हमारे पास वर्तमान में क्लिपबोर्ड में एक शब्द है, और यह वर्तमान सक्रिय फ़ोल्डर को एकल मापदंड के रूप में प्राप्त करेगा।
स्क्रिप्ट वर्तमान निर्देशिका स्तर की फ़ाइलों को स्कैन करेगी, और एक-एक करके उनकी सामग्री को पढ़ेगी ताकि यह पता लगाया जा सके कि कौन सी पंक्तियाँ क्लिपबोर्ड वाले शब्द को समाहित करती हैं।
फिर, उस शब्द को समाहित करने वाली कम से कम एक पंक्ति वाली फ़ाइलों के नामों को क्लिपबोर्ड में रखा जाएगा।
इसके बाद, स्क्रिप्ट आंतरिक कमांड cm_LoadSelectionFromClip का उपयोग करेगी, और उस शब्द वाली फ़ाइलें चुनी जाएंगी।
इसके अलावा, अंत में, हम खोजे जाने वाले मूल शब्द को वापस क्लिपबोर्ड में रख देंगे।
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
यह लाइब्रेरी हमारी स्क्रिप्ट को उपयोगकर्ता के साथ बातचीत करने, संदेश प्रदर्शित करने, उत्तर मांगने आदि की अनुमति देती है।
नीचे दी गई तालिका संबंधित फ़ंक्शनों को सूचीबद्ध करती है:
| संवाद लाइब्रेरी | |
|---|---|
| फ़ंक्शन नाम | विवरण |
|
iButton = Dialogs.MessageBox(sMessage, sTitle, iFlags) एक संदेश बॉक्स प्रदर्शित करता है, जो उपयोगकर्ता को एक बटन पर क्लिक करने के लिए प्रेरित करता है, जिसे फ़ंक्शन द्वारा लौटाया जाएगा:
|
|
|
bResult, sAnswer = Dialogs.InputQuery(sTitle, sMessage, bMask, sDefault) एक इनपुट बॉक्स प्रदर्शित करता है जहाँ उपयोगकर्ता एक स्ट्रिंग दर्ज कर सकता है:
|
|
|
sItem, iItem = Dialogs.InputListBox(sTitle, sMessage, aItems, sDefault) एक संवाद बॉक्स प्रदर्शित करता है जो उपयोगकर्ता को आइटम सूची में से चुनने की अनुमति देता है:
|
|
Dialogs.MessageBox फ़ंक्शन द्वारा प्रदर्शित बटनों को निम्नलिखित स्थिरांकों के बिटवाइज़ OR मान द्वारा नियंत्रित किया जाता है:
| Dialogs.MessageBox प्रदर्शित बटनों के लिए ButFlags स्थिरांक | |
|---|---|
| स्थिरांक मान | प्रदर्शित बटन, बाएं से दाएं |
0x0000 MB_OK |
|
0x0001 MB_OKCANCEL |
|
0x0002 MB_ABORTRETRYIGNORE |
|
0x0003 MB_YESNOCANCEL |
|
0x0004 MB_YESNO |
|
0x0005 MB_RETRYCANCEL |
|
Dialogs.MessageBox फ़ंक्शन द्वारा प्रदर्शित विंडो शैलियाँ निम्नलिखित स्थिरांकों के बिटवाइज़ OR मान द्वारा नियंत्रित की जाती हैं:
| Dialogs.MessageBox आइकन और शैलियों के लिए ButFlags स्थिरांक | |
|---|---|
| स्थिरांक मान | विंडो शैली |
0x0040 MB_ICONINFORMATION |
|
0x0030 MB_ICONWARNING |
|
0x0020 MB_ICONQUESTION |
|
0x0010 MB_ICONERROR |
|
Dialogs.MessageBox फ़ंक्शन द्वारा प्रदर्शित डिफ़ॉल्ट सक्रिय बटन निम्नलिखित स्थिरांकों के बिटवाइज़ OR मान द्वारा नियंत्रित किया जाता है:
| Dialogs.MessageBox डिफ़ॉल्ट बटनों के लिए ButFlags स्थिरांक | |
|---|---|
| स्थिरांक मान | डिफ़ॉल्ट बटन |
0x0000 MB_DEFBUTTON1 |
डिफ़ॉल्ट रूप से बाईं ओर से पहला बटन |
0x0100 MB_DEFBUTTON2 |
डिफ़ॉल्ट रूप से बाईं ओर से दूसरा बटन |
0x0200 MB_DEFBUTTON3 |
डिफ़ॉल्ट रूप से बाईं ओर से तीसरा बटन |
Dialogs.MessageBox फ़ंक्शन द्वारा लौटाया गया नंबर उपयोगकर्ता द्वारा दबाए गए बटन को इंगित करता है, जैसा कि नीचे दिखाया गया है:
| Dialogs.MessageBox बटन दबाए जाने पर लौटाए जाने वाले ButPressed मान | |
|---|---|
| स्थिरांक मान | दबाया गया बटन |
0x0000 mrNone |
कोई बटन नहीं दबाया गया |
0x0001 mrOK |
|
0x0002 mrCancel |
|
0x0003 mrAbort |
|
0x0004 mrRetry |
|
0x0005 mrIgnore |
|
0x0006 mrYes |
|
0x0007 mrNo |
|
नोट: यदि आप ऊपरी दाएं कोने में “x” दबाकर या Esc दबाकर विंडो बंद करते हैं, तो “रद्द करें” (Cancel) बटन का मान लौटाया जाएगा।
निम्नलिखित Dialogs.MessageBox का उपयोग करने वाला एक छोटा स्क्रिप्ट है और परिणामी विंडो प्रदर्शित की जाएगी:
-- प्रदर्शित बटन 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.InputQuery का उपयोग करने वाला एक छोटा स्क्रिप्ट है और परिणामी विंडो प्रदर्शित की जाएगी:
bResult, sAnswer = Dialogs.InputQuery("पहचान सत्यापन", "कृपया अपना नाम दर्ज करें:", false, "जॉन") if bResult == true then Dialogs.MessageBox("नमस्ते " .. sAnswer .. "!", "स्वागत है!", 0x0040) end

यह लाइब्रेरी UTF-8 एन्कोडिंग के लिए बुनियादी समर्थन प्रदान करती है।
यह LazUtf8 तालिका में सभी फ़ंक्शन प्रदान करती है।
| UTF-8 लाइब्रेरी | |
|---|---|
| फ़ंक्शन नाम | विवरण |
|
iResult = LazUtf8.Pos(SearchText, SourceText, Offset) निर्दिष्ट स्थिति से शुरू करके स्ट्रिंग में उप-स्ट्रिंग (Substring) की खोज करता है। खोज केस-संवेदी होती है। SourceText स्ट्रिंग में पहली बार SearchText उप-स्ट्रिंग के प्रकट होने की स्थिति लौटाता है, खोज Offset स्थिति (डिफ़ॉल्ट रूप से 1) से शुरू होती है। यदि दिए गए Offset के बाद SearchText उप-स्ट्रिंग SourceText में प्रकट नहीं होती है, तो यह शून्य (0) लौटाएगा। |
|
|
LazUtf8.Next(String) एक पुनरावृत्त (Iterator) फ़ंक्शन, जो हर बार कॉल किए जाने पर String का अगला वर्ण और बाइट्स में उस वर्ण की प्रारंभिक स्थिति लौटाता है। उदाहरण: -- "स्थिति : वर्ण" के रूप में मान मुद्रित करें for iPos, sChar in LazUtf8.Next(String) do DC.LogWrite(iPos .. " : " .. sChar) end |
|
|
sResult = LazUtf8.Copy(String, iIndex, iCount) स्ट्रिंग के एक हिस्से को कॉपी करता है। Copy एक स्ट्रिंग लौटाता है जो String में iIndex स्थिति से शुरू होने वाले iCount वर्णों की प्रतिलिपि (Copy) होती है। यदि iCount का मान String की लंबाई से अधिक है, तो परिणाम को छोटा कर दिया जाएगा। यदि iIndex का मान String की लंबाई से अधिक है, तो यह खाली स्ट्रिंग लौटाएगा। |
|
|
iResult = LazUtf8.Length(String) स्ट्रिंग में UTF-8 वर्णों की संख्या लौटाता है। |
|
|
sResult = LazUtf8.UpperCase(String) एक स्ट्रिंग प्राप्त करता है और उस स्ट्रिंग की एक प्रतिलिपि लौटाता है जहाँ सभी छोटे अक्षरों को बड़े अक्षरों में बदल दिया गया है। |
|
|
sResult = LazUtf8.LowerCase(String) एक स्ट्रिंग प्राप्त करता है और उस स्ट्रिंग की एक प्रतिलिपि लौटाता है जहाँ सभी बड़े अक्षरों को छोटे अक्षरों में बदल दिया गया है। |
|
|
sResult = LazUtf8.ConvertEncoding(String, FromEnc, ToEnc) String की एन्कोडिंग को FromEnc से ToEnc में परिवर्तित करता है। समर्थित एन्कोडिंग मानों की सूची:
Windows में (अंग्रेजी या रूसी):
|
|
|
sEnc = LazUtf8.DetectEncoding(String) स्थानांतरित टेक्स्ट का एन्कोडिंग मान लौटाता है। |
|
इस लाइब्रेरी में यह जांचने के फ़ंक्शन शामिल हैं कि क्या कोई वर्ण किसी विशिष्ट यूनिकोड श्रेणी से संबंधित है, और उस वर्ण की श्रेणी प्राप्त करने के फ़ंक्शन भी हैं।
इस लाइब्रेरी में उपलब्ध फ़ंक्शनों की सूची:
| वर्ण लाइब्रेरी | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| फ़ंक्शन नाम | विवरण | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
iResult = Char.GetUnicodeCategory(Character) वर्ण
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
bResult = Char.IsDigit(Character) यदि Character वर्ण Nd श्रेणी में है, तो |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
bResult = Char.IsLetter(Character) यदि Character वर्ण Lu, Ll, Lt, Lm या Lo श्रेणी में है, तो |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
bResult = Char.IsLetterOrDigit(Character) यदि Character वर्ण Lu, Ll, Lt, Lm, Lo, Nd या Nl श्रेणी में है, तो |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
bResult = Char.IsLower(Character) यदि Character वर्ण Ll श्रेणी में है, तो |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
bResult = Char.IsUpper(Character) यदि Character वर्ण Lu श्रेणी में है, तो |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
इसके अलावा, ये फ़ंक्शन दो मापदंडों के उपयोग का समर्थन करते हैं: हम एकल वर्ण के बजाय एक स्ट्रिंग और उस स्ट्रिंग में वर्ण की स्थिति निर्दिष्ट कर सकते हैं।
यह लाइब्रेरी उस ऑपरेटिंग सिस्टम से संबंधित फ़ंक्शन प्रदान करती है जिस पर Double Commander चल रहा है।
इस लाइब्रेरी में उपलब्ध फ़ंक्शनों की सूची नीचे दी गई है:
| ऑपरेटिंग सिस्टम लाइब्रेरी | |
|---|---|
| फ़ंक्शन नाम | विवरण |
|
iResultCode = os.execute(sCommand) sCommand को निष्पादित करेगा, ठीक वैसे ही जैसे कमांड लाइन में दर्ज किया गया हो, और ऑपरेशन का परिणाम कोड (Result Code) लौटाएगा। sCommand हो सकता है:
|
|
|
sTempFileName = os.tmpname() एक अस्थायी फ़ाइल नाम (सिस्टम अस्थायी फ़ाइल निर्देशिका में) लौटाएगा। |
|
|
bResult, sError, iError = os.remove(sFileName) sFileName नामक फ़ाइल या निर्देशिका को हटा देगा। यदि सफल होता है, तो फ़ंक्शन यदि विफल रहता है, तो फ़ंक्शन तीन चीजें लौटाता है:
|
|
|
bResult, sError, iError = os.rename(sOldName, sNewName) sOldName फ़ाइल का नाम बदलकर नया नाम sNewName कर देगा। नोट: यदि sNewName नामक फ़ाइल पहले से मौजूद है, तो उसे बदल (Replace) दिया जाएगा! यदि सफल होता है, तो फ़ंक्शन यदि विफल रहता है, तो फ़ंक्शन तीन चीजें लौटाता है:
|
|
|
Value = os.getenv(VariableName) मापदंड में पास किए गए VariableName चर का Value लौटाएगा। |
|
|
os.setenv(VariableName, Value) VariableName पर्यावरण चर (Environment Variable) जोड़ता है या बदलता है। त्रुटि के मामले में, फ़ंक्शन -1 लौटाता है। |
|
|
os.unsetenv(VariableName) VariableName पर्यावरण चर को हटाता है। त्रुटि के मामले में, फ़ंक्शन -1 लौटाता है। |
|