Last Modified:

elpa形式じゃない野良elispをpackage-installするEmacs

野良elispを集めたelpaリポジトリを作るのが王道なんだろうけど、面倒臭いのでお手軽にpackage-installしたい。

ソース

(defun my:package-install-from-url (url)
  "URLを指定してパッケージをインストールする"
  (interactive "sURL: ")
  (let ((file (and (string-match "\\([a-z0-9-]+\\)\\.el" url) (match-string-no-properties 1 url))))
    (with-current-buffer (url-retrieve-synchronously url)
      (goto-char (point-min))
      (delete-region (point-min) (search-forward "\n\n"))
      (goto-char (point-min))
      (setq info (cond ((ignore-errors (package-buffer-info)))
                       ((re-search-forward "[$]Id: .+,v \\([0-9.]+\\) .*[$]" nil t)
                        (vector file nil (concat file " [my:package-install-from-url]") (match-string-no-properties 1) ""))
                       (t (vector file nil (concat file " [my:package-install-from-url]") (format-time-string "%Y%m%d") ""))))
      (package-install-from-buffer info 'single)
      (kill-buffer)
      (dolist (package package-obsolete-alist)
        (package-delete (symbol-name (car package)) (mapconcat 'int-to-string (caadr package) ".")))
      (package-initialize))))

使い方

(my:package-install-from-url "https://raw.github.com/kiwanami/emacs-calfw/master/calfw-org.el")

を評価するか、

M-x my:package-install-from-url RET https://raw.github.com/kiwanami/emacs-calfw/master/calfw-org.el

を実行する。

結果

% find ~/.emacs.d/elpa/calfw-org-20130806/
~/.emacs.d/elpa/calfw-org-20130806/
~/.emacs.d/elpa/calfw-org-20130806/calfw-org-autoloads.el
~/.emacs.d/elpa/calfw-org-20130806/calfw-org-pkg.el
~/.emacs.d/elpa/calfw-org-20130806/calfw-org-pkg.elc
~/.emacs.d/elpa/calfw-org-20130806/calfw-org.el
~/.emacs.d/elpa/calfw-org-20130806/calfw-org.elc

そんで、auto-installとかel-getとか自作インストーラーとか全部投げ捨てる(自作インストーラーは複数ファイルにも対応してたんだけどな…)。

更新履歴

おまけ

NTEmacsで実行したらgnutlsのエラー(落ちてしまうのでエラーログは保存してない。スクリーンショットも撮り損ねた)になって困ってたんだけど、これで直った。

あーナイス!こうした。 (eval-after-load "gnutls" '(setq gnutls-trustfiles (mapcar 'expand-file-name gnutls-trustfiles))) http://t.co/ZYFx5t07ty

— ろばりお (@robario) August 6, 2013

cygwin-mount.el使ってるから大丈夫だと思っていたら、bin/libgnutls-28.dll(に限らず*.dll)がWindows形式のパスしか理解できず、 /usr/ssl/certs/ca-bundle.crtが読み込めないのでc:/cygwin/usr/ssl/certs/ca-bundle.crtにしてあげた。