getclipboardとgrepの併用についてNo.09377
* さん 21/05/19 16:40
 
初めまして。
秀丸マクロを初めて触っています。

この度、コピーしているデータ(クリップボード上のデータ)を順次grepするマクロ
を作成したいと考えております。
現在、grepすることでクリップボードのデータが書き換わるような挙動をしていて困
っています。

https://crocro.com/pc/write/hide/chimarl03.html
このサイトを参考にさせていただき、現在このような内容になっております。

 /* 選択した単語を1行づつgrepにかけるマクロ */
 
  showcliphist;
 disabledraw;
 //clearcliphist;

 beginclipboardread;
 #ClipNo = 0;
 $Name[#ClipNo] = getclipboard();
 $LastChech = rightstr( $Name[#ClipNo], 1 );
 if( $LastChech == "\n" ){
  #LastLen = strlen( $Name[#ClipNo] )-1;
  $Name[#ClipNo] = leftstr( $Name[#ClipNo],#LastLen );
 }
 while( $Name[#ClipNo] != "" ) {
  message $Name[#ClipNo];
//  grep $Name[#ClipNo] , "*.c;*.h;*.asm;*.asc;*.gpj;*.ld;*.800" , "D:\\git_
new" , regular, word, nocasesense, subdir, hilight;
  #ClipNo = #ClipNo + 1;
  $Name[#ClipNo] = getclipboard();
  // 終末改行チェック
  $LastChech = rightstr( $Name[#ClipNo], 1 );
  if( $LastChech == "\n" ){
   #LastLen = strlen( $Name[#ClipNo] )-1;
   $Name[#ClipNo] = leftstr( $Name[#ClipNo],#LastLen );
  }
 }

 enabledraw;
 endmacro;

現在コメントアウトしている
 >grep $Name[#ClipNo] , "*.c;*.h;*.asm;*.asc;*.gpj;*.ld;*.800" , "D:\\git_ne
w" , regular, word, nocasesense, subdir, hilight;
の行がネックとなっています。

例えば
 aaa
 bbb
 ccc
 ddd
というデータをコピーしている時に実行した場合。
コメントアウト有だと正常にメッセージBoxに「aaa,bbb,ccc,ddd」と順番に表示され
ます。
ですが、コメントアウトを解除すると
「aaa,aaa,aaa,aaa,aaa,aaa,aaa....」のように個数を超えてもずっとaaaを表示(&g
rep)し続けてしまいます。もちろんクリップボード上のデータが1行のみでも同じ事
象が発生いたします。

私のgrep文の書き方の問題なのでしょうか?
それとも、grep実行時にクリップボード上のデータが書き換わる挙動があるのでしょ
うか?

お手数ですがお力添えいただければ幸いです。よろしくお願いいたします。

[ ]
RE:09377 getclipboardとgrepの併用についNo.09378
秀丸担当 さん 21/05/20 08:43
 

マクロを試してみたところ、確かにそうなりました。
grepによって新しい秀丸エディタにマクロの実行が移るため、getclipboard();を続
けて呼んでも続きにならない状態になっていることが原因でした。
grepの行をnewfile;にしても確認できます。

beginclipboardread;とgetclipboard();の連続呼び出しは、同じ秀丸エディタ内での
み有効で、ヘルプにもそのあたりのことを書いておこうと思います。
秀丸エディタが切り替わってもできるようにするには、いったん変数に入れてからに
するといいです。
例えば、ヘルプのサンプルにあるように配列にあらかじめ入れておきます。
    beginclipboardread;
    #i = 0;
    $a[#i] = getclipboard();
    while( $a[#i] != "" ) {
        #i = #i + 1;
        $a[#i] = getclipboard();
    }
こうしておくと、この後でgrepやnewfileがあっても、$a[#i]を見ると入っているこ
とになります。

[ ]
RE:09378 getclipboardとgrepの併用についNo.09379
* さん 21/05/20 10:00
 
>beginclipboardread;とgetclipboard();の連続呼び出しは、同じ秀丸エディタ内で
>のみ有効で、ヘルプにもそのあたりのことを書いておこうと思います。

なるほど。理由が分かってすっきりしました。

>秀丸エディタが切り替わってもできるようにするには、いったん変数に入れてから
>にするといいです。
>例えば、ヘルプのサンプルにあるように配列にあらかじめ入れておきます。
>    beginclipboardread;
>    #i = 0;
>    $a[#i] = getclipboard();
>    while( $a[#i] != "" ) {
>        #i = #i + 1;
>        $a[#i] = getclipboard();
>    }
>こうしておくと、この後でgrepやnewfileがあっても、$a[#i]を見ると入っているこ
>とになります。

あらかじめ全ての配列に対して格納するように改修したら
希望通りの動作をするようになりました。ありがとうございます。

1タブにすべてのgrep結果が並ぶようにしたいので、次はそこに取り組みます。

[ ]