正規表現を使用したマクロの設定依存性へNo.09835
fzok4234 さん 22/04/19 09:04
 
おはようございます。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 が何であるかを取得できない以上、HmJ
reSelect.dll を使用しているか
   どうかを判別すること自体が不可能となっている。
 ・予め秀丸エディタと同じディレクトリに  HmJreSelect.dll 本体と .HmJreSelec
t 設定ファイルをインストールして
   おかなければならない。当然、秀丸エディタのインストールディレクトリを操作
するため管理者権限が必要に
   なってしまう。このため、職場のマシンなどではマクロユーザーが対処できない
可能性が高い。
という問題があります。


このような実情から、要望としてマクロ上で正規表現 DLL の情報取得 / 切り替えを
行うための新しいマクロ関数の
用意をご検討いただければ幸いです。どうかよろしくお願いします。

以下、思いついた関数の実装の具体例を列挙しておきます。

regulardllpath キーワード :
 説明  : 現在のマクロ実行コンテキストに適用されている正規表現 DLL を取得する。
 書式  : $dllPath = regulardllpath ;
           戻り値          : 正規表現 DLL のフルパス。setregulardll 文など
で適用したものが取得できる。

defaultregulardllpath キーワード :
 説明  : 「動作環境」で指定 / 列挙されている正規表現 DLL を取得する。
 書式  : $dllPath = defaultregulardllpath[ #index ] ;
           戻り値          : 正規表現 DLL のファイル名またはフルパス。setre
gulardll 文などの実行に
                             かかわらず常に「動作環境」で指定 / 列挙されて
いるものを返す。角括弧囲みの
                             #index を省略したときは「動作環境」で指定され
ているデフォルトの正規表現 DLL の
                             フルパスを返す。#index で「動作環境」で列挙さ
れたものの番号を指定すると
                             そのファイル名のみを返す。
           #index          : 「動作環境」の「正規表現の DLL 」ダイアログで
利用可能な候補として列挙されている
                             インストール済みの正規表現 DLL を、0 ベースの
インデックス番号で指定する。
                             列挙されている個数以上の数値を指定すると、戻り
値は長さ 0 の空文字列となる。

regulardllstatus キーワード :
 説明  : 現在のマクロ実行コンテキストでの正規表現 DLL の状態を取得する。
 書式  : #status = regulardllstatus ;
           戻り値          : 以下の値のビット論理和となる。
                               #mode 関係  : setregulardll 文や setdefaultr
egulardll 文での #mode の状態。
                                 0x00000000  : #mode == 0 のとき。または se
tregulardll 文などは未実行。
                                 0x00000001  : #mode == 1 のとき。
                                 0x00000002  : #mode == 2 のとき。
                               実行状態    : setregulardll 文や setdefaultr
egulardll 文を実行しているかどうか。
                                 0x00000000  : setregulardll 文も setdefaul
tregulardll 文も未実行。または
                                               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 ;




[ ]
RE:09835 正規表現を使用したマクロの設定No.09839
秀丸担当 さん 22/04/19 13:20
 
正規表現DLLは、現状では確かにレジストリから取得できますが、32bit版と64bit版
で違うということもあるので、キーワードで取得できたらいいと思います。
そういうキーワードの追加を検討します。
マクロ内で動的に変えるというのは、不可能ではないと思いますが、そこまでは想定
しづらいところです。
外の人に公開するようなマクロの場合、今はDLLを知るにはレジストリですが、キー
ワードで取得できるようになったら取得して、想定と違うDLLの場合は変更を促すと
いうようにしたらいい気がします。

[ ]
RE:09839 正規表現を使用したマクロの設定No.09843
fzok4234 さん 22/04/19 14:23
 
お忙しい中、回答ありがとうございます。


> 正規表現DLLは、現状では確かにレジストリから取得できますが、32bit版と64bit
>版で違うということも
> あるので、キーワードで取得できたらいいと思います。
> そういうキーワードの追加を検討します。

新関数のご検討ありがとうございます。


> マクロ内で動的に変えるというのは、不可能ではないと思いますが、そこまでは想
>定しづらいところです。
> 外の人に公開するようなマクロの場合、今はDLLを知るにはレジストリですが、
>キーワードで取得できるように
> なったら取得して、想定と違うDLLの場合は変更を促すというようにしたらいい気
>がします。

おっしゃる通りですと、例えば職場のマシンにシステム管理者がインストールした秀
丸エディタをマクロユーザーが
使用する場合、秀丸エディタのインストールディレクトリに管理者権限がないために
マクロに対応した正規表現 DLL を
インストールできず、その結果このマクロが使用できない状態になる恐れがあります。

現状ですと、マクロのファイルは「動作環境」->「環境」の「マクロファイル用のフ
ォルダ」欄に設定した
ディレクトリを初め、ユーザーが書き込みできる任意のディレクトリにインストール
して使用することが
できます。そもそも、「マクロファイル用のフォルダ」欄自体がユーザーごとの設定
となっているため、管理者権限が
無くても自由に変更可能です。

ところが一方、正規表現 DLL のファイルの方は現状では必ず秀丸エディタのインス
トールディレクトリに
インストールしないといけません。このため、もしこのディレクトリの書き込みに管
理者権限が必要な場合、正規表現 DLL の
インストール操作にも管理者権限が必要になってしまいます。

その結果、マクロ本体はユーザー権限でインストールできるが、対応する正規表現 D
LL は管理者権限でインストールしないと
いけない、というちぐはぐな状態が現出してしまいます。このとき、マクロ本体はイ
ンストールできても正規表現 DLL が
インストールできないために、マクロユーザーはこのマクロの使用を断念しないとい
けなくなります。

この問題を解決するためには、正規表現 DLL の切り替えを
 ・マクロの実行中いつでも切り替え可能。
 ・任意のパスの正規表現 DLL を選択可能。
として行えるようにするための新しいマクロ関数が絶対に必要となってきます。

このような背景から、先ほど 7 つの新関数を提案させていただいた次第であります。



[ ]
RE:09843 正規表現を使用したマクロの設定No.09847
秀丸担当 さん 22/04/19 18:17
 
正規表現DLLは、強調表示などの設定とも密接に関係するので、一般的にはHmJreのま
まで、変更する場合は十分な理解が必要です。
正規表現の方言が全然異なるかもしれないという前提で考えると、管理者で書き換え
できないユーザーは断念するのは、どちらかというと、そのほうが妥当なのではない
かと思います。
やり方が無いわけではないですが、Program Filesでない場所にインストール(また
はインストーラEXEを展開)したり、持ち出しキットであれば一応可能ではあります。
あと、想定はしていなかったですが、正規表現DLLの指定をフルパスにすると、フル
パスで読み込めました。(ただHmJreSelect.dllの場合はHmJre.dllやhmonig.dllも一
緒の場所にないとおかしなことになります)
レジストリを書き換えてenvchangedとするのも一応できてしまいましたが、相当マニ
アックで、推奨はし難いところです。
やはり使ってもらう人に十分に理解してもらって、任意に変更してもらうのがいいの
ではないかと思います。

[ ]
RE:09847 正規表現を使用したマクロの設定No.09848
fzok4234 さん 22/04/20 10:43
 
> 正規表現DLLは、強調表示などの設定とも密接に関係するので、一般的にはHmJreの
>ままで、変更する場合は
> 十分な理解が必要です。

> レジストリを書き換えてenvchangedとするのも一応できてしまいましたが、相当マ
>ニアックで、推奨は
> し難いところです。

確かに、「動作環境」->「環境」ページ ->「DLL の変更」ボタンで設定する正規表
現 DLL の選択を変更すると、
影響範囲が非常に大きいため、正規表現の方言が異なると秀丸エディタ全体の動作が
おかしくなってしまいます。

したがって、この「動作環境」での設定は秀丸エディタ全体の動作を定義する「マス
ター設定」として原則的に
むやみに手を加えるべきではありません。当然、レジストリ直接編集も含めてマクロ
上からもこの「マスター設定」を
変更すべきではありません。

よって、この「マスター設定」自体を書き換えるようなマクロ関数の新設は当方では
一切要望していません。

しかし、これだとマクロ上の searchdown 文などの動作までこの「マスター設定」に
支配されてしまい、マクロに
環境依存性が生じる原因となってしまいます。

そこで、当方が要望したのはあくまでこの「マスター設定」を変更しないままで、マ
クロの実行中に「マスター設定」とは
異なる好みの正規表現 DLL を「一時的」に使用するためのマクロ関数の新設となり
ます。マクロの実行中に、原則的に
そのマクロの中だけで通用する「一時的」な正規表現 DLL 指定を可能にするものです。


> 正規表現の方言が全然異なるかもしれないという前提で考えると、管理者で書き換
>えできないユーザーは
> 断念するのは、どちらかというと、そのほうが妥当なのではないかと思います。

> やはり使ってもらう人に十分に理解してもらって、任意に変更してもらうのがいい
>のではないかと思います。

「マスター設定」に一切手を加えず、マクロ内で任意の正規表現 DLL を「一時的」
に使用可能にする関数が有れば、
わざわざ管理者権限の元で正規表現 DLL を秀丸エディタのインストールディレクト
リに置く作業などは不要に
なるはずです。

マクロを公開する側で、そのマクロが依存する正規表現 DLL を、
 「マスター設定」
     ↓
 hidemarudir
     ↓
 currentmacrodirectory
     ↓
 macrodir
     ↓
 settingdir
     ↓
 directory
と順番に検索して、最初の「マスター設定」で見つかればそのまま何もせずに、hide
marudir 以下で見つかれば
「一時的」に適用する関数を使い、最後まで見つからなければエラーメッセージでマ
クロユーザーにお願いする、
という流れをマクロに組み込むことも可能です。この場合、管理者権限を持たないマ
クロユーザーは、
 ・currentmacrodirectory 。
 ・macrodir 。
 ・settingdir 。
 ・directory 。
というような、ユーザーに書き込み権限のあるディレクトリにその正規表現 DLL を
置くことになります。


まとめると、正規表現 DLL の選択において「マスター設定」に一切干渉しない独立
した「一時的適用」の機能の
新設こそ当方が要望するところの要であります。どうかこのことをよく理解してもら
えればとお願いするところで
あります。




[ ]
RE:09848 正規表現を使用したマクロの設定No.09850
fzok4234 さん 22/04/20 11:51
 
-PS-

この「一時的適用」の機能は、マクロ上だけではなく通常の GUI 操作における検索
/ 置換 / GREP ダイアログにも
有った方がよいと思いますがどうでしょうか。

つまり、「マスター設定」とは別の正規表現 DLL を「一時的」に使うための DLL フ
ァイルパスの入力欄を
各ダイアログに設置するということです。



[ ]
RE:09850 正規表現を使用したマクロの設定No.09851
秀丸担当 さん 22/04/20 16:26
 
言われていることは理解できます。
マクロ内だけにすると、影響が及ぶところを全部リフレッシュして終わったらリフレ
ッシュし直す必要があるのか、あるいは実行中混在するのか、それともそのプロセス
だけでは有効(あるいは混在)でありつづけるのかなど、いろいろ考える必要があって、
複雑でリスクがあることになると思います。
HmJreSelect.dllでは、けっこう合理的にその問題は解決できていて、既にそうやっ
て使われていて、できているのではないかと思います。
正規表現DLLの指定は、フルパスでやってみてできたのはたまたまですが、これは仕
様ということにしてもいいかもしれません。
あと、HmJreSelect.dllは、同じフォルダに別DLLが無ければ、本体EXEのある場所のD
LL(HmJre.dll)をデフォルトにできたらよさそうです。
.HmJreSelectファイル内のDLLファイル名の記述もフルパス指定できたらいいです。

[ ]
RE:09851 正規表現を使用したマクロの設定No.09852
fzok4234 さん 22/04/20 18:45
 
> マクロ内だけにすると、影響が及ぶところを全部リフレッシュして終わったらリフ
>レッシュし直す必要があるのか、
> あるいは実行中混在するのか、それともそのプロセスだけでは有効(あるいは混在)
>でありつづけるのかなど、
> いろいろ考える必要があって、複雑でリスクがあることになると思います。

おそらく、現状では同時に実行可能な正規表現 DLL のインスタンスの数は、1 個の
秀丸エディタのプロセスににつき
1 個しかない状態だと思われます。つまり、現状ではこの 1 個だけのインスタンス
の枠を「動作環境」で指定した
「マスター設定」の正規表現 DLL のインスタンスが占領している状態となっていて、
マクロ内だけの「一時的適用」の
正規表現 DLL のインスタンスが入る余地がないということだと思います。

そこでもし、

> 影響が及ぶところを全部リフレッシュして終わったらリフレッシュし直す必要があ
>るのか、

というように、この 1 個の枠を「マスター設定」と「一時的適用」の 2 つのインス
タンスで共有して切り替えながら
使うとなると、おっしゃる通りかなり複雑な処理になって大きなバグの原因になりか
ねません。

だとすれば、

> あるいは実行中混在するのか、

とおっしゃるように、正規表現 DLL のインスタンスの枠の個数自体を
 1.  マスター設定
 2.  マクロ内の一時的適用
の 2 個に、あるいはこれに
 3.  検索 / 置換 / GREP の GUI ダイアログの一時的設定
を加えた 3 個に増やして複数のインスタンスが互いに干渉しないようにして同居す
ることを可能にするのが、より安全な
策であると思われます。

いずれにせよ、この件の改良は大掛かりになるみたいなので気長に待つことと致しま
す。


> 正規表現DLLの指定は、フルパスでやってみてできたのはたまたまですが、これは
>仕様ということにしてもいいかも
> しれません。

対応策のご検討ありがとうございます。

DLL ファイルをフルパス指定できるということは、正規表現 DLL を管理者権限が不
要な任意のディレクトリに置ける
ことを意味するため、制限ユーザーが好みの正規表現 DLL を導入しやすくなるため
大きな進歩といえます。

一応、指定したパスの DLL ファイルが使えなかったり存在しない場合は、自動で秀
丸エディタのインストールディレクトリの
HmJre.dll をデフォルトとして使用する安全策を講じたらよいでしょう。


> HmJreSelect.dllでは、けっこう合理的にその問題は解決できていて、既にそうや
>って使われていて、
> できているのではないかと思います。
> あと、HmJreSelect.dllは、同じフォルダに別DLLが無ければ、本体EXEのある場所
>のDLL(HmJre.dll)を
> デフォルトにできたらよさそうです。
> .HmJreSelectファイル内のDLLファイル名の記述もフルパス指定できたらいいです。

こちらの方も、改良のご検討ありがとうございます。

HmJreSelect.dll を、上記の DLL ファイルフルパス指定の仕様を使ってユーザーご
とのディレクトリに置いて、さらに
この HmJreSelect.dll から任意の正規表現 DLL にリダイレクトできれば、マクロ内
はもちろん通常の検索 / 置換 / GREP
ダイアログでも相当融通が利くようになるはずです。

自作マクロを他人に公開する場合も、ユーザーにまず HmJreSelect.dll を「動作環
境」->「環境」ページ ->「DLL の変更」ボタンで
登録してもらった上で、hmonig.dll などマクロが依存する正規表現 DLL を任意のデ
ィレクトリに置いてもらう、といった
初期設定のアナウンスも問題なく行えるようになります。



[ ]
RE:09852 正規表現を使用したマクロの設定No.09859
秀丸担当 さん 22/04/22 10:53
 
秀丸エディタでの正規表現DLLの指定は、V9.15β4で多少修正して仕様ということに
していますが、フルパスのDLLを読み込む表面的な振る舞いとしては以前からできて
いる通りです。

HmJreSelect.dllはV0.20として、別の場所にあってもできる対応をしてライブラリに
登録しました。
https://hide.maruo.co.jp/lib/macro/hmjreselect020.html

[ ]
RE:09859 正規表現を使用したマクロの設定No.09860
fzok4234 さん 22/04/22 15:30
 
素早い対応ありがとうございます。

「動作環境」のフルパス指定、regulardll キーワード、.HmJreSelect ファイルの
フルパス指定のいずれも動作確認できました。


[ ]