Double Commander

2.15. Lua スクリプト

コンテンツ

1. はじめに
2. 必要なDLL
3. Double Commander ライブラリ
3.1. DC ライブラリ
3.1.1. DC.ExecuteCommand 使用例
3.2. システムライブラリ
3.2.1. SysUtils.FileGetAttr 戻り値詳細
3.2.2. SysUtils.FileGetAttr 使用例
3.2.3. FindFirst、FindNext、FindClose 使用例
3.3. クリップボードライブラリ
3.3.1. クリップボードライブラリ使用例
3.4. ダイアログライブラリ
3.4.1. Dialogs.MessageBox 表示ボタン
3.4.2. Dialogs.MessageBox ウィンドウスタイル
3.4.3. Dialogs.MessageBox デフォルトアクティブボタン
3.4.4. Dialogs.MessageBox 戻り値
3.4.5. Dialogs.MessageBox 使用例
3.4.6. Dialogs.InputQuery 使用例
3.5. UTF-8 ライブラリ
3.6. 文字ライブラリ
3.7. オペレーティングシステムライブラリ
4. インデックス

1. はじめに

Lua スクリプトプログラミング言語の詳細については、Lua Webサイトをご覧ください。

Double Commander は cm_ExecuteScript コマンドで Lua スクリプトを実行できます。
スクリプトパラメータはエスケープせずにそのまま渡す必要があります(引用符や「\」は不要)。このためには %"0 変数を使用する必要があります。例えば、カーソル下のファイルには %p0 ではなく %"0%p0 を、現在のディレクトリには %D ではなく %"0%D を使用します。そうしないと、Double Commander が自動的に引用符を追加し、それらがパラメータの一部として渡されてしまうため、その点を考慮する必要があります。
すべての選択されたファイルのリストを取得するには、変数%LU%FU、または %RU)または内部コマンド(cm_SaveSelectionToFilecm_SaveFileDetailsToFilecm_CopyFullNamesToClip、または cm_CopyFileDetailsToClip)を使用できます。 たとえば、%p を使用できます。この場合、Double Commander はすべての選択されたファイル名を1行にスペース区切りで渡します。

Lua スクリプトを使用してコンテンツプラグインを作成することも可能です。例はプログラムフォルダ内にあります(plugins/wdx/scripts)。 プラグイン作成専用のページが Wiki にあります。 制限事項:以下のデータ型のみサポートされています

上記リストはヘッダーファイル内の名前を含んでおり、Lua スクリプトでは括弧内に指定された数値を使用する必要があります。


テキストエンコーディングについて

以下に記述されているすべての追加関数は、UTF-8 エンコードされた文字列パラメータを受け入れ、このエンコーディングの文字列を返します(LazUtf8.ConvertEncoding 関数を除く)。

いくつかの標準 Lua ライブラリの関数は、Double Commander または Free Pascal/Lazarus の関数に置き換えられている(または新しい関数が作成されている)ため、UTF-8 サポートが提供されます。

プラグインを作成する際には、テキストデータにも UTF-8 を使用すべきです(ft_multiplechoiceft_string、および ft_fulltext)。

スクリプトを保存する際は、BOMなしの UTF-8 エンコーディングを使用してください。


注意事項

Lua を使用した自動化には大きな可能性がありますが、状況によっては注意すべき詳細があります。このセクションでそれらを集めてみましょう。

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. Lua 関数 io.open は標準 C 関数 fopen を使用します。テキストモードでは、この関数は読み書き時に改行コードの種類(CRLF、LF、または CR)を変換する可能性があり、予期せぬ結果を招くことがあります。異なる改行コードを持つファイルを扱う場合やクロスプラットフォームスクリプトを書く場合は、これを考慮する必要があります。より現実的な解決策としては、バイナリモードを優先的に使用することです。

3. Linux および他の Unix 系オペレーティングシステムでは、ファイル属性ダイアログボックスにおいて、ContentGetValue 関数を呼び出す際に CONTENT_DELAYIFSLOW フラグ(第4引数、値は1)が設定されます。これによりウィンドウを開く際の遅延を回避できます。データ取得が遅い場合、単純にフラグ値チェックを追加し、これらのフィールドまたはプラグインに対して nil を返すことで、これらのデータを除外できます。

