1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

サクラエディタのマクロで同一画面内で複数回連続Grepする方法

Posted at

###必要な要件
サクラエディタ 2.2.0.0 以上

##自画面にGrep結果を連続表示
サクラエディタの標準マクロでGrepを記録して再生すると「新規ウィンドウが開いて」そしてその新しいウィンドウでGrepが実行されます。
しかし、往々にして、マクロを実行した自分自身の画面内で複数回のGrepを実行したいときがあります。

サクラエディタには、標準出力にGrep結果を吐き出すオプション(-GOPT=U)が ver 2.2.0.0 で追加されました。
ちなみに2019年9月3日時点でのインストーラー版の最新バージョンは2015年の2.2.0.1です。
これを応用することで、同一画面内で複数回Grepのマクロが実現できます。
なお、何回もサクラエディタを立ち上げる関係で画面がバタバタします。

sample_grep_macro.js
var sakura = 'C:\\Program Files (x86)\\sakura\\sakura.exe';

var keys = ['検索キー1', '二つ目のキー', '3つ目のキー'];
var file = '*.txt';
var folder = 'C:\\Users\\Username\\Documents\\sample';
var option = 'P2'; // P:行を表示、2:ファイル毎
for(var i = 0; i < keys.length; ++i){
    ExecCommand('"' + sakura + '" -CODE=3 -GREPMODE -GCODE=99 -GOPT=U' +
        option + ' -GKEY="'+ keys[i] +'" -GFILE="' + file +
        '" -GFOLDER="'+ folder +'"', 11);	// 外部コマンド実行
}

-CODE=3を指定することで、出力をUTF-16(サクラでいうUnicode)にしているところがポイントです。
ExecCommandのオプションで0x8を加算して、UTF-16に合わせてあります。
11 = 0x01 + 0x02 + 0x08です。
Grepのオプションについては、ヘルプのコマンドラインオプションを読んでください。
Grepマクロとオプションの形式が異なり、いちいち読み替えが面倒ですが、これは我慢するほかありません。
https://sakura-editor.github.io/help/HLP000109.html

SJISではSJISにない文字が文字化けします。
UTF-8は2.3.1.0で修正されるまでExecCommandでの取り込みで文字化けすることが稀にあります。
そのためここではUTF-16を指定しています。
https://sourceforge.net/p/sakura-editor/patchunicode/1077/

##Grep結果をアウトプットにまとめて表示
場合によっては「自分のウィンドウではなく、Grepみたいに新規ウィンドウを立ち上げてそちらでまとめてほしい」という場合もあります。
しかしサクラエディタではマクロから通常他のウィンドウを操作することができません。
その代わりですがExecCommandのオプションを 0x01 + 0x08 = 9 を使うと、アウトプットウィンドウにGrep結果をまとめて貼り付けられます。
今度はアウトプットのヘッダーとフッダーが余分なのでマクロ用オプション 0x40(ヘッダー・フッダー情報を出力しない)を追加しまして、9 + 0x40 = 73を指定するといいです。
ActivateWinOutputがないと2つのサクラエディタを同時に起動しようとして応答なしになる場合があるようなので、追加してあります。

sample_grep_macro_output.js
var sakura = 'C:\\Program Files (x86)\\sakura\\sakura.exe';

var keys = ['検索キー1', '二つ目のキー', '3つ目のキー'];
var file = '*.txt';
var folder = 'C:\\Users\\Username\\Documents\\sample';
var option = 'P2'; // P:行を表示、2:ファイル毎
ActivateWinOutput();
for(var i = 0; i < keys.length; ++i){
    ExecCommand('"' + sakura + '" -CODE=3 -GREPMODE -GCODE=99 -GOPT=U' +
        option + ' -GKEY="'+ keys[i] +'" -GFILE="' + file +
        '" -GFOLDER="'+ folder +'"', 73);	// 外部コマンド実行
}
ActivateWinOutput();

もしオプションや対象フォルダを個別に指定して検索したいなら、必要な分だけExecCommandを並べてそれぞれ必要な文字列を修正しましょう。

##注意点
ExecCommandの引数は、ExpandParameterの展開を行うので、検索文字列に$fなどがあると、置換されてしまいうまくいきません。
$$$とエスケープして指定します。

##そもそもの話
もし単純に、複数の単語で、その結果が混ざっていてもいいなら、正規表現で検索したほうが速いです。
| を使ってkey1|key2|key3とキーワードを連結して検索すればOKです。
そうすれば、一度に検索できます。
もしくは最近のバージョンであれば、正規表現以外に「単語単位検索」を使うと単語単位でかつ複数の単語を一度にOR検索できます。

Grep対象のファイルの拡張子が複数ある場合は、*.txt;*.htmlのように半角スペースか , または ; で区切れば複数種類指定できます。
除外ファイルは ! を先頭につけて!*.logのようにします。
除外サブフォルダは同様に「ファイル」のところに先頭に#をつけて#.gitのようにします。
それらを並べて合わせて、ファイルで*.txt *.html #.git #.svn*.* !*.log #.svnのように指定します。
このように指定を細かくすれば、複数回だったものを1回にまとめることもそれなりにできます。

Grep対象のフォルダが複数に分かれている場合は、;で区切って複数指定できます。わざわざ複数回Grepする必要はなくなりました。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?