tagjumpとbacktagjumpの挙動についてNo.00442
大関一徳 さん 99/03/02 13:08
 
大関と申します。

マクロでのtagjumpとbacktagjumpについてですが、環境によってはtagjampコマンド
が終了した段階ではまだウインドウが切り替え終わっていないことが有るようです。

以下がテスト用のマクロです。

//ここから
#loop = 1000;
while (#loop > 0){
tagjump;
if (!result){
message "tagjump error!";
endmacro;
}
backtagjump;
if (!result){
message "backtagjump error!";
endmacro;
}

#loop = #loop - 1;
}
message "正常終了";
//ここまで

このマクロをタグジャンプできるファイルを開いておいて実行すると、
Windows NT4.0 (Pentium-II 300MHz)では正常終了し、
Windows 95 (Pentium 133MHz)ではエラーが発生しました。

OSとマシンの速度のどちらが原因かは不明です。


エラーが発生した状況では、タグジャンプした先のファイルの秀丸にて"tagjump err
or!"の表示がされていました。

どうも、backtagjumpにてウインドウが切り替わる前にtagjumpしようとしてエラーが
発生しているようです。

そこで、tagjumpとbacktagjumpの後に10000回程度の空ループを入れたところ、とり
あえず正常に動作するようです。


ということで、

(1) 仕様or不具合?
この現象は仕様でしょうか、不具合でしょうか?
また、OS、マシンパワーのどちらに依存する問題なのでしょうか?

(2) 回避策は?
この現象をマクロ記述上で回避するための策はありませんか?
上述したような空ループでのウェイトでは、短すぎると不具合が発生する可能性があ
りますし、長すぎると処理に時間がかかりすぎるようになってしまいます。

以上、長くなりましたがよろしくお願いいたします。

[ ]
RE:00442 tagjumpとbacktagjumpの挙動につNo.00443
番頭++ さん 99/03/02 16:26
 
>(2) 回避策は?
>この現象をマクロ記述上で回避するための策はありませんか?

仕様かどうかは、不明ですが、回避策ですが、

//*1 【マクロ名】 KZ_TjRopBj.mac - Ver. 02.01 - 1998/07/01
    disableerrormsg;    escape;
    $wk1 = filename2;
    tagjump;
    if( ! result ){ endmacro;   }
    if( $wk1 == filename2 ){    endmacro;   }
    if( ! readonly ){   readonlyswitch; }
    setactivehidemaru 0;    title 1;
    inputpos filename2 + " - [Enter] : backtagjump; - [Esc] : endmacro;";
    if( iskeydown( 0x1B ) ){    endmacro;   }   //  [Esc]
//R if( iskeydown( 0x0D ) ){    endmacro;   }   //  [Enter]
    $wk1 = filename2;
    backtagjump;
    if( ! result ){ endmacro;   }
    setactivehidemaru 0;    title 1;
    closehidemaruforced hidemaruhandle(findhidemaru($wk1));
    enableerrormsg;
endmacro;

tagjump; backtagjump; のあとで、
setactivehidemaru 0; を入れて見て下さい。結果オーライということで ...

[ ]
RE:00443 tagjumpとbacktagjumpの挙動につNo.00444
大関一徳 さん 99/03/02 17:58
 
おおぜきです。
コメント有り難うございます。

>tagjump; backtagjump; のあとで、
>setactivehidemaru 0; を入れて見て下さい。結果オーライということで ...

やってみましたが、うまく行かないようです。

最初に示した私のテスト用マクロにこれを追加してみましたが、前から動いていたNT
の環境では動作するのですが、95では駄目です。

ただし、不具合の出方が多少変わりました。
以前と同じように"tagjump error"と表示されることもあるのですが、別の場合には、
「XXXXは既に他の秀丸が開いています。構わずに開きますか?」というダイアログが
表示され、かつエラーメッセージとして「指定された行が見つかりませんでした。行
番号:YYYY」というものも表示されます。またなぜかエラーチェックにはかからずに
続いてしまうため、このエラーメッセージが大量に出てしまいます。

ということで、私の環境ではこの方法では駄目でした。

[ ]
RE:00444 tagjumpとbacktagjumpの挙動につNo.00445
番頭++ さん 99/03/02 18:17
 
>ということで、私の環境ではこの方法では駄目でした。

前と、後ろの勘違いですが、これでもだめですか ???