4. プラグインが空の文字列を返すべき場合、"" を渡すよりも nil を渡す方が高速です。

2. 必要なDLL

Lua スクリプトファイルを解釈できるようにするには、Lua DLL ファイルが必要です。Double Commander はバージョン 5.1 - 5.4 をサポートしています。

LuaJIT プロジェクトからの DLL ファイルを使用できます。LuaJIT はアセンブリで書かれた高速インタープリターと高度な JIT コンパイラーを組み合わせています。さらに、FFI ライブラリも利用可能になり、純粋な Lua コードから外部 C 関数を呼び出し、C データ構造を使用できます。

Windows 版の DC にはデフォルトで Lua DLL が含まれています(DC 0.9.7 以降では LuaJIT プロジェクトからのもの)。その他の環境では、パッケージマネージャーで検索・インストールするか、自分でコンパイルする必要があります。64ビット版の DC を使用している場合、DLL も 64ビット版である必要があります。

デフォルトでは、DC はそのディレクトリとシステムディレクトリ内で lua5.1.dll(Windows)、liblua5.1.so.0(Unix または GNU/Linux)、または liblua5.1.dylib(macOS)という名前のファイルを探します。使用する Lua ライブラリファイルパラメータでファイル名(およびパス)を変更できます。

3. Double Commander ライブラリ

Double Commander は Lua スクリプト用のいくつかのライブラリを提供します。

以下がそれらのライブラリのリストです。

ライブラリ一覧
ライブラリ名スクリプト名簡単な説明
DCDouble Commander 固有の関数
SysUtils各種システム関数
Clipbrd外部クリップボード機能
Dialogsユーザーとの対話
LazUtf8UTF-8 文字列関数
Char文字情報の取得
osオペレーティングシステム関連の関数

3.1. DC ライブラリ

このライブラリには Double Commander 固有の関数が含まれています。

すべての関数は DC テーブルで提供されます。

DC ライブラリ
関数名説明

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

ログウィンドウにメッセージを書き込みます:

  • sMessage : メッセージテキスト。
  • iMsgType : メッセージタイプ:0 - 情報、1 - 成功、2 - エラー。
  • bForce : ブール値、trueの場合、ログウィンドウが非表示でも表示されます。
  • bLogFile : ブール値、trueの場合、メッセージをログファイルにも書き込みます。

iPanel = DC.CurrentPanel()

アクティブパネルを取得:左パネルがアクティブの場合は0、そうでない場合は1を返します。

DC.CurrentPanel(iPanel)

アクティブパネルを設定:iPanel が0の場合は左パネル、1の場合は右パネルになります。

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

これにより、スクリプトは Double Commander の 内部コマンドを呼び出すことができます。

sCommand は実際の内部コマンド名です。

コマンドがサポートする任意の数の Param... 引数を提供できます。

内部コマンドに加えて、スクリプトでは特別なコマンド cm_ExecuteToolBarItem を使用できます。このコマンドにより識別子を通じてツールバーボタンを呼び出すことができます(プログラム内では、この機能によりツールバーボタンにショートカットキーを使用できます)。このコマンドは通常の内部コマンドと同様に使用されます(以下の例を参照)が、以下のパラメータを持ちます:

パラメータ 説明
ToolBarID TfrmOptionsToolbar メインツールバーのボタン
TfrmOptionsToolbarMiddle 中央ツールバーのボタン
(存在しない) メインツールバーのボタン
ToolItemID 識別子 ボタンの一意の識別子

一意の識別子は ID タグに保存されます。それを取得する方法はいくつかあります:doublecmd.xml ファイルやツールバーのバックアップファイルでボタンを見つけるか、またはボタンをクリップボードにコピーし、テキストエディタでそのコードを貼り付けることができます。

注意:識別子は自動生成されるため、プログラムの別のコピーにある類似のボタンの識別子と一致する必要はありません。しかし、必要に応じて独自の値を手動で設定できます。

3.1.1. DC.ExecuteCommand 使用例

