moccur-grep-findをちょっと便利に

higeponさんのid:higepon:20080717:1216264518を見て、そういえば自分も
moccur-grep-findの拡張子の指定のところで困ってたな〜と思い出した。
いい機会なので自分も少し設定をごにょごにょしてみることに。
せっかくなので、id:higepon さんとは別のアプローチをとることにしてみた。
拡張子(本当は拡張子ではなくてファイルマスクか?)の指定で何が面倒かって、
例えば、拡張子がcppだったかhppだったか、それともただのhだったかわからない、
という時に、

searchstring \.cpp$\|\.hpp$\|\.h$

としなければいけなくてこれをタイプするのが面倒だった。
これが、

searchstring cpp,hpp,h

となっただけでだいぶ便利になるんじゃないか。というわけで作ったのがこれ。
ほとんどmoccur-grep-findそのままで、マスクの文字列のところをカンマでsplit
してガチャガチャやってるだけです。(例えばcpp,hpp,hなら\.cpp$\|\.hpp$\|\.h$にしてるだけ)

(defun moccur-grep-find-ext (dir inputs)
  (interactive
   (list (moccur-grep-read-directory)
         (moccur-grep-read-regexp moccur-grep-default-mask)))
  (moccur-setup)
  (setq moccur-last-command 'moccur-grep-find)

  (let (regexps
        mask (files nil)
        ;;(default-directory dir)
        )
    (setq regexps
          (mapconcat 'concat
                     (if (= 1 (length inputs))
                         inputs
                       (cdr (reverse inputs)))
                     " "))
    (setq mask
          (if (= 1 (length inputs))
              "."
            (car (reverse inputs))))
    (setq mask2 (concat "\\."
                        (mapconcat 'identity 
                                   (split-string mask ",")
                                   "$\\|\\.")
                        "$" ))
    (message "Listing files...")
    (cond
     ((listp dir)
      (while dir
        (cond
         ((file-directory-p (car dir))
          (setq files (append
                       (reverse (moccur-grep-find-subdir (car dir) mask2))
                       files)))
         (t
          (setq files (cons
                       (car dir)
                       files))))
        (setq dir (cdr dir))))
     (t
      (setq files (reverse (moccur-grep-find-subdir dir mask2)))))
    (message "Listing files done!")
    (moccur-search-files regexps files)
    ))

あとは除きたい拡張子を

searchstring ^svn-base

みたいにできたら便利かなぁ。