検索の前に escapeNo.03430
安久津 さん 99/05/28 05:05
 
こんにちは秀丸担当さん、安久津といいます。
searchdown, searchup, finddown, findup 等を使う前に、
escape していないと、seltopx/y, selendx/y 等の値は
保証されないのでしょうか?

あるファイルの中に、次のデータだけがあるとします。
------------------------------------
打者名   打率  本塁打 打点

イチロー  363   7    29
片岡    348   8    28
小笠原   320   7    28
ローズ   313   13   27
金子    310   2    12

[EOF]
------------------------------------
そのファイル上で searchtest.mac を実行します。
///// searchtest.mac
 $$ary[0] = "U 選択して、打率検索";
 $$ary[1] = "I 選択、escapeして、打率検索";
 ##end = 2;
 menuarray $$ary, ##end;
 ##item = result - 1;
 if( ##item < 0 ) endmacro;
 call searchTest ##item;
endmacro;
/////
searchTest:
 ##item = ##1;
 // 選択する。
 gofiletop;
 beginsel;
 moveto 0, 3;
 // カーソル移動ではだめ。
 gofileend; moveto 1, 2;
 gofiletop;
 setsearch "[0-9]+", 16;
 // 検索の前に不可欠ですか?
 if( ##item ) escape;
 finddown;
 if( result ){
 $$average = gettext( seltopx, seltopy, selendx, selendy );
 //menu "$$average の値", $$average, "N 了解";
 setclipboard $$average;
 }
return;
/////// end of searchtest.mac

「U 選択して、打率検索」が、私の所では次の様になりました。
$$average == "打者名   打率  本塁打 打点\n\nイチロー  "

もしかしたら、これは再現しないかもしれません。
というのも、1ヶ月ほど前に、ある有名なJavaプログラマーから
(公開している)JMaker.mac 1.12 の バグを指摘されました。
それは、コピーした直後の検索で seltopx/y selendx/y の値が
異常になるというものでした。しかし、私の所では再現しませんでした。
彼も JMaker.mac 2.00 にしたら直ったと言っていたので、
それっきりになりました。

最近、seltopx/y selendx/y 絡みで、気持ちの悪いものを
見ました。しかしどうも再現できません。
searchtest.mac が最後の望みです。
だれか、searchtest.mac で同じ結果になる人いませんか?
やっぱり escape が必要なんでしょうか?
秀丸は 3.01です。

ではでは。

[ ]
RE:03430 検索の前に escapeNo.03438
秀丸担当 さん 99/05/28 19:06
 
>こんにちは秀丸担当さん、安久津といいます。
>searchdown, searchup, finddown, findup 等を使う前に、
>escape していないと、seltopx/y, selendx/y 等の値は
>保証されないのでしょうか?

いちおう言われている通りになり、再現できたと思うのですが、
beginsel;をしている途中にfinddown;しているとこうなるので
正しいのではないでしょうか。
何か勘違いしているのかな...

[ ]
RE:03438 検索の前に escapeNo.03439
番頭++ さん 99/05/28 20:19
 
>いちおう言われている通りになり、再現できたと思うのですが、
>beginsel;をしている途中にfinddown;しているとこうなるので
>正しいのではないでしょうか。
>何か勘違いしているのかな...

投稿されたサンプルは、beginsel; の escape; が無いので仕様どうりに動いて
います。範囲選択を行うステートメントの後は escape; して、検索/置換を行う
ようにしています。それが普通です。

seltopx, seltopy, selendx, selendy, は範囲選択されたときに記憶されます。
その後、その行を変更すると、y は変更/修正されますが、x は昔のま
まです。そんな動きです。

//*1 xy1.mac
message str(seltopy) + ", " + str(seltopx) + ", " + str(selendy) + ", " + str(selendx);
endmacro;

範囲選択の後に、行を入れたり、消したり、列を入れたり、消したりすると、
そのあと xy1.mac を実行すると、なんとなく理解できます ...

seltopx, seltopy, selendx, selendy, x, y, の処理にはバグ (*1) があります。
いまはそれを覚えていません。回避、回避で対処してきました。
カーソル移動を行うマクロで x, y, が変わらないものもあった記憶があります。
そんなときには、無駄なカーソル移動を行って、正常な x, y, を得ます。
バグ (*1) は必ず再現できていました。記憶も、サンプルも無い。

昔選択された seltopx, seltopy, selendx, selendy, は、ファイルの内容を変
更すると当てにならないと思ってマクロを書くようにしています。

何が仕様なのかは知りません。これが、あちきの、回避策です。。。
きょうは、いそがしかったし、二日酔いでつかれた ...



[ ]
RE:03439 検索の前に escapeNo.03440
安久津 さん 99/05/29 00:13
 
こんにちは安久津です。

発言03438で秀丸担当さん書く
>beginsel;をしている途中にfinddown;しているとこうなるので
>正しいのではないでしょうか。
>何か勘違いしているのかな...
勘違いしていました。

発言03439で番頭++さん書く
>投稿されたサンプルは、beginsel; の escape; が無いので仕様どうりに動いて
>います。範囲選択を行うステートメントの後は escape; して、検索/置換を行う
>ようにしています。それが普通です。
普通でないことをしていました。

ことの始まり。
(1)Javaソースファイルには、次のような文字列があります。

package myclass.applet;

(2)上記の文字列がある場合には、そのソースファイルは必ず
「 ?????\myclass\applet\ 」というディレクトリにあります。
「?????」をカレントディレクトリにしてコンパイルしないと、
 エラー満開です。で、JMaker でコンパイルする前には、
 "myclass.applet" を下記(一部分)のようにして取得します。
/////
preProcessCompile:
 gofiletop;
 searchdown "package[ \\t]+[A-Za-z_][A-Za-z_0-9.]*[ \\t]*;", regular;
 if( result ){
 moveto x + 7, y;
 searchdown "[A-Za-z_][A-Za-z_0-9.]*", regular;
 $$package = gettext( seltopx, seltopy, selendx, selendy );
 }
 //menu "$$package", $$package, "N 了解";
 setclipboard $$package;
return;
/////
1ヶ月半前バグ報告を受けたのは、この部分でした。
コピーした後に、パッケージ依存のコンパイルをすると、
コピーした時の seltopx/y, selendx/y が生き残っていて、
$$package が正しく取得できないと言われました。
報告者は自分で seltopx/y, selendx/y の調査を行っていました。
私の所では再現しませんでした。
JMaker ver1.12 から 2.00 にしたら直ったと言われたので、
1.12の書き方が悪かったのだと思いました。
それが一昨日に私の所で何度も再現しました。2.00です。
# copy2 じゃありません。
しかし、再起動すると再現しませんでした。
ところが、beginsel の仕様を勘違いしていた私は、searchtest.macで、
近似的な再現マクロができたと思い込んだのでした。
お騒がせしました。m(__)m

ではでは。
# まず基本が...(--;

[ ]
RE:03440 検索の前に escapeNo.03448
番頭++ さん 99/05/31 07:17
 
> /////
> preProcessCompile:
>     gofiletop;
>     searchdown "package[ \\t]+[A-Za-z_][A-Za-z_0-9.]*[ \\t]*;", regular;
>     if( result ){
>         moveto x + 7, y;
>         searchdown "[A-Za-z_][A-Za-z_0-9.]*", regular;
>         $$package = gettext( seltopx, seltopy, selendx, selendy );
>     }
>     //  menu "$$package", $$package, "N 了解";
>     setclipboard $$package;
> return;
> /////

このサンプルでは、トラップするコードがひとつもないので、
何を疑えばいいのか判りませんです。
はじめの、searchdown; が失敗したのか ???
それとも moveto; の x, y, がおかしいのか ???
昔選択された seltopx, seltopy, selendx, selendy, ???

ここで、問題となるのは、
"動作環境 - ユーザインタフェース - 検索での表示" である、と想定すると、

むりやり、"Env","SelectFound" 矛盾を起こさせる、s1.mac です。//??
参考程度にしてください ....

K6-233, Windows 95 OSR 2.0, Hidemaru Ver. 3.01 の環境です。
この件に関するコメントはこれで終わりにします。。。

//*1    s1.mac
//*1    "動作環境 - ユーザインタフェース - 検索での表示" を、
//*1    "範囲選択"、"点滅表示" の両方でテストすると違いが見えてきます。

//D1    package myclass.applet_s1;
    escape;
    ENV;    //  テストのために、ここで変更する、と、
    envchanged; //  だれも、これができるとは、言っていません ...
    gofiletop;  beginsel;   right;  escape; //  dummy for sel/top/end/x/y/ !!!
//*1        writeininum "hidemaru.ini", "Env","SelectFound", 1; //  OK !
//*1        envchanged; //  OK !
//??    100 m sec. ここで待つと、どうなるんだろ ???
//??    message time;   //  wait !!!
    #selectfound1 = getininum("hidemaru.ini","Env","SelectFound");
    $wk1 = "1. 動作環境 - ユーザインタフェース - 検索での表示 - は ";
    if( #selectfound1 ){
        $wk1 = $wk1 + "範囲選択 モードです ???";
    } else {
        $wk1 = $wk1 + "点滅表示 モードです ???";
    }
    message $wk1;
    setclipboard "";
    gofiletop;
    searchdown "package[ \\t]+[A-Za-z_][A-Za-z_0-9.]*[ \\t]*;", regular;
    if( result ){
if( x != seltopx || y != seltopy ){
    menu "? - 01 " + str(x)+", "+str(seltopx);
}
        moveto x + 7, y;
if( x != seltopx || y != seltopy ){
    menu "? - 02 " + str(x)+", "+str(seltopx);
}
        searchdown "[A-Za-z_][A-Za-z_0-9.]*", regular;
    copy2;
if( x != seltopx || y != seltopy ){
    menu "? - 03 " + str(x)+", "+str(seltopx);
}
        $p = gettext( seltopx, seltopy, selendx, selendy );
    }
    menu "? - 04 - $p", $p;
    setclipboard $p;
    #selectfound2 = getininum("hidemaru.ini","Env","SelectFound");
    $wk2 = "2. 動作環境 - ユーザインタフェース - 検索での表示 - は ";
    if( #selectfound2 ){
        $wk2 = $wk1 + "\n\n" + $wk2 + "範囲選択 モードです !!!";
    } else {
        $wk2 = $wk1 + "\n\n" + $wk2 + "点滅表示 モードです !!!";
    }
    if( #selectfound1 != #selectfound2 ){
        message $wk2;
    }
endmacro;


[ ]