この例では、以下の操作を行う簡単なスクリプトを作成します:

  1. 右パネルにフォーカスを当てる
  2. すべての開いているタブを閉じる
  3. 特定のフォルダに移動
  4. 左パネルにフォーカスを当てる
  5. すべての開いているタブを閉じる
  6. 特定のフォルダに移動
  7. 新しいタブを開く
  8. 特定のフォルダに移動
-- 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 であると仮定すると、次のようにボタンを設定できます:

ツールバーから Lua スクリプトを呼び出す

さらに、Double Commander 内蔵エディタを使用してスクリプトを編集できます。ファイル名が .lua 拡張子を持っている場合、内蔵エディタはそれを認識し、Lua 言語用の構文ハイライトを提供します:

内蔵エディタによる Lua 構文ハイライト

3.2. システムライブラリ

このライブラリには各種システム関数が含まれています。

すべての関数は SysUtils テーブルで提供されます。

システムライブラリ
関数名説明

SysUtils.Sleep(iMilliseconds)

指定されたミリ秒数 iMilliseconds の間、スクリプトの実行を一時停止します。
指定時間経過後、スクリプトの実行が再開されます。

SysUtils.GetTickCount()

増加するクロックティックカウントを返します。時間測定に使用できますが、ティック間隔を前提とすべきではありません。

bExists = SysUtils.FileExists(sFileName)

ファイルシステムに特定のファイルが存在するかどうかを確認します。

ディスク上に sFileName という名前のファイルが存在する場合、bExiststrue が返されます。そうでない場合は false が返されます。

bExists = SysUtils.DirectoryExists(sDirectory)

sDirectory がファイルシステムに存在し、実際にディレクトリであるかどうかを確認します。

そのような場合、関数は bExiststrue を返し、そうでない場合は false を返します。

iAttr = SysUtils.FileGetAttr(sFileName)

iAttr にファイル sFileName の属性設定を返します。

戻り値の詳細についてはこちらを参照してください。

Handle, FindData = SysUtils.FindFirst(sPath)

sPath に一致するファイルを検索します。通常ワイルドカードを使用します。

ファイルが見つからない場合、Handlenil になります。

少なくとも1つの項目が見つかった場合、返された Handle は同じパターンの他の一致項目を検索するために後続の SysUtils.FindNext 呼び出しで使用できます。

FindData テーブルには見つかったファイルまたはディレクトリの情報が含まれます。

FindData テーブルのフィールドは以下の通りです:

  • Name : ファイル名(パスを除く)。
  • Attr : ファイルの属性(詳細についてはこちらを参照)。
  • Size : ファイルサイズ(バイト単位)。
  • Time : ファイルのタイムスタンプ(1970年1月1日からの秒数)。

Result, FindData = SysUtils.FindNext(Handle)

以前に返された Handle を再利用して、FindFirst によって開始された検索シーケンスの次の一致項目を見つけます。

ファイルまたはディレクトリが見つかった場合、返された Result は空ではなくなり、そうでない場合は nil になります。

SysUtils.FindFirst と同じ注意事項がここでも適用されます。

備考:最後の SysUtils.FindNext 呼び出しの後には、必ず同じ Handle を使用した SysUtils.FindClose 呼び出しを行う必要があります。そうしないとメモリリークが発生します。

SysUtils.FindClose(Handle)

SysUtils.FindFirst/SysUtils.FindNext 呼び出しのシリーズを終了します。

これらの呼び出しで使用されたメモリを解放します。

この呼び出しは絶対に必要であり、そうしないとメモリリークが発生する可能性があります。

bResult = SysUtils.CreateDirectory(sDirectory)

一連のディレクトリを作成します。sDirectory はディレクトリの完全なパスです。

sDirectory が既に存在するか、正常に作成された場合は true を返します。作成に失敗した場合は false を返します。

bResult = SysUtils.CreateHardLink(sFileName, sLinkName)

ファイル sFileName のハードリンク sLinkName を作成します。

成功した場合は true、失敗した場合は false を返します。

bResult = SysUtils.CreateSymbolicLink(sFileName, sLinkName)

ファイルまたはディレクトリ sFileName のシンボリックリンク sLinkName を作成します。

