[ 新規に投稿する ]

正規表現を使用したマクロの設定依存性への対処機能の要望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 が何であるかを取得できない以上、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 ;



[ ]
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 の
インストール操作にも管理者権限が必要になってしまいます。

その結果、マクロ本体はユーザー権限でインストールできるが、対応する正規表現 DLL は管理者権限でインストールしないと
いけない、というちぐはぐな状態が現出してしまいます。このとき、マクロ本体はインストールできても正規表現 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
と順番に検索して、最初の「マスター設定」で見つかればそのまま何もせずに、hidemarudir 以下で見つかれば
「一時的」に適用する関数を使い、最後まで見つからなければエラーメッセージでマクロユーザーにお願いする、
という流れをマクロに組み込むことも可能です。この場合、管理者権限を持たないマクロユーザーは、
 ・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のある場所のDLL(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 ファイルの
フルパス指定のいずれも動作確認できました。

[ ]

[ 新規に投稿する ]