(要望)grepを特定のフォルダ群のみ行いNo.34868
MT さん 16/02/20 18:18
 
秀丸担当者 様

 grepに、以下の機能を提案したく今回お邪魔させていただきました。

 「あらかじめ検索対象にする複数フォルダを、ユーザが名前をつけて登録しておけ
ば、grepの際にその登録名を指定すれば、登録したフォルダのみgrepする」

 例えば C:\temp, C:\Users, D:\temp, …… を、「AAAフォルダ」という名前で
あらかじめ登録しておいて、grepのときに検索するフォルダとして「AAAフォル
ダ」を指定すれば、C:\temp, C:\Users, D:\temp, …… のみgrepする、という機能
です。

 マクロでもある程度実現は可能かと存しますが、「大文字小文字」「正規表現」
「単語の検索」などのオプションの切り替えのことを考えますと、秀丸の標準機能と
して実装して頂いたほうがいいのかなと考えました。

もちろん「サブフォルダも検索」がオン時は、登録したフォルダのサブフォルダも検
索してほしいです。
登録したフォルダにそのサブフォルダがあると二重検索になってしまいますので、そ
の場合は自動的に二重検索にならないように動いて頂ければありがたいですが、まあ
これはユーザの責任なので、そこまで面倒見切れないようでしたら二重検索してしま
う、でも構わないと存じます。

また、登録できる個数も、できれば上限なしがありがたいですが、無理なら多少大き
めに上限をつけていただけるとありがたいです。


それか、マクロの、ユーザが文字列入力する関数 input() を拡張して、文字列入力
を促すダイアログに、マクロ作成者が任意のオプションチェックボックスを追加でき
るようにして頂けるなら、上記機能はマクロで実装可能となりますので、そのような
方向でもかまいません。


もし上記のような機能が従来の機能で実現できますのであれば、方法をご教授頂けれ
ばありがたく存じます。
以上、どうかよろしくお願いいたします。

[ ]
RE:34868 (要望)grepを特定のフォルダ群No.34869
でるもんたいいじま さん 16/02/20 18:57
 
こんにちは。秀丸ユーザの「でるもんた・いいじま」です。

>  grepに、以下の機能を提案したく今回お邪魔させていただきました。
>  「あらかじめ検索対象にする複数フォルダを、ユーザが名前をつけて
> 登録しておけば、grepの際にその登録名を指定すれば、登録したフォルダのみ
> grepする」
>
>  例えば C:\temp, C:\Users, D:\temp, …… を、「AAAフォルダ」という
> 名前であらかじめ登録しておいて、grepのときに検索するフォルダとして
> 「AAAフォルダ」を指定すれば、C:\temp, C:\Users, D:\temp, ……
> のみgrepする、という機能です。

マクロがお分かりになるとのこと。
grepdialog2 という、そのものずばりの文があります。

「AAAフォルダ」の他に「BBBフォルダ」「CCCフォルダ」…を
あとから追加したくなるでしょうから、たとえば
 1.menu系の文で対象フォルダを選ばせる
 2.選ばせたフォルダ群をパラメータに与えてgrepdialog2を起動する
というマクロを書いてしまうのがいいと思います。

[ ]
RE:34869 (要望)grepを特定のフォルダ群No.34871
MT さん 16/02/21 20:59
 
でるもんた・いいじま 様
コメントをいただきましてありがとうございます。

>grepdialog2 という、そのものずばりの文があります。
>
>「AAAフォルダ」の他に「BBBフォルダ」「CCCフォルダ」…を
>あとから追加したくなるでしょうから、たとえば
> 1.menu系の文で対象フォルダを選ばせる
> 2.選ばせたフォルダ群をパラメータに与えてgrepdialog2を起動する
>というマクロを書いてしまうのがいいと思います。

教えていただいた grepdialog2 を早速調べてみましたが、この関数では複数フォル
ダの同時指定は可能なのでしょうか?
ヘルプにはその旨の記述は見当たりませんし、秀丸のgrepの仕様ではフォルダはひと
つしか指定できないので、おそらくこの関数も同仕様かと思うのですが…

