複数ファイルまとめて全置換マクロNo.00613
Byrd さん 99/06/22 09:33
 

はじめまして。
Byrdと申します。

秀丸マクロ集001に入っていた
以下のマクロを愛用させていただいていますが、
このマクロは同一のフォルダに入ったファイルだけしか
開けないので困っています。

ホームページなどで、複雑な構造のフォルダにたくさんの
ファイルが入っている場合にも使えるとありがたいのですが。
このマクロの改良版がどこかにあったら教えてください。

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

         Byrd

********************

// 複数ファイルまとめて全置換マクロ
// multirep.mac
//  このマクロは、まずgrepで置換元となる文字列を検索させて、そのgrepの結果で
//  一度全置換を実行し、その後このマクロを実行することによって、実際のファイ
// ル内の該当個所を置換していくものです。
// ファイル名に括弧が含まれている場合は使えません。
//
//  使い方
//    − grepを実行する
//    − grepした秀丸の中で全置換を実行する
//    − このmultirep.macを実行する
//
// このマクロは多少危険なので、全置換する前のファイルをバックアップしてから
// 実行することをおすすめします。

#home = hidemaruhandle(0);
#width = windowwidth;
#height = windowheight;
$filenamePrev = "";
setwindowsize 1,1;
gofiletop;
Loop:
#x = x; #y = y;
golineend2;
$s = gettext( #x, #y, x, y );
if( strlen($s) > 4000 ) {
message "エラー: 1行の長さが長すぎて処理できません。";
goto Exit;
}
#kakko = strstr( $s, "(" );
#kakkoend = strstr( $s, ")" );
if( #kakko < 0 || #kakkoEnd < 0 ) {
message "エラー: 括弧が見つかりませんでした。";
goto Exit;
}
$filename = leftstr( $s, #kakko );
#lineno = val( midstr( $s, #kakko + 1, #kakkoend - #kakko - 1 ) );
if( #lineno <= 0 ) {
message "エラー: 行番号の取得に失敗しました。";
goto Exit;
}
$s = midstr( $s, #kakkoend + 3, 4000 );
if( $filenamePrev != ""
 && $filename != $filenamePrev ) {
call ClosePrevFile;
}
#handle = findhidemaru( $filename );
if( #handle < 0 ) {
openfile $filename;
if( filename != $filename && basename != $filename ) {
message "エラー: ファイル" + $filename + "が開けませんでした。";
goto Exit;
}
} else {
setactivehidemaru hidemaruorder(#handle);
}
movetolineno 1, #lineno;
if( lineno != #lineno ) {
message "エラー: 行が見つかりません。";
goto Exit;
}
beginsel;
golineend2;
delete;
insertfix $s;
setactivehidemaru hidemaruorder(#home);
$filenamePrev = $filename;
down;
if( code == eof ) {
message "正常終了";
goto Exit;
}
golinetop2;
goto Loop;

Exit:
setactivehidemaru hidemaruorder(#home);
setwindowsize #width, #height;
endmacro;

ClosePrevFile:
setactivehidemaru findhidemaru( $filenamePrev );
##prevfile = hidemaruhandle(0);
if( updated ) {
question $filenamePrev + ": 保存してもいいですか?(保存しない場合はマクロは
中断します)";
if( result == yes ) {
save;
} else {
goto Exit;
}
}
setactivehidemaru hidemaruorder(#handle);
closehidemaru hidemaruorder(##prevfile);
return;


[ ]
RE:00613 複数ファイルまとめて全置換マクNo.00614
番頭++ さん 99/06/22 12:16
 
>このマクロは同一のフォルダに入ったファイルだけしか
>開けないので困っています。

このマクロの作者ではありませんが、
grep の時に「サブフォルダも検索」を指定すると、
出来ませんか ???

処理したい、サブフォルダがいろいろなところにあるときには、
処理を分けるしかありません。grep の問題でしょう。


[ ]
RE:00614 複数ファイルまとめて全置換マクNo.00615
Byrd さん 99/06/22 21:53
 

番頭++さん、こんにちは。

コメントをありがとうございました。

>>このマクロは同一のフォルダに入ったファイルだけしか
>>開けないので困っています。
>
>このマクロの作者ではありませんが、
>grep の時に「サブフォルダも検索」を指定すると、
>出来ませんか ???

説明が足りませんでしたが、
grep の時に「サブフォルダも検索」を指定すると、
うまくいきません。

私が何度か試してみた結果ですが、
このマクロを使うためには grep の時に
「サブフォルダも検索」をオフにしている
必要があるようです。

サブフォルダの中も一度に grep して
このマクロを使える方がずっと便利です。

実は自分ではごく簡単なマクロしか作れません。
openfile $filename;
のあたりを書き換える必要があるのかな…?
とは思うのですが、それ以上はちんぷんかんぷんです。

ご教示いただければ幸いです。

       Byrd

[ ]
RE:00615 複数ファイルまとめて全置換マクNo.00616
杉浦 まさき さん 99/06/23 00:26
 
Byrd さん、はじめまして。
杉浦 まさき と申します。

このマクロは grep 結果ウィンドウからファイル名を取得して
それを openfile に渡しているんですが、
その時にフルパスで渡すように変更すればサブフォルダの場合でも
大丈夫なようです。

具体的には、最初の $filename への代入文

$filename = leftstr( $s, #kakko );



$filename = directory2 + "\\" + leftstr( $s, #kakko );

に替え、ファイルを開いた後のチェックの所

openfile $filename;
if( filename != $filename && basename != $filename ) {



openfile "\"" + $filename + "\""; // 空白を含んでも大丈夫
if( filename2 != $filename ) {

に変えるだけでとりあえず(^^;動作すると思いますよ。

#directory2/filename2 を使うのは、grep の結果表示に
 合わせるためです。詳しくはマクロヘルプをご覧ください。


[ ]
RE:00616 複数ファイルまとめて全置換マクNo.00617
番頭++ さん 99/06/23 12:57
 
杉浦 まさき さん、

こんにちは、
また勘違いをしていました。

マクロの先頭で、
$directory2 = directory2;
をいれて、

$filename = $directory2 + "\\" + leftstr( $s, #kakko );

のほうが安定しませんか ???

> openfile "\"" + $filename + "\""; // 空白を含んでも大丈夫

そうそう思い出しました、以前に、
どなたから、あちきのマクロが動かないと言われました。


[ ]
RE:00616 複数ファイルまとめて全置換マクNo.00619
Byrd さん 99/06/23 23:52
 

杉浦 まさき さん、こんにちは。

アドバイスをありがとうございました。
教えていただいたとおりに書き換えたら
うまくいきました。
なぜか最後に開くファイルだけ保存されませんが、
全保存終了をするので気になりません。

このマクロを使うと特定のコードではじまる
エラーメッセージだけ抜き出して編集し
元のファイルに上書きするのが
とても簡単になります。
本当にありがとうございました。

なお後でわかったことですが、
おーなーしぇふさん作の秀丸用マクロ、
コントロールdeエンター Ver.3.0(未公開)にも
同様な機能が含まれているようです。

       Byrd

[ ]
RE:00617 複数ファイルまとめて全置換マクNo.00620
杉浦 まさき さん 99/06/23 23:53
 
番頭++ さん、こんばんは。
杉浦 まさき です。

>マクロの先頭で、
>$directory2 = directory2;
>をいれて、
>
>$filename = $directory2 + "\\" + leftstr( $s, #kakko );
>
>のほうが安定しませんか ???

そっちの方が確実でしょうね、多分。

#ところでこのマクロですが、最後に開いたファイルは
 保存するかどうか聞いてこないんですねぇ…。
 一瞬、修正の影響かと思って焦ってしまいました(^^;。


[ ]
RE:00619 複数ファイルまとめて全置換マクNo.00621
杉浦 まさき さん 99/06/24 00:00
 
Byrd さん、こんばんは。
杉浦 まさき です。

#ほぼ同時刻の書き込みですね(^^;。

>なぜか最後に開くファイルだけ保存されませんが、
>全保存終了をするので気になりません。

あれ??…ってことは、直した所の影響が出てるんでしょうか??
#う〜ん、そんなはずはないと思いますが…??

>なお後でわかったことですが、
>おーなーしぇふさん作の秀丸用マクロ、
>コントロールdeエンター Ver.3.0(未公開)にも
>同様な機能が含まれているようです。

あらら…というわけで、
でしゃばってごめんなさいでしたm(_ _)m。>おーなーしぇふさん


[ ]