成功した場合は true、失敗した場合は false を返します。

sTarget = SysUtils.ReadSymbolicLink(sLinkName, bRecursive)

シンボリックリンク sLinkName のターゲットを読み取ります。

bRecursivetrue で、リンクが別のリンクを指している場合、有効な非リンクファイル名が見つかるまで再帰的に解決されます。

シンボリックリンク sLinkName が指すパスを返します。リンクが無効または指すファイルが存在せず、かつ bRecursivetrue の場合は空文字列を返します。

sName = SysUtils.ExtractFileName(sFileName)

完全なパスのファイル名からファイル名部分を抽出します。

ファイル名は最後のディレクトリ区切り文字(「/」または「\」)またはドライブ文字の後のすべての文字で構成されます。

sExt = SysUtils.ExtractFileExt(sFileName)

ファイル名の拡張子(最後の「.」(ドット)以降のすべての文字、「.」文字を含む)を返します。

sPath = SysUtils.ExtractFilePath(sFileName)

ファイル名からパス(ドライブ文字を含む)を抽出します。

パスは最後のディレクトリ区切り文字(「/」または「\」)より前のすべての文字で構成され、ディレクトリ区切り文字自体も含まれます。

sDir = SysUtils.ExtractFileDir(sFileName)

sFileName のディレクトリ部分のみを抽出します。ドライブ文字も含みます。

ディレクトリ名には末尾のディレクトリ区切り文字が含まれず、これは SysUtils.ExtractFilePath とは異なります。

sDrive = SysUtils.ExtractFileDrive(sFileName)

ファイル名からドライブ部分を抽出します。

一部のオペレーティングシステムではドライブ文字がサポートされていないことに注意してください。

sName = SysUtils.GetAbsolutePath(sFileName, sBaseDirectory)

ファイルの絶対(完全)パスを返します:

  • sFileName : 相対パスを持つファイル名。
  • sBaseDirectory : sFileName のベースディレクトリとして使用するディレクトリ。

絶対パスを取得できない場合、関数は sFileName の値を返します。

sName = SysUtils.GetRelativePath(sFileName, sBaseDirectory)

指定されたディレクトリに対する相対ファイル名を返します:

  • sFileName : 完全(絶対)ファイル名。
  • sBaseDirectory : sFileName のベースディレクトリとして使用するディレクトリ。

sFileNamesBaseDirectory が同じ値を含む場合、関数は空文字列("")を返します。相対パスのファイル名を取得できない場合、関数は sFileName の値を返します。

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

sFileName が渡されたマスク sMask に一致する場合、true を返します。

iMaskOptions(オプションパラメータ、デフォルトは0)は以下の値の合計に設定されます:

説明
1
大文字小文字を区別
2
アクセント記号と合字を無視
4
Windows スタイルフィルター:「*.*」も拡張子のないファイルなどに一致
8
ピンインサポートを有効(ファイル pinyin.tbl を使用)

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

sFileNamesSeparator(デフォルトは「;」)で区切られた渡されたマスクリスト sMaskList の少なくとも1つに一致する場合、true を返します。

sSeparatoriMaskOptions(上記参照)はオプションパラメータです。

sTempFileName = SysUtils.GetTempName()

一時ファイル名として使用されるファイル名(システムの一時ファイルディレクトリ内)を返します。os.tmpname 関数と似ていますが、ファイルは Double Commander が閉じられたときに自動削除されるサブディレクトリ内に作成されます。
関数が一意の名前を作成できない場合、空文字列を返します。

SysUtils.PathDelim

現在のオペレーティングシステムで完全なファイル名中のディレクトリ名を区切るために使用される文字。

Unix/Linux システムではディレクトリ区切り文字は「/」、Windows では「\」になります。

3.2.1. SysUtils.FileGetAttr 戻り値の詳細

FileGetAttr はファイル sFileName の属性設定を返します。

属性は以下の定数の OR 組み合わせです:

