closehidemaruforced が一部動作しないNo.10544
MAK98 さん 25/02/12 08:30
 
秀丸担当さん

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

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

複数の結果ウィンドウを filetype[] で判断して closehidemaruforced で閉じる簡
単なものですが,どういうわけか複数の grep ウィンドウの中で一番上にあるウィン
ドウだけが閉じてくれません.条件分岐でそのウィンドウに対して closehidemarufo
rced が実行されていることは確認しましたが,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 しても
マクロを実行した秀丸は閉じない』のがなぜなのか?? マクロ実行した秀丸と gre
p ウィンドウを出している秀丸は別のプロセスということなんでしょうか?

>    #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 以外の秀丸を探してそれをアクティブにする』
という方法でもあまり問題は無かったのですが,よりスマートに(& 堅固に?)なっ
たと思います.

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

[ ]