|
どうも、手風琴です。
(なんだか恐縮です。)
>>手風琴さんの手法の方が正しいアプローチだと思いますが…。
>>私の手に負えない(笑)
>実現したら多分遙かによく動きそうですよね。
>でもどうすればいいのかさっぱり……
>
自分で読み返してみてもちょとわかりにくい文章でしたね。しかも誤字があるし。
改めて説明しますと、Megemoの正規表現は A|B|C|D・・・ みたいに|の連続に
なってますので、これを|のところで切ってAとBとCとDに分解して1個ずつ検索を
かけるという事です。
もちろん切る作業はDLL内で行ないます。
んで、実際の検索処理は下のマクロのような感じで行ないます。
参考になれば幸いです。
##n = dllfunc("MegemoQuery", $$query);
##hittopx = 0x7FFFFFFF;
##hittopy = 0x7FFFFFFF;
##hitendx = 0x7FFFFFFF;
##hitendy = 0x7FFFFFFF;
// カーソル位置からファイル終端までを検索範囲に設定
##x = x;
##y = y;
gofileend;
beginsel;
moveto ##x, ##y;
endsel;
while (1) {
// GetQueryはMegemoQueryで生成した正規表現を8KB以下にカットして返す。
$$regular = dllfunc("GetQuery");
if ($$regular == "") break;
searchdown2, $$regular, regular, inselect;
if (!result) break;
// ヒットした位置が前回のヒットした位置より手前なら、その位置をヒッ
ト位置にする。
if ((seltopx < ##hittopx && seltopy == ##hittopy) || (seltopy < ##
hittopy)) {
##hittopx = seltopx;
##hittopy = seltopy;
##hitendx = selendx;
##hitendy = selendy;
}
// 2回目からはヒット位置までを検索すればよい
moveto ##hittopx, ##hittopy;
beginsel;
moveto ##x, ##y;
endsel;
}
if (##hittopx != 0x7FFFFFFF) {
moveto ##hittopx, ##hittopy;
beginsel;
moveto ##hitendx, ##hitendy;
endsel;
}
|
|