SysUtils.FileGetAttr の戻り値で使用される定数
意味
0x00000001
faReadOnly
ファイルは読み取り専用です。
0x00000002
faHidden
ファイルは隠しファイルです。
Unix/Linux では、ファイル名がドットで始まることを意味します。
0x00000004
faSysFile
ファイルはシステムファイルです。
Unix/Linux では、ファイルがキャラクタデバイスまたはブロックデバイス、名前付きパイプ (FIFO) であることを意味します。
0x00000008
faVolumeId
ボリュームラベルです。
DOS/Windows 上の標準的な FAT(VFAT または FAT32 ではない)ファイルシステムでのみ有効です。
0x00000010
faDirectory
ファイルはディレクトリです。
0x00000020
faArchive
ファイルはアーカイブされています。
Unix/Linux では不可能です。
0x00000400
faSymLink
ファイルはシンボリックリンクです。
注意:エラーが発生した場合は -1 が返されます。

次のセクションの例をご参照ください。

3.2.2. SysUtils.FileGetAttr 使用例

以下のスクリプトは 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
      -- 4番目のビットがセットされているか?つまりディレクトリである。
      DC.ExecuteCommand("cm_NewTab")
      DC.ExecuteCommand("cm_ChangeDir", params[1])
    end
  end
end

上記の例では、params[1] はスクリプトに渡される最初の引数です。

内部コマンド cm_ExecuteScript を使用する際、これはスクリプトファイル名の後に渡される最初の引数となります。

そのため、この例では以下のようにツールバーボタンを設定できます:

cm_ExecuteScript の引数を使用

この例では、引数 %"0%p がスクリプトに渡されます。これは現在のアクティブパネルで選択されたアイテムのファイル名を引用符なしで表します。

3.2.3. FindFirst、FindNext、FindClose の使用例

以下のスクリプト例では、引数で受け取ったディレクトリの内容をスキャンし、結果データを第二引数で渡されたファイル名のテキストファイルに保存します。

これにより、FindFirstFindNextFindClose の使い方をよく理解できます。

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

上記の例では、スクリプトに二つの引数を渡す必要があります:

  1. params[1] - 内容を取得したいディレクトリ
  2. params[2] - 結果を保存する出力ファイル名

したがって、内部コマンド cm_ExecuteScript を使用してツールバーボタンを設定し、引数を渡すことで簡単に実行できます。

cm_ExecuteScript の引数を使用

この例では、引数 %"0%Ds がスクリプトの第一引数として渡されます。これはアクティブパネルに表示されているディレクトリを引用符なしで表します。

3.3. クリップボードライブラリ

Double Commander は、Lua スクリプトに外部クリップボード機能を提供できます。

関連する関数は以下の表の通りです:

クリップボードライブラリ
関数名説明

Clipbrd.Clear()

クリップボードの内容をクリアします。

sVar = Clipbrd.GetAsText()

クリップボードの現在のテキスト内容を取得し、sVar に割り当てます。クリップボードにテキストがない場合、関数は空の文字列を返します。

Clipbrd.SetAsText(sVar)

sVar のテキスト内容をクリップボードに保存します。

Clipbrd.SetAsHtml(sHtml)

HTML 形式のテキスト sHtml をクリップボードに追加します(CF_HTML クリップボード形式)。

これらの内容は、MS Word や LO Writer などのこのクリップボード形式に対応するアプリケーションに挿入されます。

Clipbrd.SetAsTextClipbrd.SetAsHtml の両方でデータを保存することが可能です。貼り付け時には、アプリケーションがサポートする最適な形式が使用されます。

例えば、次のような内容があります:

  • Clipbrd.SetAsText("Welcome to Double Commander!")
  • Clipbrd.SetAsHtml("Welcome to <b>Double Commander</b>!"))

メモ帳に切り替えて何かを貼り付けようとした場合、Clipbrd.SetAsText でコピーしたメッセージはプレーンテキストとして貼り付けられます。しかし、Microsoft Word に切り替えて貼り付けた場合、2番目、つまりDouble Commanderが太字で表示されるものが貼り付けられ、これは Microsoft Word がそのクリップボードコンテンツタイプを認識し、サポートしているためです。

3.3.1. クリップボードライブラリ使用例

以下の例では、クリップボードに関連する3つの関数:ClearGetAsText、および SetAsText を使用しています。

