[ 新規に投稿する ]

closehidemaruforced が一部動作しないNo.10544
MAK98 さん 25/02/12 08:30 [ コメントを投稿する ]
  秀丸担当さん

秀丸エディタマクロを生まれて初めて(!)作ったという超初心者です.よろしくお願いします.

grepreplace で複数対象ファイルのあちこちを一括書き換えするマクロを作りました.それ自体はうまく動作しましたが...grep の結果ウィンドウを閉じるところでつまづきました.

複数の結果ウィンドウを filetype[] で判断して closehidemaruforced で閉じる簡単なものですが,どういうわけか複数の grep ウィンドウの中で一番上にあるウィンドウだけが閉じてくれません.条件分岐でそのウィンドウに対して closehidemaruforced が実行されていることは確認しましたが,result を見ると 0 になっています.もちろん他のウィンドウは 1 です.closehidemaruforced のパラメータを番号ではなく hidemaruhandle にしても同じでした.当該部分の抜粋は以下の通りです.

#HidemaruNum = hidemarucount;
#HidemaruID = #HidemaruNum - 1;

while (#HidemaruID >= 0)
 {
  if (filetype[#HidemaruID]  == "grep")
  {
   closehidemaruforced #HidemaruID;
   #ResultID = result;
  }
  #HidemaruID = #HidemaruID - 1;
 }

確認に必要であれば全体のソースをお送りしますのでお申し付けください.
[ ]
RE:10544 closehidemaruforced が一部動作しないNo.10545
おすぎ さん 25/02/12 09:49 [ コメントを投稿する ]
  MAK98 さん

こんにちは。

>複数の結果ウィンドウを filetype[] で判断して closehidemaruforced で閉じる簡単
>なものですが,どういうわけか複数の grep ウィンドウの中で一番上にあるウィンド
>ウだけが閉じてくれません.

closehidemaruforced は、closehidemaru と同様に、自分自身を指定することは
できません。各ウィンドウを閉じる作業を、一番上にあるウィンドウ上で行って
いたとしたら、一番上にあるウィンドウ(自分自身)を閉じることはできません。

間違っていたらすみません。

おすぎ
[ ]
RE:10545 closehidemaruforced が一部動作しないNo.10546
MAK98 さん 25/02/12 10:19 [ コメントを投稿する ]
  おすぎ さん

レスポンスありがとうございます.

> 各ウィンドウを閉じる作業を、一番上にあるウィンドウ上で行って
> いたとしたら、一番上にあるウィンドウ(自分自身)を閉じることは
> できません。

なるほどおっしゃる通りですね.とりあえず,このような処理を加えることによって,一番上にあるウィンドウが grep ウィンドウだったら閉じる(終了する)ようにしました.

 if (filetype[0] == "grep") {
  quit;
 }

これで一応意図通りの動作になりましたが...なんだかアブナイような気もします.
いずれにせよ,ウィンドウの順番がどうなっているのかは場面によって変動するようで,自分自身まだ理解が足りていません.
[ ]
RE:10546 closehidemaruforced が一部動作しないNo.10547
こみやんま さん 25/02/12 10:46 [ コメントを投稿する ]
  次のようにするんじゃないかなぁ、とは思いますが、

(1)本当にgrep閉じて、秀丸ウィンドウが1つもない、みたいな状態にしたいのか、
(2)本当は、grepウィンドウを閉じたいだけで、「秀丸のウィンドウは、最低1つは残したい」

のかで変わりますかねぇ。


// ------------------------------------------------

#HidemaruNum = hidemarucount;
#HidemaruID = #HidemaruNum - 1;

while (#HidemaruID >= 0)
{
    if (filetype[#HidemaruID]  == "grep")
    {
        // それは、今マクロを実行しているプロセスである。
        if (#HidemaruID == 0) { // hidemaruhandle(0) の 0と同じことだから
            // すでにそれが最後に残っている秀丸プロセスである。
            if (hidemarucount == 1) {
                // マクロを実行しているプロセス自体を閉じたら、マクロの続きが実行できないので、(無題)とする
                closenew; // 本当に最後のウィンドウであったとしても、プロセスごと破棄していいなら、ここはquit でも良いがマクロの続きは実行されないので注意

            // 他に秀丸プロセスがある
            } else {
                // 別の秀丸エディタへとアクティブを移動させて、grep を閉じ、続きを実行する
                #handle = hidemaruhandle(#HidemaruID);
                setactivehidemaru(1);
                closehidemaruforced #handle;
            }

        // マクロを実行している以外のプロセス
        } else {
            // 単に閉じる (以下の2行は、closehidemaruforced #HidemaruID でも良いが、上と記述を合わせてある)
            #handle = hidemaruhandle(#HidemaruID);
            closehidemaruforced #handle; 
        }

        #ResultID = result; // デバッグか何かのためだろう
    }

    #HidemaruID = #HidemaruID - 1;
}


// ここにマクロの続きがあるかもしれない。
[ ]
RE:10546 closehidemaruforced が一部動作しないNo.10548
MAK98 さん 25/02/12 10:54 [ コメントを投稿する ]
  ちょっと補足です.

> ウィンドウの順番がどうなっているのかは場面によって変動するようで,
> 自分自身まだ理解が足りていません.

これですが...マクロを秀丸の untitled ウィンドウから起動して grep ウインドウの挙動を観察していると,最後に開いた grep ウィンドウが他の grep ウインドウの一番上に来てフォーカスが当たります.デバッグ情報を見ても,この grep ウインドウが “ゼロ番目” になっています.それが閉じずに残るわけです.

しかしマクロを起動したのはあくまでも untitled ウィンドウからなので,ゼロ番目の grep ウインドウはマクロから見た時の『自分自身』ではないと思っていました.そこらへんになにか齟齬がありそうな気がします.
秀丸から見た時の自分自身というのは,『一番上にあるウィンドウ』なのでしょうか? そうだとするとなんとなく理屈が通ります.

もう少し追究してみます.
[ ]
RE:10547 closehidemaruforced が一部動作しないNo.10549
MAK98 さん 25/02/12 11:22 [ コメントを投稿する ]
  こみやんま さん

レスポンスありがとうございます.

> (1)本当にgrep閉じて、秀丸ウィンドウが1つもない、みたいな状態にしたいのか、
> (2)本当は、grepウィンドウを閉じたいだけで、「秀丸のウィンドウは、最低1つは残したい」

どちらでもよいのですが,1だと落ちてしまったみたいで不安になるので,2でマクロ実行ウィンドウは残したいということですね.

> マクロを実行しているプロセス自体を閉じたら、マクロの続きが実行できない

とりあえず quit 文はマクロの最後に置いています.しかし,quit のスコープもそうなんですが秀丸のプロセスについて私はよく分かっていないので,『quit してもマクロを実行した秀丸は閉じない』のがなぜなのか?? マクロ実行した秀丸と grep ウィンドウを出している秀丸は別のプロセスということなんでしょうか?

>    #ResultID = result; // デバッグか何かのためだろう

その通りです.デバッグウィンドウに result を出力したいので,そのためでした.

初心者にはなかなか難しい...ので,とりあえず意図通りに動いているということで良しとします.
[ ]
RE:10546 closehidemaruforced が一部動作しないNo.10551
MAK98 さん 25/02/12 19:08 [ コメントを投稿する ]
  事後報告です.

上に書いたゼロ番目 grep ウィンドウを quit させるという手がどうも危なく感じられるので,結局 closehidemaruforced を走らせる前に以下のような処理を入れました.

#HidemaruID = #HidemaruNum - 1;
while (#HidemaruID >= 0) {
 if (filetype[#HidemaruID] != "grep") {
  setactivehidemaru #HidemaruID;
 }
 #HidemaruID = #HidemaruID - 1;
}

要するに,開いている秀丸ウィンドウをチェックして "grep" 以外のものがあったらそれをアクティブにしておくということです.これで grep ウィンドウのどれかがゼロ番目になることは回避できます.このマクロ使用状況では untitled か mac のどちらかのウィンドウが一つだけなので,スマートなやり方では全然ない拙いものですが意図した通りに動いています.
[ ]
RE:10551 closehidemaruforced が一部動作しないNo.10552
こみやんま さん 25/02/12 20:29 [ コメントを投稿する ]
  なんとなく、MAK98さんの理解が及んでないポイントがわかったかも。
MAK98さんの状況を推測するに、次のマクロが適切かもしれません。
(とはいえ、わたしが1回目に投稿したやつの方が実は万能ではあります...)

//------------- aaa.mac という ファイルにして実行してみればよい。-------------------

// @ マクロの最初の方で、マクロを実行した瞬間に開いていたアクティブウィンドウのハンドルを得ておく(番号ではダメ)
#OriginalWindowHandle = hidemaruhandle(0);


// A grepでウィンドウを出すためのモック(代わりのダミー)。
// 本来はMAK98 さんのマクロに grepreplace か何かで記述があるんだろう。
grep "aaaaaaaaaa", "*.txt", ".", word;


// このgrep系でウィンドウが新たに開いてしまうがゆえに、
// アクティブウィンドウが切り替わってしまう。
// アクティブウィンドウが変わると、ウィンドウの重なりの順序が変化するため、
// 「各ウィンドウのウィンドウ番号」も変化する。「ただし、★ウィンドウハンドルは変わらない★」。
// 又、「マクロ実行担当」もそのアクティブになったプロセスに映っている。


// B #OriginalWindowHandle(=マクロ実行時のウィンドウ)がマクロ実行中に閉じないと分かりきっているのであれば、次が一番適切。
// マクロ起動時のウィンドウをアクティブにする。
setactivehidemaru #OriginalWindowHandle;
// これで「マクロを実行した時のウィンドウ」が hidemaruhandle(0) = 0番目のウィンドウ=アクティブウィンドウになる


sleep(3000); // ★この行は不要。★ 一瞬で閉じてしまうので、目視で確認しやすいように入れている


// C最初にMAK98さんが、投稿していた内容で良いが、0までやる必要はない。1までで良い。
// hidemaruhandle(0)は、#OriginalWindowHandle なのだから、チェックする必要がないため。
#HidemaruCount = hidemarucount;
#HidemaruIX = #HidemaruCount - 1;

while (#HidemaruIX > 0) // >=0 ではなく、 > 0
 {
  if (filetype[#HidemaruIX]  == "grep")
  {
      closehidemaruforced #HidemaruIX;
  }
  #HidemaruIX = #HidemaruIX - 1;
 }

//--------------------------------------------------
[ ]
RE:10551 closehidemaruforced が一部動作しないNo.10553
igus さん 25/02/13 04:12 [ コメントを投稿する ]
  //grepを閉じるよ.mac

#HidemaruID=hidemarucount-1;
while(#HidemaruID>=0){
  if(filetype[#HidemaruID]=="grep"){
    closehidemaruforced #HidemaruID;
  }else{
    setactivehidemaru #HidemaruID;
  }
  #HidemaruID=#HidemaruID-1;
}
endmacro;
[ ]
RE:10553 closehidemaruforced が一部動作しないNo.10554
こみやんま さん 25/02/13 04:37 [ コメントを投稿する ]
  >//grepを閉じるよ.mac
> ......
>endmacro;

これだと、先頭に以下みたいに足すとgrepウィンドウが閉じないので、
投稿主の問題は解決しないのでは(というかまさにそこが問題になっていると思われる)

//grepを閉じるよ.mac
grep "aaaaaaaaaa", "*.txt", ".", word; // こういう行を足しても大丈夫なようにするにはどうすればよいですか? という質問と思われる。

// これでは閉じない。
#HidemaruID=hidemarucount-1;
while(#HidemaruID>=0){
  if(filetype[#HidemaruID]=="grep"){
    closehidemaruforced #HidemaruID;
  }else{
    setactivehidemaru #HidemaruID;
  }
  #HidemaruID=#HidemaruID-1;
}
endmacro;
[ ]
RE:10553 closehidemaruforced が一部動作しないNo.10555
igus さん 25/02/13 05:18 [ コメントを投稿する ]
  //grepを閉じるよ2.mac

#HidemaruID=hidemarucount-1;
#j=0;#k=0;
while(#HidemaruID>=0){
  if(filetype[#HidemaruID]=="grep"){
    #i[#j]=#HidemaruID;
    #j=#j+1;
  }else{
    #k=#HidemaruID;
  }
  #HidemaruID=#HidemaruID-1;
}
setactivehidemaru #k;
while(#j>0){
  closehidemaruforced #j;
  #j=#j-1;
}
endmacro;
[ ]
RE:10554 closehidemaruforced が一部動作しないNo.10556
igus さん 25/02/13 05:37 [ コメントを投稿する ]
  私の場合テンプファイルを沢山開いたあと一気に閉じたり削除したいという場合があり、そのときにこんな感じのマクロを作って利用していました。同様にマクロで作成したgrep結果を一気に消したいのかと思い、また事後報告のマクロでうまく動作しているとのことだったのでちょっとアレンジしてみたのですが勘違いだったらすいません。
むしろこみやんまさんのマクロだとgrep結果から起動すると閉じてくれなくておかしいなと思っていたのでした。
[ ]
RE:10555 closehidemaruforced が一部動作しないNo.10557
igus さん 25/02/13 06:38 [ コメントを投稿する ]
  //grepを閉じるよ3.mac

#hwnd=hidemaruhandle(0);
grep "aaaaaaaaaa", "*.txt", ".", word;
grep "bbbbbbbbbb", "*.txt", ".", word;
setactivehidemaru #hwnd;

#HidemaruID=hidemarucount-1;
//message str(#HidemaruID);
while(#HidemaruID>=0){
  if(filetype[#HidemaruID]=="grep"){
    closehidemaruforced #HidemaruID;
  }else{
    setactivehidemaru #HidemaruID;
  }
  #HidemaruID=#HidemaruID-1;
}
endmacro;
[ ]
RE:10552 closehidemaruforced が一部動作しないNo.10558
MAK98 さん 25/02/13 07:35 [ コメントを投稿する ]
  こみやんま さん

サジェスチョンありがとうございます.

> アクティブウィンドウのハンドルを得ておく

なるほど...! ウィンドウの番号は状況次第で変わっていくが,ハンドルは一意だということですね.光が見えたような気がします.これからちょっとトライしてみます.
[ ]
RE:10557 closehidemaruforced が一部動作しないNo.10559
MAK98 さん 25/02/13 07:38 [ コメントを投稿する ]
  igus さん

レスポンスありがとうございます.

参考にさせていただいて,これからちょっと初心者なりに苦闘してみます.
[ ]
RE:10558 closehidemaruforced が一部動作しないNo.10560
MAK98 さん 25/02/13 09:41 [ コメントを投稿する ]
  こみやんま さん

サジェストいただいた;
 1.ペアレント秀丸のハンドルを保存しておく.
 2.grepreplace 実行後にそれを使ってペアレント秀丸をアクティブ(ゼロ番)にする.
 3.ゼロ番目以外の grep 秀丸を closehidemaruforced する.
...という方法で,意図通りの動作を確認しました.

前に私が報告した『総当たりで grep 以外の秀丸を探してそれをアクティブにする』という方法でもあまり問題は無かったのですが,よりスマートに(& 堅固に?)なったと思います.

お付き合いいただき,感謝します.
[ ]

[ 新規に投稿する ]