再grepNo.32443
Y_H さん 13/07/18 10:30
 
8.31を使わせていただいています。

grepを実行して一覧が表示されたウィンドウに対して、
検索結果の再構築(同じウィンドウ内でその条件で再grep)を行う
というようなことはできませんでしょうか。

もし現状ではそのような動作がなくても、
マクロなどで実現可能であれば、ご教授いただければと思います。
よろしくお願いいたします。

[ ]
RE:32443 再grepNo.32445
秀丸担当 さん 13/07/18 14:43
 

grep結果に対してのgrepは、「検索するファイル」のところを「(現在の内容)」
にすると、絞込みを行うような感じでgrepができます。

ただその場合、通常では、新しいウィンドウができてしまいます。
「出力先」のところを「単一」にしておくと、同じウィンドウに出ることになり
ますが、どうでしょうか。

[ ]
RE:32445 再grepNo.32446
Y_H さん 13/07/18 15:24
 
> grep結果に対してのgrepは、「検索するファイル」のところを「(現在の内容)」
> にすると、絞込みを行うような感じでgrepができます。

回答いただきありがとうございます。

すみません、絞り込み動作とはちょっと違いまして、
あくまで再検索ができないかなと思っています
(編集したものが新たに出てくることもあるので)。

感覚的には、ブラウザやファイラなどの「最新の情報に更新」です。
タイトルバーに検索条件が出ているようなので、
内部で必要な情報は持っているのかなと思い、
それならば再検索を実行できるのではと質問させていただきました。

現状ではマクロなどでも無理ということであれば、
あくまで個人的要望となってしまいますので、ご検討いただける程度でも構いません。

たとえば、「再読み込み」のコマンドは、現状ではgrep結果のウィンドウでは
無効になっているようなので、このときに再検索を実行するとか、
そのような動作があると嬉しいです。

よろしくお願いいたします。

[ ]
RE:32446 再grepNo.32447
秀丸担当 さん 13/07/18 16:46
 

grep結果はgrepしたときの各種条件は保持していなくて、現状ではそのままでは
できないと思います。
マクロでするとしたらgrepした直後の状態を一時的に記憶する仕組みも用意する
必要性が出てくると思います。

最後に使われている検索文字列の強調や検索条件や、grep対象を元にある程度は
類推する以下の様な感じで一応できると思います。
ただ結果内で検索したり別のgrepを行うと最後の状態が変化して厳密ではなくな
ります。

例:
setcompatiblemode 0x20000;
if( filetype=="grep"){
  if(leftstr(grepfilebuffer,1)!="\x01"){
    question foundbuffer+"でgrepし直します";
    if(result!=false){
      closenew;
      grep foundbuffer, grepfilebuffer, directory, foundoption;
    }
  }
}
endmacro;


こういうマクロを作ろうとするときに1つ重要な注意しなくてはいけない問題を
見つけました。
grepfilebufferは「(現在の内容)」で検索したときは先頭文字が"\x01"になりま
すが、これをそのままgrep文に渡してしまうと、"\x01"の次にある文字列が作業
用の一時ファイルと判断されて削除されてしまいました。
"\x01"の場合はgrep文に渡さないか、localgrepに切り替える必要がありました。
念のためgrep文で"\x01"が指定されているときはエラー扱いとなるよに次のバー
ジョンで修正します。

[ ]
RE:32447 再grepNo.32448
Y_H さん 13/07/18 21:21
 
> grepしたときの各種条件は保持していなくて、
> 現状ではそのままではできないと思います。

条件そのものを保持しているわけではないのですか。
だとすると現状では再検索は無理ですね。
了解しました。

> ただ結果内で検索したり別のgrepを行うと最後の状態が変化して
> 厳密ではなくなります。

マクロ例ありがとうございます。
参考にさせていただきます。

grep結果のウィンドウごとに検索条件を保持して、
「再読み込み」などのコマンドに再検索の動作を持たせる、という要望も、
お時間のあるときに追加機能として検討いただければと思います。