これは比較的長いスクリプトですが、上で見たいくつかの関数をうまく組み合わせています。

これは、アクティブパネルが多数のソーステキストファイルを含むディレクトリにあることを前提としています。

また、現在クリップボードに単語があり、現在のアクティブフォルダを単一の引数として受け取ることを前提としています。

スクリプトは現在のディレクトリレベルのファイルをスキャンし、それぞれの内容を1行ずつ読み込んで、クリップボード内の単語を含むテキスト行を検出します。

その後、少なくとも1行その単語を含むファイル名がクリップボードに配置されます。

そして、スクリプトは内部コマンド 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") -- 何も選択されていないことを確認。

  -- ディレクトリ内のすべてのファイルを1つずつスキャンしましょう。
  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

          -- 今度はファイルを1行ずつ読み込んで、終了または見つかるまで続けます。
          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. ダイアログライブラリ

このライブラリにより、スクリプトはユーザーと対話でき、メッセージを表示し、回答の入力を求めることができます。

関連する関数は以下の表にリストされています:

ダイアログライブラリ
関数名説明

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

メッセージボックスを表示し、ユーザーがボタンをクリックするのを促し、そのボタンが関数によって返されます:

  • sMessage: メッセージボックス内のテキスト。
  • sTitle: メッセージボックスのタイトル。
  • iFlags: 表示されるボタン、ウィンドウスタイル、およびデフォルトボタンを決定する定数のビット単位の OR 値。表示されるボタン、ウィンドウスタイル、またはデフォルトボタンについては、以下の表を参照してください:表示されるボタンウィンドウスタイル、またはデフォルトボタン
  • iButton: 戻り値で、ユーザーが押したボタンを示します(この表を参照)。

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

ユーザーが文字列を入力できるリクエストボックスを表示します:

  • sTitle: リクエストボックスのタイトル。
  • sMessage: リクエストボックス内のテキスト。
  • bMask: ブール値で、true の場合、文字を隠すために「アスタリスク」が表示されます。
  • sDefault: デフォルトの提案テキストで、ユーザーは必要に応じて変更できます。
  • bResult: ユーザーが実際に何かを入力したかどうかを示すブール値を返します。
  • sAnswer: ユーザーが何かを入力して OK をクリックした場合に返される文字列。

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

ユーザーがアイテムリストから選択できるダイアログを表示します:

  • sTitle: ダイアログのタイトル。
  • sMessage: ダイアログ内のテキスト。
  • aItems: 各要素が文字列である Lua テーブル。
  • sDefault: リスト内のデフォルトで選択されるアイテム。
  • sItem: 選択されたアイテムを文字列として返し、ダイアログがキャンセルされた場合は nil を返します。
  • iItem: 選択されたアイテムのインデックス(1 から始まり、Lua テーブルの慣習に従います)。

3.4.1. Dialogs.MessageBoxに表示されるボタン

Dialogs.MessageBox関数に表示されるボタンは、以下の定数のビット単位のOR値で制御されます:

Dialogs.MessageBoxボタン表示のButFlags定数
定数値表示されるボタン(左から右へ)
0x0000
MB_OK
ボタン OK
0x0001
MB_OKCANCEL
ボタン 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のウィンドウスタイル

Dialogs.MessageBox関数に表示されるウィンドウスタイルは、以下の定数のビット単位のOR値で制御されます:

Dialogs.MessageBoxアイコンとスタイルのButFlags定数
定数値ウィンドウスタイル
0x0040
MB_ICONINFORMATION
アイコン INFORMATION 情報ウィンドウ
0x0030
MB_ICONWARNING
アイコン WARNING 警告ウィンドウ
0x0020
MB_ICONQUESTION
アイコン QUESTION 確認ウィンドウ
0x0010
MB_ICONERROR
アイコン ERROR エラーウィンドウ

3.4.3. Dialogs.MessageBoxのデフォルトアクティブボタン

Dialogs.MessageBox関数に表示されるデフォルトアクティブボタンは、以下の定数のビット単位のOR値で制御されます:

