grep出力形式についてNo.06195
jechabon さん 10/11/01 20:06
 
お世話になります。

grep出力の本文出力開始桁位置を固定する事はできないでしょうか?

grep出力結果をBOX編集して一括置換ツール(FastPerm)で変更する
作業を多用しているのですが、ファイル名や行番号の桁数によって
本文の出力桁位置がバラバラになってしまうので、とても不便です。

本文の出力開始桁位置(ファイル名+行番号の最低出力桁数)を
固定したい(できればタブ設定の倍数にしたい)のですが、何か
良い方法はないでしょうか?

以上よろしくお願いします。

[ ]
RE:06195 grep出力形式についてNo.06196
秀丸担当 さん 10/11/02 09:54
 

grep結果を、正規表現で「^[^:]+: 」を何もなしに置換してファイル名部分を無
くすという方法はよく使われているかもしれないです。

あと、「^([^:]+: )」を「\1\t」に置換して、[表示]→[タブストップ]→[TSV
モード]にすると揃えることは一応できると思います。
ただ、grep結果内にタブ文字が含まれていたらその部分も揃ってしまうので都合
が悪いこともあるかもしれないです。

もしファイル名部分が不要であればファイル名部分を消す置換のほうがいいかも
しれません。

[ ]
RE:06196 grep出力形式についてNo.06198
jechabon さん 10/11/02 10:17
 
> grep結果を、正規表現で「^[^:]+: 」を何もなしに置換してファイル名部分を無
> くすという方法はよく使われているかもしれないです。
>
> あと、「^([^:]+: )」を「\1\t」に置換して、[表示]→[タブストップ]→[TSV
> モード]にすると揃えることは一応できると思います。

一括置換ツール(FastPerm)は、秀丸のgrep出力結果から、検索対象のファイルを
行単位で高速に書き換えるツールですので、上記方法では対応できません。
単純にファイル名と行番号の前にスペースを入れて桁を揃えたいのですが、
やはりマクロで対応するしか無いという事ですね。

FastPermは大量のファイルに対して置換するにはとても効率のよいツールです。
秀丸のgrep置換とは性格が異なり、置換前に全ての変更内容を確認してから
一気にファイルを書き換える事が出来るのでとても便利です。

桁を揃える出力オプションを是非検討お願いします。
上記ツールを使わない場合でも、視認性が格段に良くなると思います。

以上よろしくお願いします。

[ ]
RE:06198 grep出力形式についてNo.06203
秀丸担当 さん 10/11/02 13:55
 

>一括置換ツール(FastPerm)は、秀丸のgrep出力結果から、検索対象のファイルを
>行単位で高速に書き換えるツールですので、上記方法では対応できません。
>単純にファイル名と行番号の前にスペースを入れて桁を揃えたいのですが、
>やはりマクロで対応するしか無いという事ですね。

そうですか。
ファイル名を残すのであれば、TSVモードの案でもいけそうな気もします。

あと、もう一つ思いついたのですが、TSVモードの案と同じく置換をして、タブ
ストップを自由配置モードにすると内容のほうにはそれほど影響を与えずできま
した。
この方法のほうがいいかもしれません。


半角文字で桁を揃えるには、ヒットするファイル名が事前にわかって、その中で
最も長いファイル名を計算しなくてはいけないと思います。
どのファイルがヒットするかというのは検索してみなくてはわからないので、そ
うなると、結果出力後にテキストを整形するということになると思います。
そういった機能だとマクロで何らかの後処理をするのとあまり変わらないような
気がします。
また、プロポーショナルフォントの場合は意味がないというのもあります。

もしやるとしたら、出力形式にタブを使うようにして、タブストップの自由配置
モードを自動設定するようなもののほうがいいかもしれません。
そういうようなこともできたらいいということでネタとして参考にさせていただ
きます。

[ ]
RE:06203 grep出力形式についてNo.06204
jechabon さん 10/11/02 15:06
 
> ファイル名を残すのであれば、TSVモードの案でもいけそうな気もします。
>
> あと、もう一つ思いついたのですが、TSVモードの案と同じく置換をして、タブ
> ストップを自由配置モードにすると内容のほうにはそれほど影響を与えずできま
> した。

C言語のソースコードで61カラム目からコメントを揃える規定があり、
grep出力結果にて、このコメント表示位置を揃えたいのです。
また、このコメント位置を変更しないように出力結果を編集したいのです。
ソースコードはタブ(4タブ)を使用しているため、TSVだと実際のコメント
表示位置が変わってしまうので使用できません。
タブの設定を自由配置に変更した場合も同様です。