それなら複数フォルダをひとつずつgrepdialog2を呼べばよいというお話になろうか
と思いますが、検索対象の文字列はinput文で指定すればいいというのはともかく、
ダイアログが出るたびに「大文字・小文字」「単語の検索」「正規表現」を毎回指定
しないといけないというのは……
まあ、それらも、input文で文字列入力するようにすればよいということになるのか
もしれませんが……うーん。

秀丸のgrepが、複数フォルダ指定可ということになればgrepdialog2という解でOKか
と思うのですが……

[ ]
RE:34871 (要望)grepを特定のフォルダ群No.34872
でるもんたいいじま さん 16/02/21 21:39
 
でるもんた・いいじまです。お騒がせして申し訳ありません。

>>grepdialog2 という、そのものずばりの文があります。
>>
>>「AAAフォルダ」の他に「BBBフォルダ」「CCCフォルダ」…を
>>あとから追加したくなるでしょうから、たとえば
>> 1.menu系の文で対象フォルダを選ばせる
>> 2.選ばせたフォルダ群をパラメータに与えてgrepdialog2を起動する
>>というマクロを書いてしまうのがいいと思います。
>
> 教えていただいた grepdialog2 を早速調べてみましたが、
> この関数では複数フォルダの同時指定は可能なのでしょうか?
> ヘルプにはその旨の記述は見当たりませんし、
> 秀丸のgrepの仕様ではフォルダはひとつしか指定できないので、
> おそらくこの関数も同仕様かと思うのですが…

確認しました。てっきり、秀丸のgrepが複数フォルダに対応しているのかと
思い込んでいましたが、違ったんですはね。

> それなら複数フォルダをひとつずつgrepdialog2を呼べばよいという
> お話になろうかと思いますが、
...
> ダイアログが出るたびに「大文字・小文字」「単語の検索」「正規表現」を
> 毎回指定しないといけないというのは……

初回に設定したら(これはinput系よりもmenuarrayで実装するほうが
いいでしょう)、設定完了後にsetsearchで設定し、そのあとは
2のつかないほうのgrepdialogで起動、ということでどうでしょうか。

> 秀丸のgrepが、複数フォルダ指定可ということになれば
> grepdialog2という解でOKかと思うのですが……

結局そうなりますね。これは私からも要望したいです。

[ ]
RE:34872 (要望)grepを特定のフォルダ群No.34873
MAD さん 16/02/22 11:09
 
検索用のフォルダを作ってそこにジャンクションやシンボリックリンクを入れてやれ
ばいいんじゃないでしょうか?

[ ]
RE:34873 (要望)grepを特定のフォルダ群No.34875
秀丸担当 さん 16/02/22 15:35
 

grepの対象フォルダに、複数のフォルダを同時に書くことはできないです。
できたらいいということで今後のネタにしたいと思います。

現状でマクロでやるとしたら、grepを複数回呼ぶようなマクロになると思います
が、確かに入力ダイアログは面倒なことになると思います。
または、MADさんが言われるように、シンボリックリンクを作成するツールなど
を使って、フォルダのシンボリックリンクを作っておくことで無理矢理なんとか
することは可能だと思います。

[ ]
RE:34875 (要望)grepを特定のフォルダ群No.34876
MT さん 16/02/22 19:02
 
でるもんたいいじま様
MAD様
秀丸担当様
コメントありがとうございます。

>または、MADさんが言われるように、シンボリックリンクを作成するツールなど
>を使って、フォルダのシンボリックリンクを作っておくことで無理矢理なんとか
>することは可能だと思います。

シンボリックリンクという手がありましたね。気がつきませんでした。
当面はそれでしのごうと思います。
ただ、やはり秀丸から複数フォルダを選択できれば便利ですので、今後に期待したい
と思います。

コメントしていただいた皆様ありがとうございました。

[ ]
RE:34875 (要望)grepを特定のフォルダ群No.34879
colder さん 16/02/23 14:30
 