//*2a1.mac
#loop = 100;
while (#loop > 0){
setactivehidemaru 0;
tagjump;
if(!result){
message "tagjump error! " + str(#loop);
endmacro;
}
setactivehidemaru 0;
backtagjump;
if(!result){
message "backtagjump error! " + str(#loop);
endmacro;
}
#loop = #loop - 1;
}
message "正常終了";
endmacro;

[ ]
RE:00444 tagjumpとbacktagjumpの挙動につNo.00446
番頭++ さん 99/03/02 18:21
 
>ということで、私の環境ではこの方法では駄目でした。

//*2a2.mac
#jj = hidemaruhandle(0);
#loop = 100;
while (#loop > 0){
//setactivehidemaru 0;
setactivehidemaru #jj;
tagjump;
if(!result){
message "tagjump error! " + str(#loop);
endmacro;
}
setactivehidemaru 0;
backtagjump;
if(!result){
message "backtagjump error! " + str(#loop);
endmacro;
}
#loop = #loop - 1;
}
message "正常終了";
endmacro;

[ ]
RE:00446 tagjumpとbacktagjumpの挙動につNo.00448
大関一徳 さん 99/03/02 20:41
 
大関です。

何度も有り難うございます。
しかしながら、教えていただいた、2a1.macおよび2a2.macの両方とも駄目でした。

2a1.macのほうは数十回試しましたが、ほとんどの場合では"tagjump error!"のメッ
セージがでて終了します。数字は90番台のことが多いですが、80ぐらいまで行ったこ
とも有りました。
また、数十回中で2回くらい、メッセージ00444で説明した「他の秀丸が開いていま
す」&「指定された行が見つかりませんでした」の状態になってしまいました。

2a2.macのほうは、いままで試した限りでは毎回、後者の不具合が発生しています。


そこで、さらに2a2.macと似たようなアプローチで試してみました。

//tagtest2.mac
#h1 = hidemaruhandle(0);
#loop = 100;
while (#loop > 0){
tagjump;
if(!result){
message "tagjump error! " + str(#loop);
endmacro;
}
while (hidemaruhandle(0) == #h1){
title "h1 loop" + str(#loop);
}
title 1;
#h2 = hidemaruhandle(0);
setactivehidemaru #tt;
backtagjump;
if(!result){
message "backtagjump error! " + str(#loop);
endmacro;
}
while (hidemaruhandle(0) == #h2){
title "h2 loop" + str(#loop);
}
title 1;
#loop = #loop - 1;
}
message "正常終了";
endmacro;


しかし、何回かタグジャンプを繰り返したあとで止まってしまいます。
この時には、元のタグファイルのウインドウのタイトルが"h1 loop ZZZ"になってお
り数字は変化しません。これを何回も書き換えているような様子が見えます。
しかしタグジャンプ先のウインドウがアクティブになっています。タグジャンプ先の
ウインドウタイトルは変化有りません。
この状況でループから抜け出せないで、無限ループ状態になっています。

どうも、実際にはアクティブなウインドウが切り替わったのに、秀丸のマクロ環境で
はそれが検出できず、titleの書き換え先やhidemaruhandle(0)の戻り値に反映できて
いないような気がします。


で、この現象は私の環境だけなのでしょうか。
不具合が発生する環境をもう少し詳しく書きます。
・秀丸Ver2.29
・Windows 95 (ServicePack2)
・Pentium 133MHz
・RAM 64MB
・Diamond Stealth 64GT (1280*1024 256color mode)
常駐物のたぐいは外して試しましたが、同様でした。


[ ]
RE:00448 tagjumpとbacktagjumpの挙動につNo.00449
番頭++ さん 99/03/02 20:54
 
まず、何がしたいのか、℃のような機能が必要なのか、を書いてみて、ください。
grep のあとで、何かの処理が必要なわけですよね。
1000 回ループするいみは無いはずです。
いまは、マクロの仕様をテストしている雰囲気です。
tagjump, backtagjump, にこだわる必要も無いはずです。

今日は、店じまいさせて頂きます。明日の「昼休み」は開店します。です。

どのような機能がほしいのか、です。

[ ]
RE:00449 tagjumpとbacktagjumpの挙動につNo.00450
大関一徳 さん 99/03/02 22:46
 
大関です。

>まず、何がしたいのか、℃のような機能が必要なのか、を書いてみて、ください。
>grep のあとで、何かの処理が必要なわけですよね。
>1000 回ループするいみは無いはずです。
>いまは、マクロの仕様をテストしている雰囲気です。
>tagjump, backtagjump, にこだわる必要も無いはずです。
>
>今日は、店じまいさせて頂きます。明日の「昼休み」は開店します。です。
>
>どのような機能がほしいのか、です。


番頭++さま、ご不快に感じられたようで申し訳ございません。

私としては、最初の投稿に自分で「(2) 回避策は?」とか聞いておきながらも、頭の
中は「マクロの仕様をテスト」が主になっていました。


まず、私がやりたいことを説明します。

[[[私のやりたいこと その1]]]
「秀丸エディタ情報交換」の02575に書き込んだように、Cのソースにて関数の定義が
int foo
(
int a,
int b
)
{
...
}
このような場合にtagsファイルの作成を行うと、tagsファイルには"("の行が登録さ
れてしまい、このためダイレクトタグジャンプが機能しません。

この書き込みにはコメントがつかなかったので、マクロにて解決しようと思いました。

具体的には、
(1) tagsファイルにて"("のみの行を検索
(2) tagjumpして、ジャンプ先の一行上の行の内容を取得
(3) backtagjumpにてtagsファイルに戻って、取得した情報を基に適切に書き換える
というような手順を踏めば大丈夫だと思っています。

とりあえずtagjumpとbacktagjump以外の部分については、だいたい意図どおりに動作
するものが出来ましたが、ここの部分にて躓いています。
-----------

[[[私のやりたいこと その2]]]
複数のファイルに対して、置換コマンドでは対応できない(あるいはマッチする正規
表現を考えるのが面倒な)ような置き換えを実行するために、以下のような手順を行
いたいと思っています。
・まず、手作業でgrepする
・手作業でgrep結果を変更する
・マクロにて「変更されているgrep結果」の内容を元のファイルに書き戻す
このマクロが作成したいと思っています。
これはかなり以前に作成しかけましたが、この問題で挫折したままになっています。
-----------

秀丸マクロを用いてこれらのことを実現するには、すくなくともtagjumpコマンドは
使いたいところです。
上記の構成を大きく変えないかぎり、tagjumpコマンドそのものを使わないまでも、
同様の処理を自分で作るはめになりそうですし。
##backtagjumpは使わないでもどうにかなるとは思っています。

ということで、このようなやりたいことがあってマクロを作成していたのですが、こ
の過程で不具合と思われる現象に遭遇しました。
そこで、この現象を明確にするために、あくまでこの現象の「テスト用のマクロ」と
して最初の投稿にあるようなマクロを書いたわけです。
1000 回ループしたりしているのもあくまでテストが目的だからで、1000回位は正常
に動かないと、特に「その2」の場合にはあぶなくて使えないと思ったからです。

ということで、投稿の意図を説明させていただきました。 >> 番頭++さま

さらなる情報をお寄せください。 >> ALL

長文失礼しました。

[ ]
RE:00450 tagjumpとbacktagjumpの挙動につNo.00451
番頭++ さん 99/03/03 12:20
 
大関さん、おはようございます。

> ...ご不快に感じられたようで申し訳ございません。

ぜんぜん、そんなことはありません。

 1000 回、成功したとして、いつも、どの環境でもうまくいく問題では無いと思
いました。昨日の状態ではマクロの不確定なテストになってしまいます。オンラ
インモードで書きこんだので誤字脱字が多くてすみません。帰宅前でした。

tagjump, backtagjump, の指摘されている問題を、
あちきは、通常は、setactivehidemaru 0; で回避しています。
確かに 100 % の回避は出来ません。そうみたいです。

> ということで、投稿の意図を説明させていただきました。...

1) "(&G) grep - わからん ! " は、grep の後の jump の例です。

grep のあと、結果と、元のファイル行き来をしています。


2) KZ_GrepUp.mac は grep 後の本文更新です。

200 bytes 以内に改行がある文字列で、ファイル名に ( ) が無ければ動きます。
これは、あちきが使用している「 grep 後の本文更新」の雛型、スケルトンです。
用途に応じて書き換えて使用しています。この中に、試行錯誤があります。
grep で、数千行探し出して、200 - 300 ファイルの更新の実績が、
あちきの環境ではあります。Windows 95 で K2-233 です。


本来の動きをテストした後で、でないと仕様が判らないとおもいますので、
KZ_GrepUp.mac を改造してみてください。
この「試行錯誤」に関しては、マクロ本来の仕様であるという保証はありません。
それと「試行錯誤」に関しては質問はなしと言うことにしてください。
結果オーライということで ...

「本文更新」によって行番号が変わると正常な動きにはなりません。その時には、
 grep の結果であるファイルの後ろから処理を開始するとうまく行きます。

やりたいことは、いつもファイル数と、リソースを考えて処理しないと、
適切な処理時間が得られません。「わからん」は参照なので 5 ファイルを MAX で
処理しています。KZ_GrepUp.mac は必ず、クローズするか、しないかのきめ打ちです。

大関さんの環境で、
KZ_GrepUp.mac がだめであれば、tagjump, backtagjump, をあきらめて、
grep のファイル名、行番号を得て、setactivehidemaru; closehidemaru;
で処理を行なうしか方法がありません。


------------------------------------------------------------------------
//  "(&G) grep - わからん ! "
ppkn_grep1:
    $wk1 = input(directory2+"\n\ngrep - 検索する文字列 ?","[0-9][0-9]\\.[0-9][0-9]");
    if( ! result ){ endmacro;   }
    if( strlen($wk1) == 0 ){
        grepdialog;
        if( ! result ){ endmacro;   }
        if( iskeydown( 0x1B ) ){    //  [Esc]
            if( basename == "" && x+y == 0 ){
                quit;   endmacro;
            } else {
                endmacro;
            }
        }
    } else {
        grep $wk1, "*.*", directory2, regular, icon;
    }
    if( basename == "" && code == eof ){
        quit;   endmacro;
    }
    config "t4 w200";   readonlyswitch;
    while( ! iskeydown( 0x1B ) ){   //  [Esc]
        setactivehidemaru 0;    title 1;
        if( basename == "" ){
            inputpos "わからん ! - [Enter] : tagjump;";
            if( iskeydown( 0x1B ) ){    break;  }   //  [Esc]
            golinetop2; tagjump;
        } else {
            inputpos filename2 + " - わからん ! - [Enter] : backtagjump;";
            if( iskeydown( 0x1B ) ){    break;  }   //  [Esc]
            golinetop2; backtagjump;
        }
        #i = hidemarucount;
        if( #i > 5 ){   // MAX 5 file だけ残す。
            closehidemaru #i-1; closehidemaru 5;
        }
    }
    #i = hidemarucount;
    while( #i > 1 ){
        #i = #i - 1;    closehidemaru #i;
    }
    title 1;
    setsearch "", 0x00; //  reset. 記憶にありません !
endmacro;
// end of macro.
------------------------------------------------------------------------

------------------------------------------------------------------------
//*1 *** Macro for 「秀丸エディタ」 ***
//*1 【マクロ名】 KZ_GrepUp.mac - Ver. 02.02 - 1998/10/13
//*1 【作者】 番頭++ / E-mail:xxxxxxxx@niftyserve.or.jp
//*1 【機能】
//*1 ・Grep 行の本文更新処理を行なう。
//*1 ・自由に変更してご使用下さい !
//
    question "Grep 行の本文更新処理を行ないますか ?";
//  if( ! result ){ message "マクロを中止します !"; endmacro;   }
    if( ! result ){ endmacroall;    }
    question "Grep 行の更新後ファイルをクローズしますか ?";
    if( iskeydown( 0x1B ) ){    endmacroall;    }   //  [Esc]
    #sw_close = result;
//  disabledraw;
//  gofiletop;
    $time_start1 = time;
    $str_f1 = filename2;
//R #handle1 = hidemaruhandle( findhidemaru( $str_f1 ) );
//R setactivehidemaru #handle1;
    golinetop2;
    while( code != eof && code != 0x0d ){
        golinetop2; beginsel;
        while( code != '(' ){
            if( code == 0x0d ){
                message "Bug-1 - file name !!!";    escape; endmacroall;
            }
            right;
        }
        $str_f2 = gettext(seltopx,seltopy,selendx,selendy); escape;
        while( code != ':' ){
            if( code == 0x0d ){
                message "Bug-2 - grep !!!"; escape; endmacroall;
            }
            right;
        }
        right 2;    beginsel;   golineend2;
        $str_line = gettext(seltopx,seltopy,selendx,selendy);   escape;
        if( $str_line == "" ){
            message "Bug-3 - no line !!!";  escape; endmacroall;
        }
        golinetop2;
        if( findhidemaru( $str_f2 ) == -1 ){
            if( #sw_close ){
                openfile " /h " + $str_f2;
            } else {
                openfile $str_f2;
            }
        }
        setactivehidemaru hidemaruhandle(findhidemaru($str_f1));
        tagjump;
        if( ! result ){
            message "ERROR - tagjump failed !";
            endmacroall;
        }
        setactivehidemaru hidemaruhandle(findhidemaru($str_f2));
        beginsel;   golineend2; delete;
        insert $str_line;
        golinetop2;
        if( #sw_close ){
            saveas filename2;
            if( ! result ){
                message "ERROR - saveas failed !\n\n" + filename2;
                endmacroall;
            }
        }
        backtagjump;
        if( ! result ){
            message "ERROR - backtagjump failed !";
            endmacroall;
        }
        setactivehidemaru hidemaruhandle(findhidemaru($str_f1));
        if( #sw_close ){
            closehidemaru 1;
        }
        golinetop2; golineend2; right;
    }
    beep;   message "Start : " + $time_start1 + "\nEnd  :  " + time;
//  gofiletop;
enabledraw;
beep;
endmacro;
// end of macro.
------------------------------------------------------------------------

[ ]