我们已经习惯了各种包管理器工具, Debian、Ubuntu有 apt-get, RedHat、Fedora有 yum, Arch有 pacman, Gentoo有 emerge, BSD有 port. 包管理器的存在让我们再也不用考虑安装、删除、升级软件的细节, 也不用为了各种包之间的依赖关系而头疼, 这也是我认为UNIX/Linux相比于Window$的一个很大的优点. 今天介绍的  (Emacs Lisp Package Archive) 就是专为Emacs设计的包管理器, Emacs发展至今已经拥有了数量庞大的第三方扩展, 但安装这些扩展的方式依旧非常原始. 下载压缩包, 解压, 放到Emacs可以识别的 load-path, 修改 “.emacs”, 这一系列动作对于用户来说实在是不够友好 (虽然Emacs用户普遍喜欢折腾). ELPA可以使得安装Emacs扩展就像使用发行版的包管理器工具安装软件一样便捷, 并且Emacs官方也  在下一个Emacs版本, 即Emacs 24中默认集成ELPA.  是GNU的官方ELPA页面, 在那里你也可以下载到已经集成了ELPA的Emacs 24测试版.

ELPA采用同 apt-get 等包管理器工具类似的原理, 会从指定的源服务器中下载扩展以及相关依赖扩展, 然后放到特定目录 (默认为 “~/.emacs.d/elpa/”), 可能会将Lisp代码编译成字节码, 最后激活它, 当下次Emacs启动时自动加载它.

虽然Emacs 24还没有正式发布, 但是我们已经能够提前使用ELPA (实际上ELPA已经发展了好几年). 步骤很简单, 如果你使用的是Emacs 22及以上版本, 把下面的代码复制到Emacs的 *scratch* buffer中, 将光标移动到代码的最后一行, 然后按下 C-j, 一切就都搞定了, 剩下的事情就交给代码去完成吧. 如果你使用的是Emacs 21及以下版本, 请参考 .

(let ((buffer (url-retrieve-synchronously ""))) (save-excursion (set-buffer buffer) (goto-char (point-min)) (re-search-forward "^$" nil 'move) (eval-region (point) (point-max)) (kill-buffer (current-buffer))))

上面的代码执行完之后, ELPA就算安装完毕, 这时会多出一个 “~/.emacs.d/elpa/” 目录, 所有通过ELPA安装的扩展都会放在那里, 并且 “.emacs” 文件也被自动添加了加载ELPA的代码. 该如何通过ELPA安装扩展呢? 在Emacs中按下 M-x package-list-packages 会列出所有可供安装和已经安装的扩展, 如下图:

ELPA

将光标移动到需要安装的扩展上, 按下 i 键, 就会出现如上图的 “I” 标志, 选定好之后按下 x 键便开始安装扩展. 还有其它一些按键:

按键功能
n
下移一行
p
上移一行
r
刷新扩展列表
i
标记为安装
d
标记为删除
u
取消标记
g
还原所有标记
x
执行标记
q
关闭当前窗口
h
帮助
?
查看当前扩展的详细注释信息

当前ELPA的最大缺点是扩展数量还不是很多, 截至写这篇文章时仅有134个扩展. 有人说是因为ELPA只接受自由软件的缘故, 但我觉得大多数Emacs扩展开发者并不会太在意这个, 可能最大的原因还是因为大部分开发者都不知道ELPA的存在. Emacs发展这么多年, GNU也没有  集中管理各种第三方扩展, 好在官方也终于决定在Emacs 24中集成ELPA, 可以预想将来也会逐渐丰富扩展仓库. 如果你是第三方扩展的开发者并且也愿意将扩展提交给ELPA, 可以参考 , YASnippet的作者pluskid也写了 一篇给需要提交给ELPA的作者的建议, 希望ELPA的扩展仓库可以越来越丰富.

最后, GNU正在寻找用于Emacs 24的合适配色主题, 有兴趣参与的同学可以访问  自定义一份主题提交给GNU, 也许你的方案就会出现在下一个版本的Emacs中. 参与开源, 我为人人, 人人为我.