マクロの「openfile」後の「searchdown」No.01516
TAKA さん 00/09/26 08:43
 
お世話になります。久しぶりのTAKAです。

以前から気になっていた現象で、再現方法をかなり特定出来ること
が出来ましたので、お知らせします。
秀丸はVersion 3.05,
会社で使用しているWindowsNT Workstation 4.0(Service Pack 4)
では再現するのですが、自宅で使用しているWindows98では再現し
ませんでした。

マクロを使って
1.ファイルをオープン(「openfile」を使用)
2.1のファイル内を検索(「searchdown」を使用)
3.1のファイルをクローズ
という処理を行うと、正常に処理出来ない場合があります。(正常
に処理出来る場合もある)
正常に処理出来ない場合には、アクティブになるはずのないものが
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
アクティブになったり、ファイルが閉じられなかったりします。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

その現象を最も簡単に再現するプログラムが以下のマクロです。
--------- ここから -----------------------------------------
//  $tbl[0] = "d:\\private\\tags";      // 2M程度
//  $tbl[1] = "d:\\private\\tags2";     // 2M程度
    $tbl[0] = "d:\\private\\test";      // 100バイト程度
    $tbl[1] = "d:\\private\\test2";     // 100バイト程度

    #fh = hidemaruhandle( 0 );

    #i = 0;
    while( #i < 2 )
    {
        openfile "/h /r " + $tbl[#i];
//      openfile $tbl[#i];
        #search_fh = hidemaruhandle( 0 );

//      #wait = 100;
//      while( #wait > 0 )
//      {
//          #wait = #wait - 1;
//      }

        searchdown "Test";                      // 検索

        setactivehidemaru #fh;
        closehidemaru #search_fh;

        #i = #i + 1;
    }
    endmacro;
--------- ここまで -----------------------------------------

いろいろテストしていて、謎な現象がいくつかありました。

[謎1]
ステルスモードでのオープンをやめて、通常のオープンで試すと正
常に処理出来やすい。但し、2M程度のファイルの場合は、正常に出
来ない場合がある。

[謎2]
検索を行わないと、正常に処理出来る。

[謎3]
「openfile」と「searchdown」の間にウエイトを入れると正常に処
理出来る。

[謎4]
「openfile」と「searchdown」が1回だと正常に処理出来る場合が
ある。(正常に処理出来ない場合もある。)
ステルスモードで2回行うと、ほぼ確実に処理出来ません。

何が、原因でしょうか?
「openfile」と「searchdown」が絡んでいることは間違いないと思
うのですが。


ちなみに、何がしたいかと言うと、複数ファイルのタグファイルを
使ってのタグジャンプがしたかったのです。(候補が複数ある場合
は、メニュー表示)
#原因が特定出来ない場合は、ウエイトを入れるか、検索の代わり
  に「grep」を使って実現するしかないかなー


ついでに、新しいマクロ命令でヘルプファイルのキーワードに登録
されていないものがいくつかありましたので、お知らせします。
showruler,tabruler,rulercolor,rulerbackcolor,correctlineno,
msdnlibrary,filename2,basename2,directory2,filename3,
basename3,directory3,loaddllfile

[ ]
RE:01516 マクロの「openfile」後の「searNo.01517
ENCODINGSHIFTJIS さん 00/09/26 09:37
 
以前の連続 tagjump backtagjump の問題と似ている
SDIのアクティブの切替え「完了」をマクロがチェックできず
マクロ実行が先走るという現象では?、完全解決してないと思う。
SDI の切替えはなにか重くなることがある。
MIFESマクロでも 画面転換を連続2回以上含むものでは
MDI では問題無しで SDI ではダメなのが普通です。

とりあえず、一本化したファイル使うとか 固定で open 済みにした
面に jump するようにするとか しかないと、くらいかな です。


[ ]
RE:01517 マクロの「openfile」後の「searNo.01518
ENCODINGSHIFTJIS さん 00/09/26 11:18
 
その他 2MeB はきついですが 何とか圧縮できれば
田楽サーバーの グローバル変数が 使えるはずです。
巨大辞書(連想配列)はテキストの面が使い易いのですが

[ ]
RE:01516 仮に改造しての回避 - Part.1No.01519
番頭++ さん 00/09/26 12:34
 
>アクティブになったり、ファイルが閉じられなかったりします。

次の行を仮に、
    setactivehidemaru #fh;
    closehidemaru #search_fh;

次のように改造して、回避できることがあります。
    $temp_name1 = $tbl[#i];
    setactivehidemaru #fh;   // originai.
    closehidemaru #search_fh;    // originai.
    #act_1 = -99;   //  bug ???
    while( #act_1 != -1 ){
        #act_1 = findhidemaru($temp_name1);
    }

# うまく行かなくても、おこんないでね !!!

>ついでに、新しいマクロ命令でヘルプファイルのキーワードに登録
>されていないものがいくつかありましたので、お知らせします。
>showruler,tabruler,rulercolor,rulerbackcolor,correctlineno,
>msdnlibrary,filename2,basename2,directory2,filename3,
>basename3,directory3,loaddllfile

ほかにも、あったような記憶が ... わすれた ...

[ ]
RE:01518 マクロの「openfile」後の「searNo.01520
ENCODINGSHIFTJIS さん 00/09/26 14:44
 

// switchfile.mac
//              作業面の使いまわしではどうか
#hwnd = hidemaruhandle(0);
openfile "/h";if(#hwnd == hidemaruhandle(0)){ message "確認1";              
                                        message "確認2";
                    setactivehidemaru findhidemaru(""); }

insertfile "0.txt";
searchdown "ffff";if(result)menu "fffff";
selectall delete insertfile "a.txt";
searchdown "jjjj";if(result)menu "jjjjj";
selectall delete insertfile "b.txt";
searchdown "iiii";if(result)menu "iiiii";
selectall delete insertfile "c.txt";
searchdown "cccc";if(result)menu "ccccc";

面の切替えは最初の1回だから そこを通過すれば ok でした


[ ]
RE:01517 マクロの「openfile」後の「searNo.01521
TAKA さん 00/09/27 07:46
 
>SDIのアクティブの切替え「完了」をマクロがチェックできず
>マクロ実行が先走るという現象では?、完全解決してないと思う。

もしそうなら、「検索を行わないと、正常に処理出来る。」という
ことと、処理が1回なら正常に動作するということが謎ですね。


>とりあえず、一本化したファイル使うとか 固定で open 済みにした
>面に jump するようにするとか しかないと、くらいかな です。

一本化する方法は「insertfile」命令でどうにかするくらいでし
ょうか。これは、言い方法かも。

[ ]
RE:01518 マクロの「openfile」後の「searNo.01522
TAKA さん 00/09/27 07:46
 
>その他 2MeB はきついですが 何とか圧縮できれば

ただのTagファイルなので圧縮は無理かな。

[ ]
RE:01520 マクロの「openfile」後の「searNo.01523
TAKA さん 00/09/27 07:47
 
>面の切替えは最初の1回だから そこを通過すれば ok でした

私のしたいこととは、ちょっと違うかも。
一つの単語を複数のタグファイルから検索して複数あればメニュー
表示をしてタグジャンプがしたいので。


いろいろな意見ありがとうございました。

どちらにしろ、秀丸の不具合っぽいのですが。
どうなんでしょうか? > 秀丸担当 さん

SDIでは無理なのではという意見もあるようですが、不具合が直ら
ないようでしたら、ENCODINGSHIFTJIS さんの案のファイルを一つ
にまとめてから処理するという方法しかなさそうです。

[ ]
RE:01519 仮に改造しての回避 - Part.1No.01524
TAKA さん 00/09/27 07:48
 
>次のように改造して、回避できることがあります。

findhidemaruは、openが終わった時点で必ずそのウィンドウ番号を
返すと思いますが、findhidemaruの処理にかかる時間が正常に動作
出来る程度のウエイトになるのかも。

[ ]
RE:01523 マクロの「openfile」後の「searNo.01525
ENCODINGSHIFTJIS さん 00/09/27 09:20
 
成功率を高める おまじない としては その他
辞書面を固定名で 開きっぱなしにしておいて おくことです
表示は タイトルバー程度の ウィンドサイズでよい

openfile は 新規に HWND を起こす処理で 秀丸だけでなく
システムの処理も多いはずです。

[ ]
RE:01525 マクロの「openfile」後の「searNo.01528
ENCODINGSHIFTJIS さん 00/09/27 15:32
 
   いちおう こんな かんじです 安定してます。
// WorkFile.mac
//     常駐の作業用面を使う例
//
// 作業面の確保
   #hwnd0 =hidemaruhandle(0); // マクロ起動面
   #hwndW=findhidemaru("C:\\Windows\\Temp\\{[+-_=]}");// 名前は適当
if(#hwndW== -1){ // 無ければ新規作成
openfile "/h /(0,555,66,22) C:\\Windows\\Temp\\{[+-_=]}";
if(0 == hidemaruorder(#hwnd0)){ // 面切替え失敗
        message "作業面確保中?";message "作業面確保中?";
setactivehidemaru findhidemaru("C:\\Windows\\Temp\\{[+-_=]}");
if(!result){menu "作業面確保失敗"; endmacro }  }  
   #hwndW=hidemaruhandle(0);   // 作業面のハンドルも取っておく
                }             //  新規作成完了
disabledraw;// 気持ち
// --------------------------------
// 以下 面の切替えは ハンドルを使って setactivehidemaru で
// 作業ファイルの切替えは selectall delete insertfile("....");
//
 


[ ]
RE:01523 マクロの「openfile」後の「searNo.01529
秀丸担当 さん 00/09/27 18:16
 
>どちらにしろ、秀丸の不具合っぽいのですが。
>どうなんでしょうか? > 秀丸担当 さん

サンプルのマクロをv3.05で実行させてみたのですが、再現できませんでした。
ENCODESHIFTJISさんのところでは再現できているのでしょうか。

動作環境の瞬間起動とテンポラリファイルの再利用はどうなっているでしょうか。

tagjumpでアクティブ切り替えがうまくいかない問題は、こちらでも再現して
おり、次のバージョンで直ります。
seachdownのlinknextオプションでも同様の問題があり、これも直ります。
今回の報告はlinknextが関係しているとかいうことはないでしょうか?


[ ]
RE:01529 マクロの「openfile」後の「searNo.01530
TAKA さん 00/09/28 02:58
 
>動作環境の瞬間起動とテンポラリファイルの再利用はどうなっているでしょうか。

会社のマシンなので、明日調べておきます。


>今回の報告はlinknextが関係しているとかいうことはないでしょうか?

「linknext」は使用していません。
1516に書いている通りのマクロです。
1516にも書いていますが、Windows98では再現しないで、
WindowsNT Workstation 4.0(Service Pack 4)で再現します。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

再現できる方がいなければあきらめます。
「insertfile」を使用して複数のファイルを1つにまとめてから処
理するというようにして逃げる方法もありますので。

[ ]
RE:01530 マクロの「openfile」後の「searNo.01533
秀丸担当 さん 00/09/28 18:39
 
>「linknext」は使用していません。

そうですか。

>1516に書いている通りのマクロです。
>1516にも書いていますが、Windows98では再現しないで、
>WindowsNT Workstation 4.0(Service Pack 4)で再現します。
>^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

NT4.0のみというのは見落としていました。すいません。
WinNT4.0(SP6)とWin2000,Win98SEの全てで試してみましたが、
再現できませんでした。
2MBのファイル等でも試してみました。
うーむ。

[ ]
RE:01530 マクロの「openfile」後の「searNo.01535
TAKA さん 00/09/28 20:46
 
>>動作環境の瞬間起動とテンポラリファイルの再利用はどうなっているでしょうか。
>
>会社のマシンなので、明日調べておきます。

1.秀丸の常駐はON
2.瞬間起動はOFF
3.テンポラリファイルを使用する
4.テンポラリファイルを利用して再オープンの高速化はOFF

以下のような全ての組み合わせ(6パターン)でテストしましたが
どの時も結果は一緒でした。

1     2      3          4
ON  OFF 使用しない −
ON  OFF 使用する   OFF
ON  OFF 使用する   ON
ON  ON   使用しない −
ON  ON   使用する   OFF
ON  ON   使用する   ON

念の為に、普段利用している常駐関係のソフトを終了させて、アプ
リ等は一切起動していない状態にし、マクロを実行するために適当
なファイルだけを開き、その秀丸上でマクロを実行しました。
「test」と「test2」のファイルは半角の空白1バイトだけのファ
イルでテストしてみました。
100%に近い確立でマクロ終了後に「test2」が閉じられていま
せん。「test」は閉じています。ごくまれに正常に動作する時があ
りました。

マシン固有の問題かもしれませんね。

[ ]