先ほどのanything-git-project.elを少し手直ししてみた - $shibayu36->blog;に引き続きしてみた。けっこうひどいコードになってきてるから、リファクタリングしてもいいかもという気分になってきた。
(defun anything-git-project-is-git-repository () (let ((error-message (shell-command-to-string "git rev-parse"))) (if (string= error-message "") t nil) )) (defun anything-git-project-project-dir () (chomp (shell-command-to-string "git rev-parse --show-toplevel") )) (defun anything-c-sources-git-project-for () (cond ((anything-git-project-is-git-repository) (loop for elt in '(("Modified files (%s)" . "--modified") ("Untracked files (%s)" . "--others --exclude-standard") ("All controlled files in this project (%s)" . "")) collect `((name . ,(format (car elt) (anything-git-project-project-dir))) (init . (lambda () (setq current-git-project-dir (anything-git-project-project-dir)) (unless (and ,(string= (cdr elt) "") ;update candidate buffer every time except for that of all project files (anything-candidate-buffer)) (with-current-buffer (anything-candidate-buffer 'global) (insert (shell-command-to-string ,(format "git ls-files --full-name $(git rev-parse --show-cdup) %s" (cdr elt)))))))) (candidates-in-buffer) (display-to-real . (lambda (name) (format "%s/%s" current-git-project-dir name))) (type . file)) )) ((list)) )) (defun anything-git-project () (interactive) (let* ((sources (anything-c-sources-git-project-for))) (anything-other-buffer sources (format "*Anything git project in %s*" (anything-git-project-project-dir)))))
これをやった理由は、たとえばanything-filelistのsourceとしてanything-git-projectも入れたいとなった時、git repository以外(例えば*scratch*とか)で起動するとエラーが出てしまい、邪魔なので勢いでやった。
gitのrepositoryかどうか判断するのは、カレントディレクトリがGitリポジトリ下か否か判定する - すぎゃーんメモを参考にした。exit codeを見るパターンだとなんか*Message*にエラーが吐かれて嫌なので、error messageを見るようにした。