gettextで、検索の動作が変わるNo.01531
h-tom さん 07/10/10 00:19
 

h-tom です。

「gettext」の第五引数の設定を変えると、検索の動作が変わります。

再現の条件としては、正規表現DLLを「BregIf.dll+bregonig.dll」に変える
必要があります。

・BregIf.dll
 http://www.arimac.com/BRegIf/index.html にあるV1.30以上(BRegIf8か9)
 (V1.20(BRegIf7)だと再現しません。)
・bregonig.dll
 http://webs.to/ken/ にあるbregonig.dll Ver.1.42

BregIf.dllとbregonig.dllを秀丸本体と同じ所へ置いて、設定を変更し、
再現用マクロを実行すると、以下のようになり、gettextの範囲選択保持
設定により、結果が異なります。

実行結果その1 ここから---------------------------
0-------------
section1 x:1 foundtopx:1 foundendx:9
section1 x:1 foundtopx:1 foundendx:9
section1 x:1 foundtopx:1 foundendx:9
section1 x:1 foundtopx:1 foundendx:9
1-------------
section1 x:1 foundtopx:1 foundendx:9
section2 x:1 foundtopx:1 foundendx:9
section3 x:1 foundtopx:1 foundendx:9
section4 x:1 foundtopx:1 foundendx:9
実行結果その1 ここまで---------------------------

ちなみに、「検索での表示」を「点滅表示」(setcompatiblemode 0x0100)にすると、
gettextの範囲選択保持による違いは、なくなります。
実行結果その2 ここから---------------------------
0-------------
section1 x:1 foundtopx:1 foundendx:9
section2 x:1 foundtopx:1 foundendx:9
section3 x:1 foundtopx:1 foundendx:9
section4 x:1 foundtopx:1 foundendx:9
1-------------
section1 x:1 foundtopx:1 foundendx:9
section2 x:1 foundtopx:1 foundendx:9
section3 x:1 foundtopx:1 foundendx:9
section4 x:1 foundtopx:1 foundendx:9
実行結果その2 ここまで---------------------------

「BregIf.dll+bregonig.dll」に変えた場合に発生するので、正規表現仕様の
違いが原因だと思いますが、秀丸側の設定をかえると、動作も変わるので、
報告です。

//再現用マクロ ここから
newfile;
insert "[section1]\n";
insert "[section2]\n";
insert "[section3]\n";
insert "[section4]\n";
insert "[section5]\n";
$BAK_SEARCHBUFFER  = searchbuffer;
#BAK_SEARCHOPTION  = searchoption;
//setcompatiblemode 0x0100;
setcompatiblemode 0x0200;
$out = "";
#flg = 0;
#max = 4;
while(#flg < 2){
    gofiletop;
    #cnt = 0;
    $out = $out + str(#flg) + "-------------\n";
    while(#cnt < #max){
        searchdown2 "(?<=^\\[)[^\\]]+(?=\\])", regular;
        ##ret = result;
        if(!##ret) break;
        $get = gettext(foundtopx, foundtopy, foundendx, foundendy,#flg);
        $out = $out + $get + " x:"  + str(x) + " foundtopx:"  + str(foundtop
x) + " foundendx:"  + str(foundendx) + "\n";
        #cnt = #cnt + 1;
    }
    #flg = #flg + 1;
}
message $out;
setsearch $BAK_SEARCHBUFFER, #BAK_SEARCHOPTION;
setreplace $BAK_REPLACEBUFFER;
endmacro;
//再現用マクロ ここまで

[ ]
RE:01531 gettextで、検索の動作が変わるNo.01532
秀丸担当 さん 07/10/10 12:08
 

>「gettext」の第五引数の設定を変えると、検索の動作が変わります。

手順通りにしてみたところ、確認することができました。

hmjre.dllとBregIf.dll+bregonig.dllの違いは、前方一致があるとき検索開始位
置より遡るかどうかの違いがあるようです。
DLLに渡す検索対象が"[section1]"で検索開始位置が"s"の位置の場合、hmjre.
dllは遡らずマッチしません。BregIf.dll+bregonig.dllはマッチします。

普通の連続した検索では、この違いは現れないです。
連続した検索の場合は秀丸エディタがカーソルを右に1つずらすからです。

ただ、escape;などで範囲選択を解除する操作が行われると、連続した検索とし
てみなされているのが解除され、dllの違いが現れます。
gettextで第五パラメタが0の場合も、範囲選択解除で連続した検索が解除される
ため、そのようになっているようです。

[ ]
RE:01532 gettextで、検索の動作が変わるNo.01534
h-tom さん 07/10/10 23:32
 

h-tom です。

>ただ、escape;などで範囲選択を解除する操作が行われると、連続した検索とし
>てみなされているのが解除され、dllの違いが現れます。
>gettextで第五パラメタが0の場合も、範囲選択解除で連続した検索が解除される
>ため、そのようになっているようです。
なるほど、同じ検索の動作に見えても、中では色々やっているんですね。

ついでにネタ向けの話題。
 アウトライン解析の枠に表示されている内容を、テキストファイルに保存したい
 時がたまにあります。

で、上記内容に関連して質問
 マクロでどうにか出来ないかと思い、ちょっと考えてみたのですが、
 「アウトライン解析の枠に表示されている内容」は、見出しの移動を使って取得
 できますが、どのレベルかは、savehilight文で、ツリー定義をはき出させて、
 解析するしかないですよね?

[ ]
RE:01534 gettextで、検索の動作が変わるNo.01535
秀丸担当 さん 07/10/11 10:32
 

>で、上記内容に関連して質問
> マクロでどうにか出来ないかと思い、ちょっと考えてみたのですが、
> 「アウトライン解析の枠に表示されている内容」は、見出しの移動を使って取得
> できますが、どのレベルかは、savehilight文で、ツリー定義をはき出させて、
> 解析するしかないですよね?

ツリー表示に限っては、右クリックして「ツリー操作」の「ツリーそのものをコ
ピー」をすると、クリップボードにコピーすることができます。
見た目上のレベルは、行頭のタブの量で知ることができます。
関数一覧/強調一覧ではできないです。

マクロでこれをやる方法は無いです。
レベルのことまで詳しくやるとなると、ツリー定義を解析するしかないかもしれ
ないですが。

アウトライン解析の枠のウィンドウに対してWM_COMMAND(0x0111)を送ることがで
きれば無理やりできると思いますが、ウィンドウハンドルを知ることができない
ので、やっぱり無理です。
ウィンドウハンドルを知ることができるとしたら、コマンドの番号は7171になり
ますが。
#a=sendmessage( #hwnd, 0x0111,7171,0);

[ ]
RE:01535 gettextで、検索の動作が変わるNo.01536
h-tom さん 07/10/11 23:47
 

h-tom です。

>ツリー表示に限っては、右クリックして「ツリー操作」の「ツリーそのものをコ
>ピー」をすると、クリップボードにコピーすることができます。
>見た目上のレベルは、行頭のタブの量で知ることができます。
こんな機能があったんですね。
タブ−罫線(?)変換マクロを作ったので、これで十分です。

>アウトライン解析の枠のウィンドウに対してWM_COMMAND(0x0111)を送ることがで
>きれば無理やりできると思いますが、ウィンドウハンドルを知ることができない
>ので、やっぱり無理です。
フローティング状態ならマクロから調べられますが、合体している場合は無理ですね。
まぁ、クリップボードにコピーするところまでは、手動でやるって事で。

[ ]