ELPA是 Emacs Lisp Package Archive 的缩写,最初是由TomTromey编写的,在很多人贡献后,现在elpa已经包含到了emacs24中
"我们的目标是让安装,使用,升级emacs的包变得更加容易",我们提供##package.el##,一个简单的emacs包管理工具,还有一个预先包装好了的emacs lisp代码库.
emacs24中把 package.el
这个包管理工具包含进来了,它包含了一个内置的FSF所支持的emacs包,也称为ELPA,你可以在ELPA 仓库中找到。
emacs版本的package.el支持多个仓库,你可以用GNU ELPA来添加其它的仓库,例如这样:
(setq package-archives '(("gnu" . "http://elpa.gnu.org/packages/") ("marmalade" . "http://marmalade-repo.org/packages/") ("melpa" . "http://melpa.milkbox.net/packages/")))
任何仓库的组合都是很好的。你或许应该总是把GNU的核心的仓库包括进去,但是这个不是必需的。
包的归档也可以是本地的 中国大陆的用户可以使用popkit.org(http://elpa.popkit.org/)提供的elpa仓库:
(add-to-list 'package-archives '("popkit" . "http://elpa.popkit.org/packages/"))
你可以交互性的做.
增加了 Marmalade:
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
增加了 MELPA:
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
你可以定制 `package-archinves’,试试这个:
M-x customize-variable [RET] package-archives [RET]
Elisp手册描述了包系统是如何初始化的: :每当emacs被打开的时候,emacs都会自动的调用’package-initialize’来导入已经安装了的包,这件事是在导入初始文件和简写文件(如果有的话)之后,在运行’after-init-hook’之后完成的(参看startup简介)如果用户选项package-enable-at-startup被禁用的话,也就是package-enable-at-startup的值为nil,那么自动加载就不会被执行。 所以在init.el文件被加载了之后包才会被初始化,这就意味着你不应该把包的具体的初始化放到你的init.el文件中,除了几个方面以外。
(add-to-list 'auto-mode-alist '("\\.gradle" . groovy-mode))
(add-hook 'groovy-mode-hook (lambda () (setq tab-width 4)))
(global-set-key "\M-?" (lambda () (interactive) (call-interactively 'magit-status))) (global-set-key (kbd "C-'") 'shell-switcher-switch-buffer)
(add-hook 'after-init-hook 'cycbuf-init)
一些人认为用after-init-hook似乎是最后一种解决方案,因为它强制包的加载(因此会让你的emacs的速度变慢),然而另外一些人指出在所有的包都加载完成后在配置它们会更易于使用。
你可以在你的初始化文件中这样做:
(add-hook 'after-init-hook #'(lambda () (load "<real init file>")))
然后把你所有的常规的初始放到 <<real init file>>
中.
用 ‘eval-after-load’
来为每个文件进行配置是一个比较不错的方法,如果这个包不存在的话,它会回滚。
下面的这个例子展示了用定制了一个假设的叫做abcd-mode的主要模式,
(eval-after-load "abcd-mode" ; <-- "abcd-mode", not 'abcd-mode '(progn (setq-default abcd-basic-offset 7) ; setting some option (add-to-list 'abcd-globals-list "console") ; appending to a list option (add-hook 'abcd-mode-hook 'prepare-some-abcd-soup) ; things to do for abcd mode buffers (define-key abcd-mode-map (kbd "C-c C-c") 'play-some-abcd-song) ; add some key binding for abcd mode ))
这里有一个假设叫做broccoli的副模式.
(eval-after-load "broccoli-autoloads" ; <-- "broccoli-autoloads", not "broccoli" '(progn (if (require 'broccoli nil t) (progn (broccoli-mode 1) ; Turn on Broccoli global minor mode if broccoli-autoloads.el doesn't do it. (setq-default broccoli-how 'steamed) ; set some option. (add-to-list 'broccoli-additional-stuff 'salt) ; add to a list option. ) (warn "broccoli is not found."))))
在我的印象中,elpa的一个缺点就是当新的包被安装后,加载路径并不会被更新,这里有一个命令可以为你到做到:
(defun package-update-load-path () "Update the load path for newly installed packages." (interactive) (let ((package-dir (expand-file-name package-user-dir))) (mapc (lambda (pkg) (let ((stem (symbol-name (car pkg))) (version "") (first t) path) (mapc (lambda (num) (if first (setq first nil) (setq version (format "%s." version))) (setq version (format "%s%s" version num))) (aref (cdr pkg) 0)) (setq path (format "%s/%s-%s" package-dir stem version)) (add-to-list 'load-path path))) package-alist)))
这会是更好的建议么?也许甚至连包都会安装这个建议
emacs中ELPA的规则在这里被讨论过:http://thread.gmane.org/gmane.emacs.devel/132634/focus=132640
你能够让包在emacs23中工作,你需要在你的init.el文件中增加像这样的一些东西
(require 'package) ;; Any add to list for package-archives (to add marmalade or melpa) goes here (add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/")) (package-initialize)
为了能够在emacs23中用package.el,下面链接中的package.el版本是需要的,http:bit.ly/pkg-el23(源代码(source of info:https:github.com/technomancy/package.el)
AndrewHyatt 从2013年4月,已经写了一个ELPA的引擎 的实现,是用go语言写的,它还没有公开的。