昨日紹介した新しいパッケージシステムquelpahelmインターフェース を書いてみました。

quelpa でインストールしたパッケージにおいて以下のことができます。

  • README.md (README.org) を開く
  • magit を使って git log を見る
  • パッケージリポジトリを dired で開く
  • ソースファイルを開く

このように、MELPAの欠点を補うことができます。

もう少しquelpaを使ってみて、気に入ったら
github と MELPA に上げときますね。

設定 helm-quelpa.el(以下のコードと同一)

(require 'helm)
(require 'quelpa)
(require 'magit)

(defvar helm-source-quelpa
  '((name . "quelpa installed packages")
    (candidates . helm-quelpa-candidates)
    (display-to-real . intern)
    (action ("View README or source" . helm-quelpa-view-readme-or-src)
            ("Magit log" . helm-quelpa-magit-log)
            ("Open directory" . helm-quelpa-open-dired)
            ("Find source" . helm-quelpa-find-src))))

(defun helm-quelpa-candidates ()
  (mapcar 'car quelpa-cache))

(defun helm-quelpa-interactive ()
  (list (completing-read "Package: " (helm-quelpa-candidates) nil t)))

(defun helm-quelpa-open-dired (package)
  (interactive (helm-quelpa-interactive))
  (dired (helm-quelpa-package-directory package)))
(defun helm-quelpa-package-directory (package)
  (expand-file-name (symbol-name package) quelpa-build-dir))

(defun helm-quelpa-view-readme-or-src (package)
  (interactive (helm-quelpa-interactive))
  (cl-loop for file in (list "README.md" "README.org" (format "%s.el" package))
           for path = (expand-file-name file (helm-quelpa-package-directory package))
           when (file-exists-p path)
           return (view-file path)))
(defun helm-quelpa-view-readme-or-src (package)
  (interactive (helm-quelpa-interactive))
  ;; (directory-files "/r/.emacs.d/quelpa/build/tabbar/" t "^REA")
  (condition-case _
      (cl-loop with case-fold-search = t
               for file in  (append (directory-files (helm-quelpa-package-directory package) t "^readme\\|^README\\|^Readme")
                                    (list (expand-file-name (format "%s.el" package) (helm-quelpa-package-directory package))))
               when (file-exists-p file)
               return (view-file file))
    (file-error (message "Readme not found"))))
(defun helm-quelpa-find-src (package)
  (interactive (helm-quelpa-interactive))
  (find-file (expand-file-name (format "%s.el" package)
                               (helm-quelpa-package-directory package))))

(defun helm-quelpa-magit-log (package)
  (interactive (helm-quelpa-interactive))
  (let ((default-directory (helm-quelpa-package-directory package)))
    (magit-status (helm-quelpa-package-directory package))
    (magit-log)))

(defun helm-quelpa (&rest args)
  "Helm interface for installed quelpa packages.

- View README
- View git log
- Open directory
- Open source file
"
  (interactive)
  (apply 'helm :sources 'helm-source-quelpa :buffer "*helm quelpa*" args))

(defun qlpa (package)
  (interactive (list (quelpa-interactive-candidate)))
  (quelpa package :upgrade t)
  (byte-recompile-directory "~/emacs/bootstrap/" nil t)
  (helm-quelpa-view-readme-or-src package))

実行方法

$ wget http://rubikitch.com/f/helm-quelpa.el
$ emacs -Q -f package-initialize -l helm-quelpa.el

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。