|
マクロからのdllfunc呼び出し(Ver3.54対応版)
HmJre.dllには、秀丸マクロからloaddllしてdllfuncで呼び出せる関数があります。
- Fuzzy_OptionDialog関数
-
この関数は、あいまい検索の設定ダイアログボックスを表示します。
- パラメータ1(数値型):
-
ダイアログボックスの親となるウィンドウのハンドルを指定します。普通はhidemaruhandle(0)を指定してください。
- 返り値:
-
OKボタンを押して設定を完了した場合は1、キャンセルボタンを押した場合は0を返します。
- JreGetVersion関数
-
この関数はHmJre.dllのバージョン番号を返します。dllfunc関数で呼び出し可能です。パラメータはありません。
- 返り値:
-
返り値は、下位の2バイトのみが有効で、上位ワードにはでたらめな値が入ってしまいます。以下のようにしてバージョン番号を取得してください。
メジャーバージョン番号 = (dllfunc("JreGetVersion") & 0xFF00) / 256;
マイナーバージョン番号 = (dllfunc("JreGetVersion") & 0xF0) / 16 * 10 + (dllfunc("JreGetVersion") & 0xF);
- FindRegular, FindRegularNoCaseSense関数(V1.50以降から)
-
FindRegular関数は、特定の文字列から特定の正規表現パターンのマッチングをして、ヒットした場合はその位置を返します。
第1パラメータ(文字列型): | 検索したい正規表現文字列を指定します。 |
第2パラメータ(文字列型): | 検索対象の文字列を指定します。 |
第3パラメータ(数値型): | 検索を開始する桁位置を指定します。先頭から検索したい場合は0を指定します。 |
返り値(数値型): | ヒットした場合は検索対象文字列先頭からの桁位置(0以上の値)を返します。ヒットしなかった場合は-1を返します。正規表現の解釈その他でエラーが起きた場合は-2を返します。 |
FindRegularNoCaseSense関数は、大文字/小文字を区別しないで検索する以外は、FindRegular関数とまったく同じです。
例 |
#n = dllfunc( "FindRegular", "pattern", "target-string", 0 );
if( #n >= 0 ) {
message "ヒットしました。";
}
|
- FindGeneral関数(V1.97以降から)
-
FindGeneral関数は、「大文字/小文字の区別」、「正規表現」、「あいまい検索」の3つをそれぞれについてON/OFFをパラメータで指定して検索を実行します。
第1パラメータ(数値型): | 大文字/小文字の区別を指定します。1なら区別あり、0なら無しです。 |
第2パラメータ(数値型): | 正規表現のON/OFFを指定します。1なら正規表現あり、0なら普通の文字列検索です。 |
第3パラメータ(数値型): | あいまい検索のON/OFFを指定します。1ならあいまい検索、0なら無しです。 |
第4パラメータ(文字列型): | 検索したい文字列を指定します。 |
第5パラメータ(文字列型): | 検索対象の文字列を指定します。 |
第6パラメータ(数値型): | 検索を開始する桁位置を指定します。先頭から検索したい場合は0を指定します。 |
返り値(数値型): | ヒットした場合は検索対象文字列先頭からの桁位置(0以上の値)を返します。ヒットしなかった場合は-1を返します。正規表現の解釈その他でエラーが起きた場合は-2を返します。 |
例 |
#n = dllfunc( "FindGeneral", 0,0,1, "b", "abc", 0 );
if( #n >= 0 ) {
message "ヒットしました。";
}
|
- GetLastMatchLength関数(V1.50以降から)
-
FindRegularまたはFindRegularNoCaseSense関数で0以上の値が返った場合に、マッチした文字列の長さを返します。返り値は数値型で、パラメータはありません。
- GetLastMatchTagPosition, GetLastMatchTagLength関数(V1.90以降から)
-
GetLastMatchTagPosition関数は、FindRegularまたはFindRegularNoCase関数で指定した検索パターンにタグ付き正規表現が含まれている場合に、そのタグの位置を返します。パラメータには、タグ文字の番号である1〜9が指定出来ます。返される位置は、検索文字列の先頭からの位置であって、ヒットした位置からの相対位置ではありません。
GetLastMatchTagLength関数は、タグの長さを返します。パラメータには1〜9の番号が指定出来ます。
- EnvChanged関数(V1.71以降から)
-
EnvChanged関数は、あいまい検索関係の設定をレジストリから読み込み直しします。マクロからあいまい検索の設定をいじりたい場合には、まずはHmJre.dll用のレジストリを適当に書き換えてからこの関数を呼んでください。
例 |
#n = dllfunc("EnvChanged");
|
- ReplaceRegular, ReplaceRegularNoCaseSense関数(V1.98以降から)
-
ReplaceRegular関数は、特定の文字列から特定の正規表現パターンのマッチングをして、ヒットした場合はパラメータに従った置換を実行し、その置換した結果の文字列を返します。
ヒットしなかった場合や正規表現のコンパイルエラーの場合は""を返します。
第1パラメータ(文字列型): | 検索したい正規表現文字列を指定します。 |
第2パラメータ(文字列型): | 検索対象の文字列を指定します。 |
第3パラメータ(数値型): | 検索を開始する桁位置を指定します。先頭から検索したい場合は0を指定します。 |
第4パラメータ(文字列型): | 検索でヒットした文字列を置換する用の文字列を指定します。秀丸エディタの置換と同様に\0〜\9のタグ付き正規表現も指定出来ます。 |
第5パラメータ(数値型): | 0を指定すると、最初にヒットした文字列だけを置換します。
1を指定すると、ヒットする文字列すべてを置換します。
2を指定すると、1を指定したのと同じく全置換しますが、もしも何も置換出来なかった場合にはパラメータ2で指定された文字列をそのまま返す動作となります。 |
返り値(文字列型): | 検索がうまくヒットした場合は置換が実行され、その結果の文字列が返ります。ヒットしなかった場合は、もしも第5パラメータに数値の2が指定されたのでなければ""が返ります。
第5パラメータに数値の2が指定されてる場合で何もヒットしなかった場合(置換が実行されなかった場合)にはパラメータ2の文字列がそのまま返ります。 |
ReplaceRegularNoCaseSense関数は、大文字/小文字を区別しないで検索する以外は、ReplaceRegular関数とまったく同じです。
注意:ReplaceRegular/ReplaceRegularNoCaseSense関数の第5パラメータに数値の2を指定出来るようになったのは、HmJre.dllのV3.39以降からになります。V3.38以下の場合は数値の2を指定しても1が指定されたのと同じ扱いになってしまいます。その辺ご注意ください。 もしも一般ユーザー様向けにマクロを配布しないといけない場合はHmJre.dllのバージョンをチェックする処理を入れるか、またはパラメータ5には数値の2を入れない使い方をお願いします。
例 |
$s = dllfuncstr( "ReplaceRegular", "([a-z]+)([0-9]+)", "--abcdefg1234567--", 0, "\\2\\1" );
message $s;
|
- ユニコード文字を扱う時の注意、および、SetUnicodeIndexAutoConvert関数
-
FindRegular/ReplaceRegular等の関数にユニコード文字を含む文字列を渡す場合、普通だと、ユニコード文字1文字が4バイトのデータとして渡される形となります。その結果、例えば返り値の値が、通常の文字インデックスの値とずれることになります。
このずれを解消する方法は以下の2種類があります。
- 秀丸エディタのV8.00以降から追加されている、byteindex_to_charindexおよびcharindex_to_byteindex関数を使う方法。
- HmJre.dllのV3.13から追加された、SetUnicodeIndexAutoConvert関数で、HmJre.dll側での文字コードインデックス自動変換をONにする方法。
前者の方法については、具体的には、
- HmJre.dll側に渡す桁位置はcharindex_to_byteindex関数で変換した値を渡す。
- HmJre.dll側から返される桁位置/文字列長さはbyteindex_to_charindex関数で変換する。
のようにすれば大丈夫です。
例 |
loaddll "hmjre.dll";
#xTarget = 1; //1桁目から検索の場合
$target = "\u00C0\u00C1\u00C2";
#x = dllfunc( "FindRegular", "\u00C1", $target, charindex_to_byteindex( $target, #xTarget ) );
#len = dllfunc( "GetLastMatchLength");
message "変換前: x= " + str(#x) + " len=" + str(#len);
#x = byteindex_to_charindex( $target, #x );
#len = byteindex_to_charindex( midstr( $target, #x, 99999 ), #len );
message "変換後: x= " + str(#x) + " len=" + str(#len);
endmacro;
|
後者の方法については、FindRegular等の関数呼び出しをする前に、SetUnicodeIndexAutoConvert関数を、数値のパラメータとして「1」を指定して呼び出せばいいです。ちなみに数値の「0」を指定して呼び出すと、元(変換しない)に戻ります。
注意:この関数を使って自動変換させる方法は、秀丸エディタのV8.00β45以上、および秀丸メールのV5.34β9以上でないとうまく機能しません。また、秀丸エディタ/秀丸メールから直接loaddll文(またはloaddll関数)でロードした場合でないとダメです。
例 |
loaddll "hmjre.dll";
#n = dllfunc("SetUnicodeIndexAutoConvert", 0);
$target = "\u00C0\u00C1\u00C2";
#x = dllfunc( "FindRegular", "\u00C1", $target, 0 );
#len = dllfunc( "GetLastMatchLength");
message "変換OFF: x= " + str(#x) + " len=" + str(#len);
#n = dllfunc("SetUnicodeIndexAutoConvert", 1);
$target = "\u00C0\u00C1\u00C2";
#x = dllfunc( "FindRegular", "\u00C1", $target, 0 );
#len = dllfunc( "GetLastMatchLength");
message "変換ON: x= " + str(#x) + " len=" + str(#len);
endmacro;
|
- 改行を含む文字列の扱いについて
-
HmJre.dllの関数に渡す検索対象文字列に改行コードを含める場合で、改行コードに関係した正規表現パターンで検索する場合、文字列に含まれる改行コードは「\n」、つまり、16進数の文字コードで0x0Aの1バイトだけである必要があります。
例えば秀丸マクロのgettext関数で改行コードを含む文字列を変数に取り込んだ場合、改行コードは「\r\n」の2バイトのデータとなります。なので、これをこのままFindRegular等の関数に渡しても、例えば「\n」や「$」にうまくヒットしません。
「\r\n」となってしまった改行コード「\n」に変換するには、ReplaceRegular関数を使うのがお勧めです。
例 |
$s = gettext( seltopx, seltopy, selendx, selendy );
loaddll "hmjre.dll";
$s = dllfuncstr("ReplaceRegular", "\r\n", $s, 0, "\n", 2 );
|
このように変換すれば、正規表現パターンの中の「\n」や「$」が正しくヒットします。
- 改行を含む文字列+「^」の場合
-
HmJre.dllの正規表現パターンでの「^」は行頭にヒットする正規表現パターンとなっています。しかし、実はHmJre.dllの中では行頭にはヒットせず、検索対象文字列の先頭にのみヒットする動作となります。
例えば「123\nabc」の文字列をFindRegular関数に渡して、「^abc」で検索しても、「abc」の部分にはヒットしません。
これはすみませんがこういう仕様ということで使っていただくしかありません。
改行コードも正しく認識して「行頭」にヒットさせるには、「^」の代わりに、例えば
(?<=^|\n)
のような正規表現パターンを使う必要があります。例えば「^abc」相当にするには「(?<=^|\n)abc」のように記述する必要があります。
|