|
おはようございます。fzok4234 です。
さて、searchdown 文などの検索 / 置換 / GREP 用の関数で検索文字列を正規表現で指定する際に、
自動生成させる正規表現パターンの内容がどうしても「動作環境」で設定した正規表現 DLL に
依存したものになってしまいます。このため、正規表現を使用したマクロの環境依存性を排除できないため、
近い将来、作成したマクロを「マクロライブラリ」ページなどに公開する際の妨げになることが
想定されます。
具体的には、現状では
1. マクロ内で現在のコンテキストで適用されている正規表現 DLL の名前やフルパスを取得できない。
2. マクロを実行中にそのコンテキストに適用する正規表現 DLL を、「動作環境」で設定したものとは
別のものに適宜切り替えることができない。
となっていて、マクロ内で正規表現 DLL の情報取得 / 切り替えを動的に行えないため、「動作環境」の
設定に依存しないマクロの作成が困難となっています。
上記 1. に関しては、レジストリの
HKEY_CURRENT_USER\Software\Hidemaruo\Hidemaru\Env
キーの
JreDll64
REG_SZ 値を getregstr 関数などで参照することで強引に取得することは一応可能です。しかし、このレジストリの
直接参照には
・将来の秀丸エディタのアップデートによってレジストリの書式が変更される可能性がある。
・ストアアプリ版や持ち出しキット使用時には環境設定の保存方式が異なるためこの方法が使えない。
・そもそもレジストリをエンドユーザーが直接操作すること自体、システムやユーザーアカウントの情報を
破壊する恐れがあるため危険を伴う。このため、職場のマシンなどでは無断でレジストリ操作することは
当然倫理面から問題となる。職場の管理者からレジストリ操作が明示的に禁止されていることもあり得る。
といった問題があるため、最適な方法とは言えません。
また、上記 2. については正規表現 DLL として HmJreSelect.dll を指定することで好みの正規表現 DLL に
リダイレクトすることが可能なため、ある程度は問題の緩和策となります。しかし、この方法にも
・初めから「動作環境」で正規表現 DLL を HmJreSelect.dll に設定しておくことが大前提である。マクロから
現在の実行コンテキストの正規表現 DLL が何であるかを取得できない以上、HmJreSelect.dll を使用しているか
どうかを判別すること自体が不可能となっている。
・予め秀丸エディタと同じディレクトリに HmJreSelect.dll 本体と .HmJreSelect 設定ファイルをインストールして
おかなければならない。当然、秀丸エディタのインストールディレクトリを操作するため管理者権限が必要に
なってしまう。このため、職場のマシンなどではマクロユーザーが対処できない可能性が高い。
という問題があります。
このような実情から、要望としてマクロ上で正規表現 DLL の情報取得 / 切り替えを行うための新しいマクロ関数の
用意をご検討いただければ幸いです。どうかよろしくお願いします。
以下、思いついた関数の実装の具体例を列挙しておきます。
regulardllpath キーワード :
説明 : 現在のマクロ実行コンテキストに適用されている正規表現 DLL を取得する。
書式 : $dllPath = regulardllpath ;
戻り値 : 正規表現 DLL のフルパス。setregulardll 文などで適用したものが取得できる。
defaultregulardllpath キーワード :
説明 : 「動作環境」で指定 / 列挙されている正規表現 DLL を取得する。
書式 : $dllPath = defaultregulardllpath[ #index ] ;
戻り値 : 正規表現 DLL のファイル名またはフルパス。setregulardll 文などの実行に
かかわらず常に「動作環境」で指定 / 列挙されているものを返す。角括弧囲みの
#index を省略したときは「動作環境」で指定されているデフォルトの正規表現 DLL の
フルパスを返す。#index で「動作環境」で列挙されたものの番号を指定すると
そのファイル名のみを返す。
#index : 「動作環境」の「正規表現の DLL 」ダイアログで利用可能な候補として列挙されている
インストール済みの正規表現 DLL を、0 ベースのインデックス番号で指定する。
列挙されている個数以上の数値を指定すると、戻り値は長さ 0 の空文字列となる。
regulardllstatus キーワード :
説明 : 現在のマクロ実行コンテキストでの正規表現 DLL の状態を取得する。
書式 : #status = regulardllstatus ;
戻り値 : 以下の値のビット論理和となる。
#mode 関係 : setregulardll 文や setdefaultregulardll 文での #mode の状態。
0x00000000 : #mode == 0 のとき。または setregulardll 文などは未実行。
0x00000001 : #mode == 1 のとき。
0x00000002 : #mode == 2 のとき。
実行状態 : setregulardll 文や setdefaultregulardll 文を実行しているかどうか。
0x00000000 : setregulardll 文も setdefaultregulardll 文も未実行。または
clearregulardll 文でのクリア後。
0x00000010 : setregulardll 文で任意の正規表現 DLL を使用している。
0x00000020 : setdefaultregulardll 文でデフォルトの正規表現 DLL を明示的に
使用している。
isregulardll 関数 :
説明 : 指定したファイルが正規表現 DLL として使用可能かどうかを判別する。
書式 : #isRegularDll = isregulardll( $dllPath , #checkCodeSign ) ;
戻り値 : 正規表現 DLL として使用可能かどうかの真偽値。
$dllPath : 調べるファイルのパス。ファイル名のみの場合は秀丸エディタのインストールディレクトリ内の
ものとなる。フルパスの場合は任意のディレクトリ内のものとなる。
#checkCodeSign : DLL ファイルのデジタル署名も確認して本物の正規表現 DLL かどうかの判別も行うか
どうかの真偽値。
setregulardll 文 :
説明 : 任意の正規表現 DLL を現在のマクロ実行コンテキストに適用する。実行すると、setregularcache 文で溜められた
正規表現キャッシュはクリアされる。
書式 : setregulardll $dllPath , #mode ;
$dllPath : 新しく適用する正規表現 DLL のパス。ファイル名のみの場合は秀丸エディタの
インストールディレクトリ内のものを使用し、フルパスの場合は任意のディレクトリ内の
ものが使用できる。
#mode : マクロ終了後の振る舞い。
0 : マクロ終了と同時に「動作環境」で指定したデフォルトの正規表現 DLL に戻る。
終了時に setregularcache 文によるキャッシュはクリアされ、また、再実行した
マクロでは regulardllstatus キーワードは 0 に戻る。
1 : マクロ終了後も正規表現 DLL の指定は保持される。同じプロセスで再度実行した
マクロで再利用可能で、setregularcache 文によるキャッシュも保持されたままと
なる。ただし、マクロ終了後の通常の GUI 操作による検索などのダイアログや
強調表示などには一切影響が無い。
2 : マクロ終了後も正規表現 DLL の指定は保持される。同じプロセスで再度実行した
マクロで再利用可能で、setregularcache 文によるキャッシュも保持されたままと
なる。マクロ終了後の同じ秀丸エディタのウィンドウ / タブでの検索などの
ダイアログや強調表示などの通常の GUI 操作にも正規表現 DLL の指定は反映される。
setdefaultregulardll 文 :
説明 : 「動作環境」で指定されたデフォルトの正規表現 DLL を現在のマクロ実行コンテキストに明示的に適用する。
実行すると、setregularcache 文で溜められた正規表現キャッシュはクリアされる。
書式 : setdefaultregulardll #mode ;
#mode : setregulardll 文の #mode と全く同じ。
clearregulardll 文 :
説明 : setregulardll 文や setdefaultregulardll 文で切り替えた正規表現 DLL の指定を全てクリアして、「動作環境」で
指定されたデフォルトの正規表現 DLL に戻す。#mode = 1 or 2 で設定されたマクロ終了後の指定保持も全て
クリアされる。setregularcache 文で溜められた正規表現キャッシュもクリアされる。
書式 : clearregulardll ;
|
|