ブロック検索マクロNo.07659
でがらし さん 15/08/31 20:52
 
1.秀丸のGREPでブロック検索のできるマクロを探しています。ひょっとしてブロッ
ク検索用のマクロ、あるいはその部品として使えそうなコードをお持ちの方があれば、
ちょうだいできないでしょうか? ブロック検索の定義は下記の通りです。

 (1)ブロックはデリミタ(境界を示す論理行)で囲まれた範囲。#をデリミタと
すると、次の3つ:@#に囲まれた範囲(#から次の#の直前まで:下記に例示)、
Aファイル冒頭から最初の#の直前まで、B最後の#からファイル末尾まで。

---------------------------------------
#      ─┐
 あいうえお  │
 かきくけこ  │←ブロックの範囲
 さしすせそ  │
       ─┘

 たちつてと
 なにぬねの
---------------------------------------

 (2)検索対象の文字列が1以上含まれているブロックを検索し、そのブロックを
出力する。上記の例で「くけ」を検索すると、下記を出力する。

---------------------------------------
C:\A\A.TXT (34):

 あいうえお
 かきくけこ
 さしすせそ

---------------------------------------

2.デリミタとして利用しているのは、#のほか、「・‥・・・・」(Emmettさん作のVZ
エディター用マクロ codex 形式のデリミタ)です。2文字目が2バイト文字です。

 デリミタは固定し、(マクロの中のデリミタを変更して)デリミタごとに別のマク
ロを利用することを希望しています。そのほうが、マクロ起動時にデリミタを選択す
るより、打鍵数が減ります。

3.通常の検索には、汎用のマクロと下記のようなフォルダ狙い撃ちのマクロを利用
しています。これらのマクロに組み込むコードを考え付くことができませんでした。

---------------------------------------
$a = input("検索する文字列を入力して下さい");
 if( result == 0 ) endmacro;  //キャンセルなら終了
grep $a, "*.*", "C:\\A", icon;
endmacro;
---------------------------------------

4.Iranoanさんのgrep拡張マクロにブロック検索機能がありますが、うまく動きま
せん。現在は起動すると『マクロの式で、「!」、「&&」、「||」のうちの2種類以
上をカッコで囲まずに並べて使うことは推奨されません。マクロの修正をお勧めしま
す。』という警告が出ますが、この警告が出る前から動きませんでした。

 小林玉來さんがご提供の新蓑系カード用のマクロ一式(hidemaru_mynote_beta_01
1)の中に、ブロック検索をするものがありそうですが、新蓑系カードを使っていな
いので、試したことがありません。

 arakenさんご提供のフリーソフトのQGREPがブロック検索の機能を持っています。
秀丸からQGREPのブロック検索を行うマクロを書いて使っていましたが、ときどき、
ブロックにヒットしないことが判明しました。理由は不明です。現在は利用を中止し
ています。

5.Windows7とWindows8で、秀丸8.54を利用しています。

[ ]
RE:07659 ブロック検索マクロNo.07662
山紫水明 さん 15/09/01 20:37
 
 でがらしさん,

 次のように,グレップで出したファイルリストを一つ一つ処理していく方法し
か思いつきません。参考になればと思います。
//-----------------------------------------------------
$delimiter = "#";
$folder = "C:\\A";
$a = input("検索する文字列を入力して下さい");
if( result == 0 ) endmacro;  //キャンセルなら終了
#main = hidemaruhandle(0);
setcompatiblemode 0x000c;
grep $a, "*.*", $folder, filelist;
if( result == 0 ) {
    message "該当なし";
    quit;
}
replaceallfast "\\([0-9]+\\)", "", regular;
#grephandle = hidemaruhandle(0);
gofiletop;
#i = 1;
while( code != eof ) {
    $file = $folder + "\\" + gettext2( 0, lineno, linelen2, lineno );
    call Sub;
    #i = #i + 1;
    moveto2 0, lineno + 1;
}
setactivehidemaru #rep;
closehidemaruforced #grephandle;
endmacro;

Sub:
openfile "/h " + $file;
disabledraw;
#object = hidemaruhandle(0);
gofiletop;
searchdown2 "^" + $delimiter, regular;
beginsel;
searchdown "^" + $delimiter, regular;
rangeeditin;
searchdown $a, loop;
if( result ){
    selectall;
    copy;
    if( #i == 1 ) {
        openfile "/h";
        #rep = hidemaruhandle(0);
    } else setactivehidemaru #rep;
    insert $file + "\n";
    paste;
    gofileend;
    insert "\n\n";
    setactivehidemaru #object;
}
rangeeditout;
setactivehidemaru #grephandle;
closehidemaru #object;
return;
//-----------------------------------------------------

                    山紫水明
                    SANSHISUIMEI

