anything-match-pluginの制限→candidates-fileプラグイン推奨

http://d.hatena.ne.jp/joan9/20090211/1234332160

その他のsourceではミニバッファで検索語句をスペース区切りで入力していくと絞り込みがで きるのだけど、locateのところだけうまくいってない。

不便なので原因を調査して絞り込みできるようにしたい。(そもそもできないってことはない よね?)

残念ながらこれはanything-match-pluginの制限で、locateに関してはできません。locateのcandidatesはサブプロセスであり、anythingの入力がそのままlocateの引数に渡ります。その他のsourceは文字列リストなので絞り込みができます。anything-match-plugin的にサブプロセスに対する挙動をどうするか決めかねています。僕自身サブプロセスは使っていません。

そのかわり、ファイルリストを作成してそのファイルをcandidates-in-bufferで候補化する方法があります。ファイルリストはfindとcronで更新しておきましょう。findの出力を一時ファイルに書き込んでリネームすると、アトミックに更新されます。

$ find ~ > /tmp/tmp; mv /tmp/tmp /log/home.filelist

http://www.emacswiki.org/emacs/RubikitchAnythingConfiguration より

;; candidates-file  plug-in
(defun anything-compile-source--candidates-file (source)
  (if (assoc-default 'candidates-file source)
      `((init acf-init
              ,@(let ((orig-init (assoc-default 'init source)))
                  (cond ((null orig-init) nil)
                        ((functionp orig-init) (list orig-init))
                        (t orig-init))))
        (candidates-in-buffer)
        ,@source)
    source))
(add-to-list 'anything-compile-source-functions 'anything-compile-source--candidates-file)

(defun acf-init ()
  (destructuring-bind (file &optional updating)
      (anything-mklist (anything-attr 'candidates-file))
    (with-current-buffer (anything-candidate-buffer (find-file-noselect file))
      (when updating
        (buffer-disable-undo)
        (font-lock-mode -1)
        (auto-revert-mode 1)))))

(defvar anything-c-source-home-directory
  '((name . "Home directory")
    ;; /log/home.filelist にホームディレクトリのファイル名が1行につきひとつ格納されている
    (candidates-file "/log/home.filelist" updating)
    (requires-pattern . 5)
    (candidate-number-limit . 20)
    (type . file)))

(defvar anything-c-source-find-library
  '((name . "Elisp libraries")
    ;; これは全Emacs Lispファイル
    (candidates-file "/log/elisp.filelist" updating)
    (requires-pattern . 4)
    (type . file)
    (major-mode emacs-lisp-mode)))