[ ]
RE:32446 再grepNo.32449
山紫水明 さん 13/07/18 21:30
 
 Y_Hさん,

 grep 結果は grep したときの各種条件は保持していないそうなので,その条件
を grep 結果に直接書き込んで保持するという方法もあるかもしれません。
 次のマクロはその一例です。通常の grep も再grepもこのマクロで行います。
//---------------------------------
if( filetype == "grep" ) {
    gofiletop;
    $foundbuffer = gettext(0, 0, linelen, 0);
    down;
    $grepfilebuffer = gettext(0, 1, linelen, 1);
    down;
    $directory = gettext(0, 2, linelen, 2);
    down;
    $foundoption = gettext(0, 3, linelen, 3);
    if( leftstr(grepfilebuffer,1) != "\x01" ){
        closenew;
        grep $foundbuffer, $grepfilebuffer, $directory, val($foundoption);
    } else endmacro;
} else {
    grepdialog;
}
gofiletop;
insert foundbuffer + "\n" + grepfilebuffer + "\n" + directory + "\n"
       + str(foundoption) + "\n" + "-----------------------------\n";
clearupdated;
endmacro;
//---------------------------------

                          山紫水明
                          SANSHISUIMEI

[ ]
RE:32449 再grepNo.32451
Y_H さん 13/07/19 10:10
 
> 次のマクロはその一例です。通常の grep も再grepもこのマクロで行います。

さっそく使わせていただきました。
すごいですね。

なお、grep結果のウィンドウ上にフォーカスがあるときに
他のgrepを開始したいケースもあるので、
"grepdialog"以下の部分のみのマクロを現在のgrep実行キーに割り当てて、
こちらは再検索専用マクロとして使い分けるようにしてみようと思います。

ありがとうございます。

[ ]
RE:32448 再grepNo.32452
秀丸担当 さん 13/07/19 11:33
 

>grep結果のウィンドウごとに検索条件を保持して、
>「再読み込み」などのコマンドに再検索の動作を持たせる、という要望も、
>お時間のあるときに追加機能として検討いただければと思います。

秀丸エディタの機能として、再読み込みで同じ条件で再検索もできたらいいとい
うことで、ご意見参考にさせていただきます。

[ ]
RE:32451 再grepNo.32460
山紫水明 さん 13/07/19 21:56
 
 Y_Hさん,

>なお、grep結果のウィンドウ上にフォーカスがあるときに
>他のgrepを開始したいケースもあるので、

 複数のgrep結果ウィンドウは想定していましたが,こちらは想定していません
でした。二つのマクロを使い分ける方法もありますが,次のようにするのも一方
法です。
 それから,(現在の内容)でのグレップはマクロのダイアログではそもそもで
きませんので,少し修正してみました。ご参考までに。

//---------------------------------
if( filetype == "grep" ) {
    menu "&1 更 新",
         "&2 別のGrep";
    if( result == 2 ) {
        grepdialog;
        if( result == -2 ) quit; //キャンセル時
    } else {
        gofiletop;
        $foundbuffer = gettext(0, 0, linelen, 0);
        down;
        $grepfilebuffer = gettext(0, 1, linelen, 1);
        down;
        $directory = gettext(0, 2, linelen, 2);
        down;
        $foundoption = gettext(0, 3, linelen, 3);
        closenew;
        grep $foundbuffer, $grepfilebuffer, $directory, val($foundoption);
    }
} else {
    grepdialog;
    if( grepfilebuffer == "(現在の内容)" ) {
        message "現在の内容でのgrepはできません。";
        quit;
    }
}
gofiletop;
insert foundbuffer + "\n" + grepfilebuffer + "\n" + directory + "\n"
       + str(foundoption) + "\n" + "-----------------------------\n";
clearupdated;
endmacro;
//---------------------------------

                          山紫水明
                          SANSHISUIMEI

[ ]
RE:32460 再grepNo.32468
Y_H さん 13/07/22 12:13
 
> 複数のgrep結果ウィンドウは想定していましたが,こちらは想定していません
>でした。二つのマクロを使い分ける方法もありますが,次のようにするのも一方
>法です。

ありがとうございます。
こちらも利用させていただきます。

[ ]