[ ]
RE:07659 ブロック検索マクロNo.07663
Iranoan さん 15/09/01 21:33
 
今日は Iranoan です。
On Mon, Aug 31, 2015 at 08:52:39PM +0900, でがらし wrote:
> 4.Iranoanさんのgrep拡張マクロにブロック検索機能がありますが、うまく動きま
> せん。現在は起動すると『マクロの式で、「!」、「&&」、「||」のうちの2種類以
> 上をカッコで囲まずに並べて使うことは推奨されません。マクロの修正をお勧めしま
> す。』という警告が出ますが、この警告が出る前から動きませんでした。
このメッセージについては、厳密にはエラーではなく警告に成ります。
昔、この警告が無かった頃にこのマクロを作ったので、こんなことになっています。

先に書いた通り、文法エラーではないので、「動作環境」→「トラブル対策」の
「マクロで「!」、「||」、「&&」を並べて使っても警告を出さない」を ON にす
れば出なくなります。

マクロを書き換えると良いのでしょうが、
・どこが該当する行なのか解らなかった(^_^;;
・メイン PC の OS を Linux にしてしまったので、現在秀丸を常用していない
ということで…。

[ ]
RE:07662 1個のファイルで成功No.07664
でがらし さん 15/09/01 22:16
 
 山紫水明さん、お久しぶりです。

 お作りいただいたマクロで、1個のファイルを対象にしたときは、ブロック検索に
成功しました。ただ、あるフォルダに入れている171個のファイルの全体を対象に
すると、ブロック検索の結果が出ません。ファイル名が列挙されて、検索作業がずっ
と続くようです。秀丸が裏で開くファイル数に制約されているのかと思います。少し
考えてみます。

 いつもながらのご教示、ありがとうございます。

[ ]
RE:07663 最初の警告はなくなりましたNo.07665
でがらし さん 15/09/01 22:25
 
 Iranoanさん、こんばんわ。

 ご教示に従って「動作環境」の部分を変えたら、あの警告は出なくなりましたが、
今度は「DLL機能の利用が出来ませんでした。マクロを終了します。」と出ました。D
LLの設定を変えたら、この警告も出なくなりそうですが、出先のパソコンを使ってい
るので、設定を変えるのは先になりそうです。

 秀丸のバージョンアップで最初の警告が出るようになる前も、Iranoanさんお作り
のマクロがうまく動かなかったので、残念な思いをしました。手を入れることができ
るかと思ってコードを見ましたが、私にはとてもむずかしかったです。

 わざわざのレス、ありがとうございました。

[ ]
RE:07665 最初の警告はなくなりましたNo.07666
Iranoan さん 15/09/01 22:41
 
今日は Iranoan です。
On Tue, Sep 01, 2015 at 10:25:45PM +0900, でがらし wrote:
>  ご教示に従って「動作環境」の部分を変えたら、あの警告は出なくなりましたが、
> 今度は「DLL機能の利用が出来ませんでした。マクロを終了します。」と出ました。D
> LLの設定を変えたら、この警告も出なくなりそうですが、出先のパソコンを使ってい
> るので、設定を変えるのは先になりそうです。
このメッセージが出るということは、
・マクロ
・田楽 DLL
のどちらか一方もしくは両方が古いということはありませんか?

[ ]
RE:07664 1個のファイルで成功No.07667
山紫水明 さん 15/09/01 22:46
 
 でがらしさん,

 私のところでは10個程のファイルでテストしただけです。どのくらいのファイ
ル数までだったらできるのか,調べていただけたらと思います。

                    山紫水明

[ ]
RE:07664 1個のファイルで成功No.07670
山紫水明 さん 15/09/02 17:56
 
 でがらしさん,

 少し手を入れてみました。
//-----------------------------------------------------
$delimiter = "#";
$folder = "C:\\A";
$a = input("検索する文字列を入力して下さい");
if( result == 0 ) endmacro;  //キャンセルなら終了
menu "&1 冒頭から最初の区切り線まで",
     "&2 区切り線で囲まれた範囲",
     "&3 最後の区切り線からファイル末尾まで";
#part = result;
#start = tickcount;
#main = hidemaruhandle(0);
setcompatiblemode 0x003c;
title "実行中・・・";
grep $a, "*.*", $folder, filelist;
if( result == 0 ) {
    message "該当なし";
    quit;
}
showwindow 0;
replaceallfast "\\([0-9]+\\)", "", regular;
#grephandle = hidemaruhandle(0);
gofiletop;
#i = 1;
while( code != eof ) {
    $file[#i] = $folder + "\\" + gettext2( 0, lineno, linelen2, lineno );
    #i = #i + 1;
    moveto2 0, lineno + 1;
}
#num = #i;//ファイル数
#i = 1;
while( #i < #num ) {
   call Sub;
   #i = #i + 1;
}
setactivehidemaru #rep;
closehidemaru #object;
closehidemaruforced #grephandle;
clearupdated;
gofiletop;
#time = tickcount - #start;
showwindow 1;
message "検索ファイル数:" + str(#num) + "\n" + str(#time / 1000) + " 秒 "
+ str(#time % 1000);
endmacro;

Sub:
openfile "/h " + $file[#i];
disabledraw;
closehidemaru #object;
#object = hidemaruhandle(0);
if(  #part == 1 ) {
    gofiletop;
    beginsel;
    searchdown "^" + $delimiter, regular;
    if( !result ) {
        escape;
        return;
    }
} else if( #part == 2 ) {
    gofiletop;
    searchdown2 "^" + $delimiter, regular;
    if( !result ) return;
    beginsel;
    searchdown "^" + $delimiter, regular;
    if( !result ) {
        escape;
        return;
    }
} else {
    gofileend;
    beginsel;
    searchup "^" + $delimiter, regular;
    if( !result ) {
        escape;
        return;
    }
}
rangeeditin;
searchdown $a, loop;
if( result ){
    selectall;
    copy;
    if( #i == 1 ) {
        openfile "/h";
        insert "【「" + $a  + "」の検索結果】\n";
        #rep = hidemaruhandle(0);
    } else setactivehidemaru #rep;
    insert $file[#i] + "\n";
    paste;
    gofileend;
    insert "\n\n";
    setactivehidemaru #object;
}
rangeeditout;
return;
//-----------------------------------------------------

                    山紫水明

[ ]
RE:07666 dll機能の警告が出ますNo.07671
でがらし さん 15/09/02 19:49
 
1.Iranoanさんのgrep拡張マクロは最新版です。念のため、Iranoanさんのサイトか
らDLして確認しました。説明書中、下記の「その他」タブの部分がどこかわからな
かったので、「Unicodeを使用可能にする」と「全ての文字コード」はONになってい
ませんが、それ以外は説明書通りにしているはずです。

---------------------------------------
●●5.2 ファイルタイプ別の設定
(6)出力が UNICODE の場合があるので、「その他」タブを選択し、「Unicodeを使用
可能にする」「全ての文字コード」を ON にしてください。
---------------------------------------

2.田楽は最新版でなかったので、最新版に変更しました。

3.この状態でgrep.macを起動すると、やはり、「DLL機能の利用が出来ませんでし
た。マクロを終了します。」と出てきます。不思議です。なお、TKinfo.dllも、今回、
組み込みました。

[ ]
RE:07670 テスト報告:不調No.07672
でがらし さん 15/09/02 19:51
 
 こちらからご報告を差し上げる前に、新たなバージョンを作っていただいて恐縮で
す。このバージョンでテストしました。

 ともに、S-JISで変換できない文字があったという警告が出て、そのたびに、その
文字にジャンプするか、無視するのボタンを押しました。これが結果に影響している
かもしれません。

1.84個のファイルがあるフォルダで、「#」をデリミタとして検索しました。2
(区切り線で囲まれた範囲)を選択肢としました。37秒かかり、3つのファイルが
編集中マークがついて開かれましたが、通常のgrepファイルは現れませんでした。

2.171個のファイルがあるフォルダで、「・‥・・・・」をデリミタとして検索しま
した。2(区切り線で囲まれた範囲)を選択肢としました。127秒かかり、1つの
ファイルが編集中マークがついて開かれましたが、通常のgrepファイルは現れません
でした。

3.別件ですが、下記のメニューは必要でしょうか? これがあると打鍵数が増える
ので、どの部分も検索対象にするのが便利そうに思います。

menu "&1 冒頭から最初の区切り線まで",
     "&2 区切り線で囲まれた範囲",
     "&3 最後の区切り線からファイル末尾まで";

[ ]
RE:07670 20個のファイルでテスト:不調No.07673
でがらし さん 15/09/02 20:02
 
 20個のファイルのフォルダでテストしました。合計で、1,196,009 バイトです。

   デリミタは「・‥・・・・」です。2(区切り線で囲まれた範囲)を選択肢としまし
た。検索語は「Japan」で、通常のgrepでは150くらいのヒット数になります。2
9秒かかり、1つのファイルが、今度は、編集中マークなしで開かれましたが、通常
のgrepファイルは現れませんでした。

[ ]
RE:07672 テスト報告:不調No.07674
山紫水明 さん 15/09/02 22:34
 
 でがらしさん,

> ともに、S-JISで変換できない文字があったという警告が出て、そのたびに、
>その文字にジャンプするか、無視するのボタンを押しました。これが結果に影
>響しているかもしれません。

 検索語の中にS-JISに変換できない文字があったのでしょうか?
>
>1.84個のファイルがあるフォルダで、「#」をデリミタとして検索しまし
>た。2(区切り線で囲まれた範囲)を選択肢としました。37秒かかり、3つのファ
>イルが編集中マークがついて開かれましたが、通常のgrepファイルは現れませ
>んでした。

 このマクロは検索対象の文字列が含まれるファイルをまずgrepのfilelistオプ
ションで選び出し,そこで示されるファイルについて一つずつブロック内に検索
語が存在するかどうかを調べています。通常のgrepは行っていませんので,grep
結果ファイルは当然現れないわけです。
 ファイル内に検索語が存在していても,それがブロック内になければ,対象外
になりますが,期待されていることと違うのでしょうか。

>3.別件ですが、下記のメニューは必要でしょうか? これがあると打鍵数が増える
>ので、どの部分も検索対象にするのが便利そうに思います。
>menu "&1 冒頭から最初の区切り線まで",
>     "&2 区切り線で囲まれた範囲",
>     "&3 最後の区切り線からファイル末尾まで";

 最初のご要望で
> (1)ブロックはデリミタ(境界を示す論理行)で囲まれた範囲。#をデリ
>ミタと>すると、次の3つ:@#に囲まれた範囲(#から次の#の直前まで:下
>記に例示)、>Aファイル冒頭から最初の#の直前まで、B最後の#からファイ
>ル末尾まで。
ということでしたの,そのようにしたつもりですが,誤解でしょうか。「どの部分も
検索対象にする」ということは,結局ブロックを無視するということでしょうか。そ
れとも「@#に囲まれた範囲」だけでよいということでしょうか。

> 20個のファイルのフォルダでテストしました。合計で、1,196,009 バイトです。
>   デリミタは「・‥・・・・」です。2(区切り線で囲まれた範囲)を選択肢としまし
>た。検索語は「Japan」で、通常のgrepでは150くらいのヒット数になります。2
>9秒かかり、1つのファイルが、今度は、編集中マークなしで開かれましたが、通常
>のgrepファイルは現れませんでした。

 通常のgrepでは150くらいのヒット数になっても,それがブロック内になければ,
除外されますので,そういう結果になることもあり得ます。ただし,マクロの欠陥の
ために,とりこぼしがある可能性は否定できませんが。

                    山紫水明

[ ]
RE:07674 正確な希望No.07675
でがらし さん 15/09/03 08:49
 
 山紫水明さん、おはようございます。レス、ありがとうございます。順に回答を記
載します。

=======================================

 検索語の中にS-JISに変換できない文字があったのでしょうか?

1.検索語はJapanなどの単純な単語にしました。S-JISに変換できない文字は入って
いません。

=======================================

 このマクロは検索対象の文字列が含まれるファイルをまずgrepのfilelistオプショ
ンで選び出し,そこで示されるファイルについて一つずつブロック内に検索語が存在
するかどうかを調べています。通常のgrepは行っていませんので,grep結果ファイル
は当然現れないわけです。
 ファイル内に検索語が存在していても,それがブロック内になければ,対象外にな
りますが,期待されていることと違うのでしょうか。

2.この件、了解です。grepをかけるので、grepファイルが出現すると想像していま
した。検索語のある論理行だけでなく、検索語のあるブロックを検索のが希望です。

=======================================

 最初のご要望で・・・ということでしたの,そのようにしたつもりですが,誤解で
しょうか。「どの部分も検索対象にする」ということは,結局ブロックを無視すると
いうことでしょうか。それとも「@#に囲まれた範囲」だけでよいということでしょ
うか。

3.ご理解が正確です。それが私の希望です。例を挙げます。下記のファイルで#を
デリミタとして、ABCを検索します。ついでながら、この手の連番を振るとき、よ
く山紫水明さんの連番マクロを使わせてもらっています。

ファイル冒頭---------------------------------------

ABC
あいうえお

# 1
DCE
かきくけこ

# 2
ABC
さしすせそ

# 3
FGH
たちつてと

# 4
ABC
なにぬねの

# 5
IJK
はひふへほ

# 6
ABC
まみむめも

ファイル末尾---------------------------------------

 下記が希望する検索結果です。これを一回のマクロ検索で行えると便利です。

ファイル冒頭---------------------------------------

ABC
あいうえお

# 2
ABC
さしすせそ

# 4
ABC
なにぬねの

# 6
ABC
まみむめも

ファイル末尾---------------------------------------

=======================================

 通常のgrepでは150くらいのヒット数になっても,それがブロック内になければ,
除外されますので,そういう結果になることもあり得ます。ただし,マクロの欠陥の
ために,とりこぼしがある可能性は否定できませんが。

4.この件、了解です。ただ、ファイルはデリミタによって多数のカードに分割して
おり、Japanはほとんど、どこかのカードに所属するので、相当数が出現するはずだ
と予想しました。

[ ]
RE:07671 dll機能の警告が出ますNo.07676
Iranoan さん 15/09/03 13:43
 
On Wed, Sep 02, 2015 at 07:49:51PM +0900, でがらし wrote:
> 3.この状態でgrep.macを起動すると、やはり、「DLL機能の利用が出来ませんでし
> た。マクロを終了します。」と出てきます。不思議です。なお、TKinfo.dllも、今
>回、
> 組み込みました。
Linux の VirtualBox の仮想環境上の Windows7 (64 bit) に新規にインストールして
確認しました。入れたのは秀丸エディタ Ver.8.54 (32 bit) 通常版+田楽 DLL Ver.3.22
です。

しかし上記のエラーは出ませんね???
標準から変えた設定は、マクロや設定ファイルの保存先と、行番号方法の表示程度な
ので
すが…。

件の !, ||, && の警告については、確認できたので、差し替えておきました。

[ ]
RE:07676 秀丸メールを使っていないせいかNo.07677
でがらし さん 15/09/03 20:39
 
 私も秀丸エディタ Ver.8.54 (32 bit) 通常版+田楽 DLL Ver.3.22です。Iranoan
さんのgrepマクロはgrep121.zipから解凍したものです。

 今回はgrep.macにTKinfo.dllの記述があったので、秀丸メールの中から、このdll
だけを秀丸のフォルダに入れたんですが、秀丸メールの中にある他のdllが必要だっ
てことがあるんでしょうか? 

 Linuxで秀丸が動くのはうれしいですね。当分、Windowsから逃れられそうにありま
せんが、いずれ、Linuxに移行するかもしれません。

[ ]
RE:07675 正確な希望No.07678
山紫水明 さん 15/09/03 20:46
 
 でがらしさん,

 どうも完全に理解が違っていたようです。
 私はすべてのファイルが3つのブロックに区切られているというい前提で考え
ていましたが,実際にはもっと多くのブロックに区切られているのですね。
 ご要望のことは拙作マクロ「前後行・行渡り検索・結果強調Grepマクロ」
にむしろ近いのかもしれません。一つ一つファイルを開いて処理する以外に思い
つきませんので,マクロでやる場合,ファイル数が多いと時間もかかることにな
り,瞬時に結果が出るというわけにはいかないでしょう。
 それで,例として D:\Temp\test というフォルダにFile1,Fle2,File3の3つ
のファイルがあり,内容はすべて例示されたものと同じとします。検索語をAB
Cとして実行した場合,ファイル名の表示も含めて,最終的にどのような出力結
果を期待されるのでしょうか。

                    山紫水明

[ ]
RE:07677 秀丸メールを使っていないせいかNo.07679
Iranoan さん 15/09/03 21:16
 
On Thu, Sep 03, 2015 at 08:39:57PM +0900, でがらし wrote:
>  今回はgrep.macにTKinfo.dllの記述があったので、秀丸メールの中から、このdll
> だけを秀丸のフォルダに入れたんですが、秀丸メールの中にある他のdllが必要だっ
> てことがあるんでしょうか?
必要ないはずです。
今回のテストでは、秀丸メールのインストールはしていないので、Tkinfo.dll
はずです。
また秀丸メールをインストールした場合は、秀丸エディタのマクロで
Tkinfo.dll を使おうとすると、その秀丸メールをインストールしたフォルダも
調べる仕様で、秀丸エディタをインストールしたフォルダへのコピーは無用だっ
たと思います。

DLL 関数が上手く働かない件については、VirtualStore の関係で失敗している
ということはないですかね。このあたり、実際には別のフォルダにコピーされて
いた時に、どういう扱いになるのか詳しいことは知らないのですが。

[ ]
RE:07678 出力結果の希望No.07680
でがらし さん 15/09/03 22:41
 
1.File1.txtを例に取ると、希望するのは下記のような出力です。ブロックの位置
情報とブロックそのものの出力です。「----」の線はブロックの区切りを示すための
区切り線です。QGREPではこのような区切り線で出力間の区切りをつけていました。

=======================================
D:\Temp\test\File1.txt(1)
ABC
あいうえお

---------------------------------------
D:\Temp\test\File1.txt(8)
# 2
ABC
さしすせそ

---------------------------------------
D:\Temp\test\File1.txt(16)
# 4
ABC
なにぬねの

---------------------------------------
D:\Temp\test\File1.txt(24)
# 6
ABC
まみむめも
=======================================

2.私も山紫水明さんのレスを拝見して、大量のブロック検索を秀丸のマクロで行う
のは現実的でないかもしれないと考え始めていました。ちなみに、私がテストした1
0個のファイルには、合計で629個のブロックがあります。

 あんまりお手数をかけるのは恐縮です。ご参照の前後行用のgrepマクロでかなりの
用は足せそうなので、ブロック検索用のマクロが現実的でなければ、どうぞ、ご失念
下さい。

 VZエディターにはブロック検索のマクロがあったはずです。あの時代にはブロッ
ク検索ができるgrepがいくつかあり、それをVZから立ち上げて使えるようにもして
いました。今はマシンパワーが上がりましたが、一方で、昔、簡単にできたことが簡
単にできなくなりました。ときどき、DOSの時代が恋しくなります。

[ ]
RE:07679 Virtual Storeは初耳でNo.07681
でがらし さん 15/09/03 22:52
 
 この件、了解です。秀丸はCドライブに入れていますが、今回は秀丸メールをDド
ライブに解凍して、そこからTkinfo.dllだけを秀丸フォルダへ移していました。

 Virtual Storeの件、初耳でした。ウェブで検索して、別件ですが、思い当たる節
がありました。別のフォルダに保存したはずのファイルが秀丸フォルダに入っている
ことが何度かあったのです。dllがそれに影響されているのか、よくわかりません。

 勉強になりました。ありがとうございました。

[ ]
RE:07680 出力結果の希望No.07682
colder さん 15/09/04 00:09
 
colderです
通常のGREPの出力結果を希望するような形式に変換するマクロを作ってみました
実行中は画面が少し画面がちらつきます。
ブロック検索を行うマクロではありませんが、希望する出力は得られると思います

setcompatiblemode 0x00000100;
//grepdialog;
$delim = "#";
while(code != eof){
tagjump;
searchup "^"+$delim, regular;
if(!result) gofiletop;
$file = filename;
#line = lineno;
beginlinesel;
finddown
if(!result) gofileend;
endsel;
$text = gettext2(seltopcolumn, seltoplineno, selendcolumn, selendlineno);
#handle = hidemaruhandle(0);
backtagjump;
closehidemaru #handle;
deleteline2;
insert $file+"("+str(#line)+")\n";
insert $text;
insert "---------------------------------------\n";
}

[ ]
RE:07682 テスト結果No.07683
でがらし さん 15/09/04 19:47
 
colderさん、こんばんは。思いがけないご助力、ありがとうございます。

1.山紫水明さんとのやりとりで使ったFile1.TXTでテストしました。希望通りの出
力を得ました。

2.他のファイルでテストしたところ、同じ検索語がブロックの中に複数存在してい
ると、その回数だけ、同一のブロックを出力するようです。たとえば、File1.TXTで
「# 2」で始まるブロックにABCを2つ置いて検索すると、下記のようにこのブ
ロックを2回出力します。

=======================================
d:\z\temp\file1.txt(1)
ABC
あいうえお

---------------------------------------
d:\z\temp\file1.txt(8)
# 2
ABC
ABC
さしすせそ

---------------------------------------
d:\z\temp\file1.txt(8)
# 2
ABC
ABC
さしすせそ

---------------------------------------
d:\z\temp\file1.txt(17)
# 4
ABC
なにぬねの

---------------------------------------
d:\z\temp\file1.txt(25)
# 6
ABC
まみむめも
---------------------------------------
=======================================

3.たくさんのファイルを入れているフォルダで試して見たところ、検索出力を得る
のに相当の時間がかかりました。編集中の小さなファイルで利用するのには向いてい
ると思いますが、それぞれに100個くらいのブロックを持っている数百個のファイ
ルを一括して力任せに検索するのは、やはり、秀丸ベースのマクロでは無理があると
考えるに至りました。

 はるかにマシンパワーが劣っていたVz時代には、充分、実用になるマクロがあっ
たのですが、今の時代にそれができないのは不思議でもあり、残念でもあります。

 まずはご助力にお礼まで申し上げます。お手間をかけさせたことと思います。まこ
とにありがとうございました。

[ ]
RE:07680 出力結果の希望No.07684
山紫水明 さん 15/09/04 21:24
 
 でがらしさん,

 colder さんがすでに別の簡明な方法を出されていますが,乗りかかった船と
いうこともあり,こちらの方も少し変えてみました。

//-----------------------------------------------------
$delimiter = "#";
$folder = "D:\\Temp\\Test";
$a = input("検索する文字列を入力して下さい");
if( result == 0 ) endmacro;  //キャンセルなら終了
$a = "ABC";
#start = tickcount;
setcompatiblemode 0x0002203c;
title "実行中・・・";
grep $a, "*.*", $folder, filelist;
if( result == 0 ) {
    message "該当なし";
    quit;
}
showwindow 0;
replaceallfast "\\([0-9]+\\)", "", regular;
#grephandle = hidemaruhandle(0);
gofiletop;
#i = 1;
while( code != eof ) {
    $file[#i] = $folder + "\\" + gettext2( 0, lineno, linelen2, lineno );
    #i = #i + 1;
    moveto2 0, lineno + 1;
}
#num = #i;//ファイル数
#i = 1;
openfile "/h";//結果表示用
#rephandle = hidemaruhandle(0);
while( #i < #num ) {
    openfile "/h " + $file[#i];
    disabledraw;
    if( #i > 1 ) closehidemaru #object;
    #object = hidemaruhandle(0);
    call Sub;
    setactivehidemaru #rephandle;
    paste;
    #i = #i + 1;
}
setactivehidemaru #rep;
closehidemaru #object;
closehidemaruforced #grephandle;
clearupdated;
gofiletop;
#time = tickcount - #start;
showwindow 1;
message "検索ファイル数:" + str(#num) + "\n" + str(#time / 1000) + " 秒 "
+ str(#time % 1000);
endmacro;

Sub:
gofiletop;
##j = 1;
$file = filename2;
disabledraw;
setclipboard "";
while( 1 ) {
    beginsel;
    searchdown "^" + $delimiter, regular;
    if( !result ) {
        gofileend;
        ##stop = 1;
    }
    ##last = lineno;
    rangeeditin;
    searchdown $a, loop;
    if( result ) {
        addclipboard $file + "(" + str(##last2) + ")\n";
        selectall;
        appendcopy;
        addclipboard "--------------------------\n";
    }
    rangeeditout;
    if( ##stop == 1 ) break;
    moveto2 0, ##last;
    ##last2 = ##last;
    ##j = ##j + 1;
}
return;
//-----------------------------------------------------

                    山紫水明

[ ]
RE:07682 出力結果の希望No.07685
山紫水明 さん 15/09/04 21:33
 
 colderさん,

 ずいぶん昔(多分10年以上前)tagjump と backtagjump を繰り返してファイ
ル間を何度も行き来すると,とりこぼしがの恐れがあるというような話題があり
ました。
 それ以降,その方法をなんとなく忌避してきましたが,今では秀丸エディタの
性能も上がっているので,そういう心配は杞憂かもしれませんね。

                    山紫水明

[ ]
RE:07684 所定ファイルで成功:ただNo.07686
でがらし さん 15/09/04 21:49
 
1.テストしました。前のマクロより速く検索できました。ただ、上のほうで、$aが
ダブっています。後のほうはいらないでしょうか? 下記です。

>$a = input("検索する文字列を入力して下さい");
>if( result == 0 ) endmacro;  //キャンセルなら終了
>$a = "ABC";

2.ついでにおわかりでしたらお教え下さい。ブロック検索とは別の話ですが、この
マクロを起動する前は全画面で表示しているのに、検索が終わると、画面が小さくな
ります。他の検索関係マクロでもそうなることがあるんですが、grep出力画面ではそ
うなるような仕組みがあるでしょうか?

[ ]
RE:07683 テスト結果No.07687
colder さん 15/09/04 22:09
 
>2.他のファイルでテストしたところ、同じ検索語がブロックの中に複数存在して
>いると、その回数だけ、同一のブロックを出力するようです。
やはり、気になりますか。手抜きしていました。

>3.たくさんのファイルを入れているフォルダで試して見たところ、検索出力を得
>るのに相当の時間がかかりました。
少しだけ高速化しました。

setcompatiblemode 0x00000100;
//grepdialog;
$delim = "#";
while(code != eof){
  searchdown2 "^(.:)?[^:\n]+?\\([0-9]+\\):",regular;
  $$xfile = gettext(foundtopx,foundtopy,foundendx,foundendy);
  $$xfile = leftstr($$xfile, strrstr($$xfile,"("));
  if($$xfile != $$file){
      $$file = $$xfile;
      ##xline = 1;
      if(##handle != 0){
          closehidemaruforced ##handle;
          ##handle = 0;
      }
  }
  tagjump;
  searchup "^"+$delim, regular;
  if(!result) gofiletop;
  if($file != filename || #line != lineno){
      #skip = 0;
      $file = filename;
      #line = lineno;
      beginlinesel;
      finddown
      if(!result) gofileend;
      endsel;
      $text = gettext2(seltopcolumn, seltoplineno, selendcolumn, selendlineno);
      if(##handle == 0)
        ##handle = hidemaruhandle(0);
  }
  else #skip = 1;
  backtagjump;
  deleteline2;
  if(!#skip){
      insert $file+"("+str(#line)+")\n";
      insert $text;
      insert "---------------------------------------\n";
  }
}
closehidemaru ##handle;

[ ]
RE:07686 所定ファイルで成功:ただNo.07688
山紫水明 さん 15/09/04 22:10
 
 でがらしさん,

>1.テストしました。前のマクロより速く検索できました。ただ、上のほうで、
>$aがダブっています。後のほうはいらないでしょうか?

 テストするとき,いちいち入力するのが面倒なので書いておいたのを消し忘れ
ました。

>2.ついでにおわかりでしたらお教え下さい。ブロック検索とは別の話ですが、この
>マクロを起動する前は全画面で表示しているのに、検索が終わると、画面が小さくな
>ります。他の検索関係マクロでもそうなることがあるんですが、grep出力画面ではそ
>うなるような仕組みがあるでしょうか?

 動作環境の設定に関係するのかもわかりませんが,マクロの44行目程の
showwindow 1; を showwindow 3; に変えたらいいかもしれません。

                    山紫水明

[ ]
RE:07685 出力結果の希望No.07689
colder さん 15/09/04 22:11
 
山紫水明さん
> ずいぶん昔(多分10年以上前)tagjump と backtagjump を繰り返してファイ
>ル間を何度も行き来すると,とりこぼしがの恐れがあるというような話題があり
>ました。
そんな問題があったのですか。知りませんでした。

[ ]
RE:07688 showwindow 3に変えて、全画面維No.07690
でがらし さん 15/09/04 22:44
 
 showwindow 3に変えて、全画面を維持することができました。

 ブロック検索をマクロで行うためには、ずいぶん、複雑な処理をしなければならな
いことに思い当たりませんで、皆様がたにお手間を取らせました。まことに恐縮です。
Vzにはそのためのマクロがありましたから、秀丸のマクロでも、この手の検索がで
きそうなものだと思ったのが間違いでした。外部のGREPを呼び出して使えるとい
いんですが、Windows時代のGREPには、ブロック検索機能を持ったものがほとん
どないのが残念です。今回はこれまでにします。

 お相手いただきまして、ありがとうございました。

[ ]
RE:07687 高速化確認No.07691
でがらし さん 15/09/04 22:52
 
 およそ4万バイトのファイルでテストしました。前のバージョンよりはるかに高速
化していることを確認しました。パソコンが一所懸命働いているのがわかって感心し
ます。これくらいのスピードがあると、充分、役に立ちますね。

 ありがとうございました。

[ ]