> 半角文字で桁を揃えるには、ヒットするファイル名が事前にわかって、その中で
> 最も長いファイル名を計算しなくてはいけないと思います。
> どのファイルがヒットするかというのは検索してみなくてはわからないので、そ
> うなると、結果出力後にテキストを整形するということになると思います。
> そういった機能だとマクロで何らかの後処理をするのとあまり変わらないような
> 気がします。
> また、プロポーショナルフォントの場合は意味がないというのもあります。

最大桁数は事前に把握しており、固定ピッチフォントしか使用していないので、
単純に”:”の前の最低出力桁数が設定できれば十分です。
例えば:の位置を24桁という設定ができ、24桁未満のタグ文字列の場合は
24桁になるまでスペースでパディングするという動作がベストです。

正規表現で簡単に置換出来れば問題ないのですが、良い方法が思いつきません。
マクロで対応すると、どうしても処理速度が遅くなるので、何か良い方法があれ
アドバイスお願いします。

[ ]
RE:06204 grep出力形式についてNo.06205
秀丸担当 さん 10/11/02 16:51
 

>C言語のソースコードで61カラム目からコメントを揃える規定があり、
>grep出力結果にて、このコメント表示位置を揃えたいのです。
>また、このコメント位置を変更しないように出力結果を編集したいのです。
>ソースコードはタブ(4タブ)を使用しているため、TSVだと実際のコメント
>表示位置が変わってしまうので使用できません。
>タブの設定を自由配置に変更した場合も同様です。

タブの自由配置は自由なので、先頭部分だけで24で、その後は全部4というよ
うにできると思います。
タブの自由配置はルーラーのマウス操作でもできますが、ファイルタイプ別の設
定でもできます。

例えば、何か適当にgrepして、grep結果で[その他]→[ファイルタイプ別の設定]
→[体裁]→[タブ]のところで、「自由配置」を選んで、「タブストップ(O)...」
で設定できます。
ここで「24 4」というように指定しておくと、最初が24とその後は4になりま
す。
これでいったんOKします。いったん覚えさせておけば、「4」にしておいても大
丈夫だと思います。


その後、何かgrepして、ファイル名部分にタブを含む置換をして、自由配置モー
ドにすると揃うと思います。
この操作だけマクロにしておくと楽かもしれません。

例:
  disabledraw;
  #searchoptionOrg = searchoption;
  $searchbufferOrg = searchbuffer;
  $replacebufferOrg = replacebuffer;
  replaceallfast "^([^:]+): ","\\1\\t: ",regular;
  config "xTabMode:2";
  setsearch $searchbufferOrg,#searchoptionOrg;
  setreplace $replacebufferOrg;


終わったら逆に戻すマクロの例:
  disabledraw;
  #searchoptionOrg = searchoption;
  $searchbufferOrg = searchbuffer;
  $replacebufferOrg = replacebuffer;
  replaceallfast "^([^:]+: )\t","\\1",regular;
  config "xTabMode:0";
  setsearch $searchbufferOrg,#searchoptionOrg;
  setreplace $replacebufferOrg;

[ ]
RE:06205 grep出力形式についてNo.06206
jechabon さん 10/11/02 23:34
 
> タブの自由配置は自由なので、先頭部分だけで24で、その後は全部4というよ
> うにできると思います。
> (中略)
> その後、何かgrepして、ファイル名部分にタブを含む置換をして、自由配置モー
> ドにすると揃うと思います。

なるほど、妙案ですね。早速試してみました。
grep出力専用のファイルタイプ別設定を作成しておけば、grep後、:の前にタブを
挿入し、編集マークを消去するだけのマクロで、うまくいきました。
タブを元に戻さなくてもFastPermは正しく認識してくれました。

ただ、「grepの実行」コマンドと全く同じ動作をさせる記述がわかりません。
grepdialogだと新規作成されてしまうし、grepdialog2 だと、パラメータを
指定しなければならないので、前回の検索パラメータが変更されてしまいます。
「grepの実行」コマンドと全く同じ動作をさせる記述を教えてください。

以上よろしくお願いします。

[ ]
RE:06206 grep出力形式についてNo.06208
秀丸担当 さん 10/11/04 09:37
 

>なるほど、妙案ですね。早速試してみました。
>grep出力専用のファイルタイプ別設定を作成しておけば、grep後、:の前にタブを
>挿入し、編集マークを消去するだけのマクロで、うまくいきました。
>タブを元に戻さなくてもFastPermは正しく認識してくれました。

出力形式としては内容部分にタブが一個増えただけなので認識されるとは思いま
すが、編集した内容はタブが一個増えてしまっていると思います。
もし
filename.ext(123)\t:
というようにコロンの前にタブがあっても大丈夫だとしたらそうしたほうがいい
かもしれないです。
そうなるとタブがずれるので、
filename.ext(123)\t::::
という感じでタブの後の半角文字を4文字分にするなどで対応できるかもしれま
せんが、そのあたりはマクロを参考に調整していただけたらと思います。


