|
でるもんた・いいじまです。
> となると、秀丸エディタ本体が元々持っている環境設定ロジックを
> 操作するマクロ構文を新設することが
> やはり理想なのでは、と思ってしまいます。
これは同意です。
> しかし、いざマクロ構文の実装となると、それはそれで大掛かりな改修と
> なりそうです。というのは、今回当方で挙げた
> A. 登録されている「設定のリスト」の名前の列挙。
> B. 特定の「設定のリスト」に対応する「ファイルタイプ」の名前の列挙。
> および、でるもんたいいじまさんが挙げた
> C. レジストリキー内のサブキー名の列挙。
> と、さらに上記に歩調を合わせる形で
> D. レジストリキー内の値の「名前」と「型」の列挙。
> はいずれも同じ型の複数の値からなるオブジェクト、
> すなわち「コレクション」の列挙であり、
んー、コレクションの概念を持ち出して一般化するまでのことでもないのでは。
もしかしたらfzok4234さんは、何も知らない状況からいきなりC#・Python・PHPあた
りでプログラマとしてのキャリアをスタートされたのでしょうか。
でも秀丸のマクロはもっと原始的ですから(なにせPerl4.036が「配列のサイズや文
字列の長さを気にしなくていい画期的な言語」という位置づけだった時代の設計をず
っと引きずっています)、シンプルにこんな感じにできそうです。
- - - - キリトリセン - - - -
openreg "CURRENTUSER", @"Software\Hidemaruo\Hidemaru";
call Exit_if_OpenReg_Failed, "秀丸のレジストリトップ";
// var $Ext[];
#nExt = 0;
while (1)
{
$key = getregsubkey();
if ( !result ) break;
if ( leftstr($key,1) != "." )
continue;
$Ext[#nExt] = $key;
#nExt = #nExt+1;
}
closereg;
#nAssoc = 0;
// var $Assoc[];
while ( #nAssoc < #nExt )
{
openreg "CURRENTUSER", @"Software\Hidemaruo\Hidemaru\" + $Ext[#i];
call Exit_if_OpenReg_Failed, sprintf("拡張子 '%s' のエントリ", $Ext[#i]);
$Assoc[#nAssoc] = getregstr("");
closereg;
#nAssoc = #nAssoc+1;
}
openreg "CURRENTUSER", @"Software\Hidemaruo\Hidemaru\Config";
call Exit_if_OpenReg_Failed "タイプ別設定のフォルダ";
#nTypes = 0;
// var $Types[];
while (1)
{
$key = getregsubkey();
if ( !result ) break;
$Types[#nTypes] = $key;
#nTypes = #nTypes+1;
}
closereg;
message str(#nExt) + " 個の拡張子がレジストリに登録されています。\n\n" +
"「共通」タイプの他に、" + str(#nTypes) + "個の設定が存在します。\n" +
"ただし、そのすべてが何かしらの拡張子から参照されているとは限りません。";
endmacro;
// エラー処理はここにまとめる
Exit_if_OpenReg_Failed:
if ( result==true )
return;
message sprintf(
"レジストリのオープンに失敗しました。\n" +
失敗箇所:%s", $$1);
endmacro;
- - - - キリトリセン - - - -
これは単純に、readregsubkey() という関数をマクロに追加していただくだけで実現
可能です。
あるいは、この構文は容易に getregsubkey(n1) の形に拡張できます。n1を省略した
場合には「前回アクセスした番号の次の数字」の意味になる、としておけばいいでし
ょう。
☆ ☆ ☆
ちなみに、実際のWin32ネイティブAPIでも、サブキーの列挙は「まとめて一つのベク
トルとして受け取る」ではなく「一つずつ順番に受け取る」になっています。
こちら
https://s-kita.hatenablog.com/entry/20120401/1333290793
によると、Win32APIの RegEnumKeyEx() の宣言文はこのようになっています。
LONG RegEnumKeyEx(
HKEY hKey, // 列挙するべきキーのハンドル
DWORD dwIndex, // サブキーのインデックス番号
LPTSTR lpName, // サブキー名が格納されるバッファ
LPDWORD lpcName, // サブキー名バッファのサイズ
LPDWORD lpReserved, // 予約済み
LPTSTR lpClass, // クラス名が格納されるバッファ
LPDWORD lpcClass, // クラス文字列バッファのサイズ
PFILETIME lpftLastWriteTime // 最終書き込み時刻
)
上記
サイトのサンプルでは、dwIndex に 0, 1, 2, ... と順に増やしながら何度もこの呼
んで、ERROR_NO_MORE_ITEMS==259が返ってくるまでループしています。
サンプルコードを読んた限り、単純にキーを列挙したいだけなら lpReserved、lpCla
ss、lpcClass には何も考えずに NULL を渡しておけばいいようです。Microsoftのド
キュメントによると、lpftLastWriteTime もやはりNULLて問題ないそうです。
|
|