2018年9月18日火曜日

Emacs for Windowsでfind-grepっぽいことをする

 けっこうよく使うのはfindとgrepの組み合わせなのだけど、Windows環境だとそれが使えない。findとgrepがないからだ。もしかしたらエクスプロラーで同等のことができるのかもしれないが、無知でよくわからない。単純に動かすとファイル名で検索しているように見える。エクセルの中身を検索してくれるときとかもあるのだけれど。
 そのちがいがよくわからない。
 検索したいのは基本的にプレーンテキストなわけなのだから。
 それならEmacs for Windowsでfind-grepをすれば、いいんじゃないか。でもemacsのfindもgrepも外部コマンドが実行される。つまりWindows環境にfindとgrepがないとどうしようもない。
 grep単体ならeshellにelispで実装された「eshell-poor-mans-grep」があるし、findもelispで実装されたものがある。それをfind-grepのように組み合わせるにはどうしたいいんだ?
 試行錯誤の結果、たどりついたのが。

  1. find-lisp-find-diredでファイル検索
  2. その結果をdired-modeでmark1
  3. (eshell-poor-mans-grep (cons 検索文字列 (dired-get-marked-files)))を実行。

 一回、eshell-poor-mans-grepをかけると、対象ファイルはEmacsのバッファに読みこまれているので何回もやりなおすときには検索が早くなって都合がいい。全ファイルが展開されているせいでメモリを圧迫して苦しいときもあるけれど。

追記:
もっと簡単な方法があった

Footnotes:

1

「* %」でmarkして「C-u * %」でunmarkできるのでけっこういける。