Dialogs.MessageBoxデフォルトボタンのButFlags定数
定数値デフォルトボタン
0x0000
MB_DEFBUTTON1
デフォルトは左側の最初のボタン
0x0100
MB_DEFBUTTON2
デフォルトは左側の2番目のボタン
0x0200
MB_DEFBUTTON3
デフォルトは左側の3番目のボタン

3.4.4. Dialogs.MessageBoxの戻り値

Dialogs.MessageBox関数が返す数値は、ユーザーが押したボタンを示します:

Dialogs.MessageBoxボタン押下時のButPressed戻り値
定数値押されたボタン
0x0000
mrNone
ボタンが押されていない
0x0001
mrOK
結果 OK
0x0002
mrCancel
結果 CANCEL
0x0003
mrAbort
結果 ABORT
0x0004
mrRetry
結果 RETRY
0x0005
mrIgnore
結果 IGNORE
0x0006
mrYes
結果 YES
0x0007
mrNo
結果 NO

注意:右上の「×」をクリックするか、Escキーでウィンドウを閉じた場合、「キャンセル」ボタンの値が返されます。

3.4.5. Dialogs.MessageBox 使用例

以下は 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.MessageBox 使用例

3.4.6. Dialogs.InputQuery 使用例

以下は Dialogs.InputQuery を使用した小さなスクリプトと、表示される結果ウィンドウの例です:

bResult, sAnswer = Dialogs.InputQuery("認証", "お名前を入力してください:", false, "ジョン")

if bResult == true then
  Dialogs.MessageBox("こんにちは " .. sAnswer .. "さん!", "ようこそ!", 0x0040)
end

Dialogs.InputQuery 使用例

3.5. UTF-8 ライブラリ

このライブラリは UTF-8 エンコーディングの基本的なサポートを提供します。

すべての関数は LazUtf8 テーブルで提供されます。

UTF-8 ライブラリ
関数名説明

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

文字列内の指定位置からサブ文字列を検索します。検索は大文字小文字を区別します。

サブ文字列 SearchText が文字列 SourceText 内で最初に出現する位置を返し、検索は位置 Offset(デフォルトは1)から開始されます。

指定された Offset の後に SearchTextSourceText 内に出現しない場合、ゼロが返されます。

LazUtf8.Next(String)

イテレータ関数で、呼び出されるたびに String 内の次の文字とその開始位置(バイト単位)を返します。

例:

-- "位置 : 文字" の形式で値のペアを出力
for iPos, sChar in LazUtf8.Next(String) do
  DC.LogWrite(iPos .. " : " .. sChar)
end

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

文字列の一部をコピーします。

Copy は String 内の位置 iIndex から始まる iCount 文字のコピーである文字列を返します。

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 に変換します。

サポートされるエンコーディング値のリスト:

  • デフォルトシステムエンコーディング(システムロケールに依存):"default"。
  • デフォルト ANSI(Windows)エンコーディング(システムロケールに依存):"ansi"。
  • デフォルト OEM(DOS)エンコーディング(システムロケールに依存):"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"。
  • その他:"macintosh"、"koi8r"、"koi8u"、"koi8ru"。
特殊エンコーディングの意味(例)。

Windows での例(英語またはロシア語):
  • "default" - cp1252 または cp1251
  • "ansi" - cp1252 または cp1251
  • "oem" - cp850 または cp866
Linux での例(英語またはロシア語):
  • "default" - utf8
  • "ansi" - cp1252 または cp1251
  • "oem" - cp850 または cp866

sEnc = LazUtf8.DetectEncoding(String)

転送テキストのエンコーディング値を返します。
サポートされるエンコーディングリストは LazUtf8.ConvertEncoding 関数で使用されるエンコーディングと同様です。

3.6. 文字ライブラリ

このライブラリには、文字が特定の Unicode カテゴリに属するかどうかをチェックする関数と、文字のカテゴリを取得する関数が含まれています。

このライブラリで利用可能な関数の一覧です:

文字ライブラリ
関数名説明

iResult = Char.GetUnicodeCategory(Character)

文字 Character の Unicode カテゴリを返し、以下のいずれかの値になります:

説明
  文字:
