GREPの結果表示についてNo.39335
styth さん 21/11/08 08:43
 
 GREPの結果表示は、ファイル名順に並んでいます。これを、更新日順に表示す
るということは出来ないでしょうか?
 同じようなルーチンを書きたい(コピーしたい)時に、コード、キーワード等
で、検索しますが、最近のものを使いたいので、新しいものが上の方にあると、
便利だと思います。

 それと、GREPの検索履歴の表示個数を自分で変えられるようにして頂きたいのです
が、
https://www.maruo.co.jp/hidesoft/2/x39272_.html#39272
 で申し上げるのを忘れていました。

[ ]
RE:39335 GREPの結果表示についてNo.39336
秀丸担当 さん 21/11/08 16:34
 
grep結果を更新日時順にすることは不可能ではないと思いますが、ちょっと調べてみ
たところでは、grepの方式は設定によって内部的にマルチスレッドの場合や従来方式
やサブフォルダなど幾つかあって、安定性を考えると簡単ではなさそうでした。
そういうネタとして参考にさせていただきます。

現状でやるとしたら、いったん出力したgrep結果をマクロで並べ替えるとなんとかす
ることはできそうではあります。
例えば、特定のファイルの更新日時を取得するとしたら、FileSystemObjectを使って
以下のような感じで取得できます。
$file=@"c:\folder\test.txt";
#fso=createobject("Scripting.FileSystemObject");
#fo=member(#fso,"GetFile",$file);
message member(#fo,"DateLastModified");
endmacro;
行頭にソートしたい要素を挿入して、ソートしてから行頭の要素を削除とすれば任意
の並べ順にできるのではないかと思います。

grepダイアログとgrepして置換ダイアログの検索文字列と置換文字列は、個数の設定
は適用されていませんでした。
同じ設定を適用するように修正します。

[ ]
RE:39336 GREPの結果表示についてNo.39337
秀丸担当 さん 21/11/08 17:58
 
試しにマクロを作ってみようかと思ってみてやってみたのですが、結果がすごい多い
場合は速度が実用的ではありませんでした
やっぱり本体の機能かオプションとしてあったほうがよさそうです。
一応手元では動作しているのですが、安定性に心配があるのでV9.00ですぐにはやら
ず将来的な反映にしようと思います。

[ ]
RE:39337 GREPの結果表示についてNo.39338
でるもんたいいじま さん 21/11/08 19:31
 
でるもんた・いいじまです。

> 試しにマクロを作ってみようかと思ってみてやってみたのですが、
> 結果がすごい多い場合は速度が実用的ではありませんでした

ご参考までに、実際、どのくらいのヒット数を対象にベンチマークして、所要時間は
どのくらいだったのでしょうか?順序としては下記の順序で問題なさそうですが、ど
のあたりがボトルネックになったのでしょうか?

@grepの出力を1行ずつ見ながら、ファイルが変わるごとにGetFile().DateLastModif
ied して、各行頭に挿入。同じファイルのヒットが多数行連続する想定であれば、1
ファイル分ずつ範囲指定してreplaceallfastで処理。

Aすべてのファイルの処理が終わったら、filterを使ってソート。

ただ、それとはまったく別次元の問題点として、
> #fso=createobject("Scripting.FileSystemObject");
> #fo=member(#fso,"GetFile",$file);
> message member(#fo,"DateLastModified");
という方法にはひとつ致命的な問題があります。それは、DateLastModifiedメンバー
(に限らずDateCreatedもDateLastAccessedも同様ですが)の書式が環境依存だとい
うことです。

私の手元の環境ではたまたま 21/11/08 (月) 19:12:35 となっていて、「先頭が年の
算用数字表記で、ぴったり上位桁から下位桁へという並びで」となっていますが、実
はこの時点で既に「西暦2000年問題」が再燃しています。つまり、98/01/01 なんて
いう文字列の扱いをどうするのか、予め決め打ちしておかないといけません。

あるいはOSの言語設定次第では「Mon, 8th Nov 2021, 19:12:35」という文字列が返
ってくることも当然考えられます(先頭が曜日の英名で、日の部分も1桁になってい
る)。この出力が出てしまうと、ソートするのはそうとう(ソートだけに?)面倒です。

というわけで結局、
> やっぱり本体の機能かオプションとしてあったほうがよさそうです。
という結論になるのかなと。

[ ]
RE:39337 GREPの結果表示についてNo.39339
styth さん 21/11/09 00:26
 
>試しにマクロを作ってみようかと思ってみてやってみたのですが、結果がすごい多
>い場合は速度が実用的ではありませんでした
 自分の場合は、そんなに多くありません。
 なので、差し付けなければ、作成したマクロを教えて頂けないでしょうか?
 本体の機能かオプションとして、搭載されるまで、使わせて頂きたいと思います。

[ ]
RE:39339 GREPの結果表示についてNo.39340
秀丸担当 さん 21/11/09 09:21
 

速度は、最初試しにしていたときは数千行で数秒くらいだったのですが、まとめてre
placeallquickとかにしたらそこそこ使えるようになったかもしれません。
でるもんたいいじまさんのご指摘の通り、日付の書式の問題があるので、完全ではな
いです。書式がうまくいく場合に限って使えるようなものとして割り切って使っても
らう必要があると思います。(たぶん外部DLLかtkinfo.dllか、何らかの別手段が必要)

setcompatiblemode 0x20200;
if(filetype!="grep"){
  message "grep結果で実行してください";
  endmacro;
}
disabledraw;
#fso=createobject("Scripting.FileSystemObject");
escape;
replaceallquick @"^(.+?\()(\d+\):)",@"\1-\2",regular;
gofiletop;
while(1){
  searchdown2 @"^(.+?)\(-\d+\):(?\1)",regular;
  if(result==false){
    break;
  }
  $file=gettext(seltopx,seltopy,selendx,selendy,1);
  if(leftstr($file,2)!=@"\\"&&midstr($file,1,1)!=":"){
    $file=directory+@"\"+$file;
  }
  #fo=member(#fso,"GetFile",$file);
  $date=member(#fo,"DateLastModified");
  if(val($date)<50)$date="20"+$date;
  releaseobject #fo;

  beginsel;
  searchdown2 @"^(.+?)\(-\d+\):.*\n(?!\1)",regular;
  moveto foundendx,foundendy;
  endsel;
  #linenoNext=lineno;
  replaceallquick "^","["+$date+"]\t",regular,inselect;
  escape;
  moveto2 0,#linenoNext;
}
selectall;
filter "" , "Sort" , "110110110001001\"0101";//降順,数値の大小
replaceallquick @"^\[.+?\]\t","",regular;
replaceallquick @"^(.+?\()-(\d+\):)",@"\1\2",regular;
escape;
gofiletop;
clearupdated;
releaseobject #fso;
endmacro;

[ ]
RE:39340 GREPの結果表示についてNo.39342
styth さん 21/11/10 07:07
 
>でるもんたいいじまさんのご指摘の通り、日付の書式の問題があるので、完全では
>ないです。書式がうまくいく場合に限って使えるようなものとして割り切って使っ
>てもらう必要があると思います。(たぶん外部DLLかtkinfo.dllか、何らかの別手段
>が必要)
 ほとんどストレスなく、快適に使えています。ありがとうございます。

 ところで、

selectall;
filter "" , "Sort" , "110110110001001\"0101";//降順,数値の大小
//replaceallquick @"^\[.+?\]\t","",regular;
replaceallquick @"^(.+?\()-(\d+\):)",@"\1\2",regular;

 とすると、更新日時が分かって、調子良いのですが、

 マクロでも構わないのですが、行頭に更新日時を付けたまま、タグジャンプは、
出来ないのでしょうか?
 日時を削除すれば、タグジャンプします。

[ ]
RE:39342 GREPの結果表示についてNo.39343
秀丸担当 さん 21/11/10 08:56
 
タグジャンプの対象をどこにするかの設定があります。
[その他]→[動作環境]→[その他のコマンド]→[タグジャンプ]のところの「タグジャ
ンプ対象を正規表現指定」をONにして、正規表現を書きます。
最初のタブ区切りもありにするとしたら、
ファイル名部分:
([^\t]+?)\((\d+)\):(?\1)
行番号部分:
([^\t]+?)\((\d+)\):(?\2)
としたら一応できました。
(漏れがあったらすみません)

[ ]
RE:39340 色付けを維持したいNo.39353
styth さん 21/11/16 12:13
 
 教えて頂いたマクロをA.macとします。

$s="aaa";
(中略)
grep $s, "*.txt", @"C:\Users\USER\Documents", nocasesense, hilight;
execmacro "A.mac";//日付順にソート

 A.mac実行後も、grep $s、で色付けされた状態にしたいのですが、どうやれば
良いんでしょうか?
 colormarkerを使って色々やってみるのですが、うまくいきません。
 よろしくお願いいたします。

[ ]
RE:39353 色付けを維持したいNo.39354
秀丸担当 さん 21/11/16 13:52
 
通常のgrep直後は、検索文字列の強調がONであれば、検索文字列の強調も有効で、gr
epした時点で色が付いていると思います。
日付順のソートのマクロを実行すると、検索文字列の強調は消えてしまいました。
これはマクロ内でも検索をしているためでした。

execmacroの場合は以下のようにして再び検索文字列の強調をするのが簡単です。
execmacro "A.mac";//日付順にソート
hilightfound 1;
これであれば、A.macはいじる必要は無いです。

execmacroを使わず、A.macだけで完結させるとしたら、ちょっと面倒です。
setcompatiblemode 0x20000;で検索文字列の退避と復元を自動でしているためです。
昔ながらの方法で、マクロ先頭で、
$s=searchbuffer;
#f=searchoption;
として変数に退避して、マクロ最後で、
setsearch $s,#f;
hilightfound 1;
として復元と強調をすると、A.macだけでもできました。

[ ]