Emacs の moccur-grep-find で特定のファイルを無視したい

moccur-grep や moccur-grep-find は moccur-edit と組み合わせると強力なので手放せず毎日使わせてもらっています。


ただしちょっと不満があって moccur-grep-find では .svn やら TAGS などが検索に引っかかってしまうのが少し不便に感じていました。
実は M-x moccur-grep-find して hoge \.scm$ みたいに拡張子を指定すれば引っかからなくなるのでそこまで困っていなかったので放置していました。


今回 id:tonextone さんに *moccur-buffer-name-exclusion-list* で特定のファイルを無視できないんだろうか?と 質問されたのでまじめに調べてみました。
毎日使っている道具なので快適になるなら取り組む価値はありますよね。


結論から言うと *moccur-buffer-name-exclusion-list* ではうまくいかないので独自にごニョゴニョする必要がありました。
とっても汚い方法ですがうまくいったので書いておきます。
moccur-grep-exclusion-buffer-name-regexp という変数に無視したいファイルの正規表現を指定する形です。
正規表現はバッファの path に対してマッチングされます。

;; moccur-grep で特定のファイルを対象外としたい
(setq moccur-grep-exclusion-buffer-name-regexp "\\(TAGS\\)\\|\\(\\.svn\\)")
;(defun delete-string-match (reg lst)
;  (cond
;   ((null lst) (reverse lst))
;   ((string-match reg (car lst))
;    (delete-string-match reg (cdr lst)))
;   (t (cons (car lst) (delete-string-match reg (cdr lst))))))
(defun delete-string-match (reg lst)
  (let ((ret nil))
    (while lst
      (unless (string-match reg (car lst))
        (setq ret (cons (car lst) ret)))
      (setq lst (cdr lst)))
    (reverse ret)))
(defadvice moccur-search-files (before moccur-search-files-with-exclusion)
  "enable moccur-grep-exclusion-buffer-name-regexp"
  (ad-set-arg 1 (delete-string-match moccur-grep-exclusion-buffer-name-regexp (ad-get-arg 1))))
(ad-enable-advice 'moccur-search-files 'before 'moccur-search-files-with-exclusion)
(ad-activate 'moccur-search-files)


Emacs Lisp 書くのは緊張するな。全然覚えられない。

追記

delete-string-match は再帰版だとあっという間にスタックオーバーフローなので、ループに書き直しました。

追記2

dmoccur-exclusion-mask でいけるんじゃね?という指摘が。
確かに。試してみたところ効いていないような気がするので調べます。