@kyanny's blog

自分の不名誉になるような考えを最初に大胆に表明することは、自立への第一歩となる - ニーチェ ドイツ哲学者

mew-summary-pick-with-grep についてのメモ

悔しいので自力で調べた部分をメモに残しておく。

summary モードで / すると mewl/grep どちらかで検索するが、 pattern を聞かれたときに単に RET とすると実際に検索するためのコマンドラインをかける。ここにデフォルトで入っているのは mew-prog-grep と mew-prog-grep-opts を評価した値。これらの変数を変更していなければ grep -l -e となるはず。

M-x find-function RET mew-summary-pick-with-grep とすると、 grep で(厳密には grep コマンドである必要はなく、 mew-prog-grep で指定されたコマンド)検索するときに呼ばれる関数を読める。

(defun mew-summary-pick-with-grep (prog opts pattern folder src-msgs)

と宣言されていて、 prog が mew-prog-grep で指定されたもの、 opts が mew-prog-grep-opts で指定されたもの、 pattern はそのまま pattern で、 folder は検索対象のディレクトリ名、 src-msgs が検索対象のメールのリスト。

grep に渡すファイルが多すぎてエラーになるのを防ぐために、一定数ごとにリストを分割しながら call-process で grep を呼んでいて、全部処理し終わるまで while ループで繰り返している。この call-process を呼ぶ部分が

(apply 'call-process prog nil t nil
(append opts (and pattern (list pattern)) src-msgs))

となっていて、 prog opts pattern src-msgs みたいになってこれが展開されて grep -l -e 'pattern' FILE FILE FILE ... みたいなコマンドが実行される。

この辺まで突き止めたけど肝心の問題は解決できなかった。