>ただ、「grepの実行」コマンドと全く同じ動作をさせる記述がわかりません。
>grepdialogだと新規作成されてしまうし、grepdialog2 だと、パラメータを
>指定しなければならないので、前回の検索パラメータが変更されてしまいます。
>「grepの実行」コマンドと全く同じ動作をさせる記述を教えてください。

grepの実行コマンドと同じにするには、いまのところgrepdialog2を使う方法し
かないと思います。

カーソル位置の文字列を取得する場合

$s=searchbuffer;
#f=searchoption;
getsearch;
grepdialog2 searchbuffer, grepfilebuffer, ".", searchoption;
if(result==-2){
  setsearch $s,#f;
}

とか、空欄の場合

$s=searchbuffer;
#f=searchoption;
getsearch;
grepdialog2 searchbuffer, grepfilebuffer, ".", searchoption;
if(result==-2){
  setsearch $s,#f;
}

というようにしてやるといいかもしれません。

[ ]
RE:06208 grep出力形式についてNo.06209
jechabon さん 10/11/04 10:16
 
> filename.ext(123)\t::::
> という感じでタブの後の半角文字を4文字分にするなどで対応できるかもしれま
> せんが、そのあたりはマクロを参考に調整していただけたらと思います。

はい。
タブの後に半角スペース2個を挿入して本文がタブの先頭になるようにしています。
本文のタブもズレて表示される事がなくなり、とても快適になりました。
また、grep後に桁位置を調整する事が出来るので予想以上に便利です!!


> grepの実行コマンドと同じにするには、いまのところgrepdialog2を使う方法し
> かないと思います。
>
> カーソル位置の文字列を取得する場合
>
> $s=searchbuffer;
> #f=searchoption;
> getsearch;
> grepdialog2 searchbuffer, grepfilebuffer, ".", searchoption; if(result==-2){
>   setsearch $s,#f;
> }
>
> とか、空欄の場合
>
> $s=searchbuffer;
> #f=searchoption;
> getsearch;
> grepdialog2 searchbuffer, grepfilebuffer, ".", searchoption; if(result==-2){
>   setsearch $s,#f;
> }
>
> というようにしてやるといいかもしれません。

上記の2つは同じなんですけど...
それと、マクロヘルプには「途中で中断された場合はresultは-1」と記載されて
いますが、-2はどういった場合なのでしょうか?

以上よろしくお願いします。

[ ]
RE:06209 grep出力形式についてNo.06211
秀丸担当 さん 10/11/04 10:53
 

>上記の2つは同じなんですけど...
>それと、マクロヘルプには「途中で中断された場合はresultは-1」と記載されて
>いますが、-2はどういった場合なのでしょうか?

失礼しました。
空欄の場合は
$s=searchbuffer;
#f=searchoption;
grepdialog2 "", grepfilebuffer, ".", searchoption;
if(result==-2){
  setsearch $s,#f;
}
でした。

-2は、キャンセルした場合に帰ってくる値でした。
searchdialogのほうには書かれていましたが、grepdialogのほうに書かれていま
せんでした。ヘルプに追記させていただきます。

[ ]
RE:06211 grep出力形式についてNo.06212
jechabon さん 10/11/04 11:05
 
> 空欄の場合は
> $s=searchbuffer;
> #f=searchoption;
> grepdialog2 "", grepfilebuffer, ".", searchoption; if(result==-2){
>   setsearch $s,#f;
> }
> でした。
>
> -2は、キャンセルした場合に帰ってくる値でした。
> searchdialogのほうには書かれていましたが、grepdialogのほうに書かれていま
> せんでした。ヘルプに追記させていただきます。

ありがとうございます。
grepコマンドを以下のマクロに置き換えることで、とても使いやすくなりました。



// _grep.mac
//  grep出力結果にtab挿入して桁位置を揃える。
//  ファイルタイプ別の設定リストに'grep'を追加し、
//  タブを自由配置(24 4)にしておく。

#hwnd = hidemaruhandle(0);
$s = searchbuffer;
#f = searchoption;
getsearch;
grepdialog2 searchbuffer, grepfilebuffer, ".", searchoption;

// grepキャンセル時の処理
if( result == -2 ){
    setsearch $s, #f;
    endmacro;
}

// grep出力ウィンドウチェック
if( #hwnd == hidemaruhandle(0) )
    endmacro;
if( filetype != "grep" )
    endmacro;

// タブ挿入
disabledraw;
#searchoptionOrg = searchoption;
$searchbufferOrg = searchbuffer;
$replacebufferOrg = replacebuffer;
replaceallfast "^([^:]+): ","\\1\\t  : ", regular;
setsearch $searchbufferOrg, #searchoptionOrg;
setreplace $replacebufferOrg;

clearupdated;   // 編集マーク消去
gofiletop;      // ファイル先頭

endmacro;

[ ]