0大文字 (Lu)
1小文字 (Ll)
2タイトルケース文字 (Lt)
3修飾文字 (Lm)
4その他の文字 (Lo)
  記号:
5非結合記号 (Mn)
6結合記号 (Mc)
7囲み記号 (Me)
  数字:
810進数字 (Nd)
9文字数字 (Nl)
10その他の数字 (No)
  句読点:
11接続句読点 (Pc)
12ダッシュ句読点 (Pd)
13開始括弧 (Ps)
14終了括弧 (Pe)
15初期句読点 (Pi)
16最終句読点 (Pf)
17その他の句読点 (Po)
  記号:
18数学記号 (Sm)
19通貨記号 (Sc)
20修飾子記号 (Sk)
21その他の記号 (So)
  区切り文字:
22空白区切り (Zs)
23行区切り (Zl)
24段落区切り (Zp)
  その他:
25制御 (Cc)
26書式 (Cf)
27サロゲート (Cs)
28プライベート (Co)
29未割り当て (Cn)

bResult = Char.IsDigit(Character)

Character 文字が Nd カテゴリに属する場合、true を返します。

bResult = Char.IsLetter(Character)

Character 文字が LuLlLtLm、または Lo カテゴリに属する場合、true を返します。

bResult = Char.IsLetterOrDigit(Character)

Character 文字が LuLlLtLmLoNd、または Nl カテゴリに属する場合、true を返します。

bResult = Char.IsLower(Character)

Character 文字が Ll カテゴリに属する場合、true を返します。

bResult = Char.IsUpper(Character)

Character 文字が Lu カテゴリに属する場合、true を返します。

さらに、これらの関数は2つの引数を使用することもできます:単一の文字ではなく、文字列とその文字列内の文字の位置を指定できます。

3.7. オペレーティングシステムライブラリ

このライブラリには、Double Commander が実行されているオペレーティングシステムに関連する関数が含まれています。

このライブラリで利用可能な関数の一覧です:

オペレーティングシステムライブラリ
関数名説明

iResultCode = os.execute(sCommand)

sCommand をコマンドラインに入力した場合と同様に実行し、操作の結果コードを返します。

sCommand は以下のようになります:

  • ターミナルコマンド、例:os.execute("dir > all.txt")
  • 実行可能ファイル、例:os.execute("C:\\Windows\\System32\\calc.exe")
  • 引数付きの実行可能ファイル:
    os.execute("C:\\Utils\\fsum.exe -md5 test.bin > md5.txt")

sTempFileName = os.tmpname()

一時ファイル名として使用されるファイル名(システムの一時ファイルディレクトリ内)を返します。
関数が一意の名前を作成できない場合、空文字列を返します。

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

sFileName という名前のファイルまたはディレクトリを削除します。

成功した場合、関数は true を返します。

失敗した場合、関数は以下の3つを返します:

  1. nil は失敗を示します
  2. sError はエラーメッセージの説明です
  3. iError はエラーコード番号です

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

sOldName という名前のファイルを新しい名前 sNewName に変更します。

注意:sNewName という名前のファイルが既に存在する場合、それは置き換えられます!

成功した場合、関数は true を返します。

失敗した場合、関数は以下の3つを返します:

  1. nil は失敗を示します
  2. sError はエラーメッセージの説明です
  3. iError はエラーコード番号です

Value = os.getenv(VariableName)

引数で渡された変数 VariableNameValue を返します。
その名前の変数が存在しない場合、nil を返します。

os.setenv(VariableName, Value)

VariableName 環境変数を追加または変更します。エラーが発生した場合、関数は -1 を返します。

os.unsetenv(VariableName)

VariableName 環境変数を削除します。エラーが発生した場合、関数は -1 を返します。

4. インデックス

DC ライブラリ

DC.CurrentPanel
DC.ExecuteCommand
DC.LogWrite


システムライブラリ

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


クリップボードライブラリ

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


ダイアログライブラリ

Dialogs.InputListBox
Dialogs.InputQuery
Dialogs.MessageBox


UTF-8 ライブラリ

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


文字ライブラリ

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


オペレーティングシステムライブラリ

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


Valid HTML 4.0 Transitional CSS Valid!