前回、表記スタイル等のチェックをするのに、秀丸マクロの searchdialog ではなく、grep を使うようにしたという話を書きました。
これは、対象となるファイル数が多いときに、1 つずつ秀丸で開いて検索するのが面倒だから、という理由でした。しかし、今度は検索する文字列が多い場合に、いくつも秀丸が開いてしまうという問題にぶつかりました。^^;
前回の例では、1 つのマクロ内に grep 文が 2 つだったのですが、検索するワードが多い場合、grep 文が 20 個、30個となってしまいます。
特に、search では、検索文字列の上限が 4095 文字なのですが、なぜか grep では 249 文字になるようです (search で 4095 文字まで OK だったので、同じ文字列を grep で使ったら、エラーで動かなくなりました)。秀丸マクロの注意書きには、「安全なマクロを作るうえでは、249文字までとしてください。」とあるので、理由は不明ですが、249 文字以下とすべきなのでしょう。
今回マクロ化しようしたのは、外来語のカタカナ表記の正誤表で、それなりの数があります。一度に検索できればよいのですが、検索文字列が 249 文字以下となるようにすると、grep 文を 30 回以上繰り返すことになってしまいました。
もちろん、このリストを全部マクロ化する必要があるのかという疑問はあるかもしれませんが、訳文を入力している最中に、「この単語は一覧表にあったかな?」などとイチイチ気にしていられませんから、やはりマクロにしておいて、最後に一気に検索する方が早いです。
そこで、今度は、
1) ファイル内で指定した語句を検索するマクロを作る
2) 指定したフォルダ内のすべてのファイルに対して、上記のマクロを実行するマクロを作る
という 2 段階の構成を考えました。
2) において、検索文字列にヒットしなかったら、そのファイルを閉じ、ヒットしたら、ファイルを開いたままにする、という構成にしておけば、不要なファイルがいくつも開いたままになるという問題もなくなります。さらに、開いたままのファイルに対して、1) のマクロをもう一度、実行することで、ヒットした語句を再確認することもできます。
具体的には、次のようになりました。
1) ファイル内の検索マクロ
----------------------------------------
$retval = "ok";
$str = "検索語句1|検索語句2|・・・・・";
searchdown $str, nocasesense, regular, hilight, masktag, loop;
if( result == 0 ) {
// message "該当するものがありません";
} else {
$retval = "ng";
question "次に進みますか?";
if( result == no ) {
endmacro $retval;
}
}
$str = "検索語句11|検索語句12|・・・・・";
searchdown $str, nocasesense, regular, hilight, masktag, loop;
(以下、上と同様。必要なだけ繰り返す。最後の if 文だけ下記のようにする)
if( result == 0 ) {
// message "該当するものがありません";
endmacro $retval;
} else {
$retval = "ng";
endmacro $retval;
}
----------------------------------------
※検索語句にヒットしたかどうかを戻り値で返すようにしておきます。
※この場合は、検索語句にヒットしなかったら、"ok" です。
2) 指定したフォルダ内のすべてのファイルに 1) のマクロを実行
----------------------------------------
// フォルダ内の .xml ファイルのリストを作成
grepdialog2 ".", "*.xml", ".", regular, filelist;
if(result<1) endmacro;
// 現在の秀丸のハンドルを保持
#grep = hidemaruhandle(0);
// リストの各項目について実行
gofiletop;
while(lineno < linecount2) {
// リストにあるファイルを開く
tagjump;
#handle = hidemaruhandle(0);
// マクロの実行
execmacro "上記 1) のマクロの名前";
// 戻り値を確認
$ret = getresultex(-1);
// 元の秀丸をアクティブにして、今の秀丸を閉じる
// 必要であれば、今の秀丸も残す
setactivehidemaru #grep;
if( $ret == "ok" ) {
closehidemaru #handle;
}
// Shift キーで途中終了
if(iskeydown(16)) break;
// 次の項目へ
movetolineno 1,lineno+1;
}
----------------------------------------
一回これを作っておけば、別の検索マクロも簡単に作れそうです。
03 | 2025/04 | 05 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
とりあえず、安定して翻訳の仕事を貰えるようになりましたが、まだまだ駆け出しです。胸をはって「翻訳家です」と言えるまで、日夜修行中(?)の身です。
趣味は音楽鑑賞と城めぐり。月平均 1 回以上のライブと登城がエネルギー源です!