colderです

複数回GREPする場合、出力先を自動にしておかないと、
前回の出力結果が新しいGREPの出力で上書きされてしまうので、
出力先を自動にしておかないといけないのですが、
この場合、出力するウィンドウ(またはタブ)が複数できるので、
あまり見やすくないです。
なので、便乗での要望になりますが、出力方法に前回のGREPの出力先に
追加出力するようなオプションを付けるようなことはできないでしょうか?

[ ]
RE:34879 (要望)grepを特定のフォルダ群No.34880
秀丸担当 さん 16/02/23 15:55
 

マクロ用のオプションとして、追加出力ができたらマクロが作りやすくなると思
います。
通常の操作でできたほうがいいということであれば、フルパス限定にするか、カ
レントフォルダが変わらないとき限定になると思います。
カレントフォルダが変わらないときというのは、複数のフォルダという目的から
すると意味が無いので、フルパス限定しかなさそうです。
マクロ専用オプションであればやりやすいですが、どうでしょうか。

[ ]
RE:34880 (要望)grepを特定のフォルダ群No.34882
colder さん 16/02/23 16:52
 
はい。マクロ専用オプションで十分です。
よろしくお願いします。

[ ]
RE:34882 (要望)grepを特定のフォルダ群No.34884
秀丸担当 さん 16/02/23 17:57
 

ではマクロ専用オプションとして検討したいと思います。

[ ]
RE:34876 (要望)grepを特定のフォルダ群No.34889
山紫水明 さん 16/02/23 19:59
 
 MTさん,

 とりあえず次のようなマクロではどうでしょう。
 グループ名やフォルダは適宜書き換えてください。

//--------- FoderGroupGrep.mac ---------------------------------------//
//// フォルダグループの設定 //////////////////////
//  グループ数,グループに含まれるフォルダ数にとくに制限はありません。
//  フォルダ名は「;」で区切ります。

#groupnum = 3;  // フォルダグループの数
//グループ名
$GropuName[1] = "AAA";
$GropuName[2] = "BBB";
$GropuName[3] = "CCC";
//グループに含まれるフォルダ
$FolderGroup[1] = "C:\\AAA\\abc;C:AAA\\acd1;C:\\ABC\\abcd";
$FolderGroup[2] = "D:\\BBB\\bcd;C:\\BBB\\cde2;C:CDE\\dfr4";
$FolderGroup[3] = "E:\\CCC\\rfg;D:\\CCC\\wert4;C:\\tyuf56o\\tghjk";
//////////////////////////////////////////////////

$GropuName[0] = "グループの選択";
menuarray $GropuName, #groupnum + 1;
#r = result - 1;
if( #r < 1 ) endmacro;
call Divide $FolderGroup[#r];
#num = ##return;
grepdialog2 "", grepfilebuffer, $folder[1], searchoption | 0x400;
if( result < 0 ) endmacro;
#grepmain = hidemaruhandle(0);
$word = searchbuffer;
#searchoption = searchoption | 0x400;
$searchfile = grepfilebuffer;
#num = 3;
#i = 2;
while( #i <= #num ) {
    grep $word, $searchfile, $folder[#i], #searchoption;
    #greptemp = hidemaruhandle(0);
    disableinvert;
    selectall;
    copy;
    setactivehidemaru #grepmain;
    gofileend;
    paste;
    closehidemaru #greptemp;
    #i = #i + 1;
}
clearupdated;
endmacro;

Divide: //区切られた文字列を分解する
$$s = $$1;
##i = 1;
while( 1 ) {
    ##m = strstr( $$s, ";" );
    $$a = leftstr( $$s, ##m );
    if( ##m < 0 ) $$a = $$s;
    $folder[##i] = $$a;
    if( ##m < 0 ) break;
    $$s = midstr( $$s, ##m + 1 );
    ##i = ##i + 1;
}
return ##i;
//-----------------------------

                    山紫水明
                    SANSHISUIMEI

[ ]