GNU Emacs的终极扩展管理工具 -- el-get

vmlinz posted @ Fri, 14 Jan 2011 13:20:51 +0800 in Emacs with tags emacs , 7352 readers

今天, 你el-get了吗?

通常我们在配置GNU Emacs的时候,都会安装一些第三方的lisp扩展来让GNU Emacs用起来
更顺手,但是这些第三方lisp扩展的安装、升级和配置的方法各异,通常我们需要使用多种
完全不同管理方式的lisp扩展(http直接下载,发行版包管理器下载,版本控制器下载
等)。这样我们升级或者迁移的时候就可能会遇到各种麻烦。

GNU Emacs一直以来都缺少一个统一的第三方lisp扩展管理器,GNU XEmacs与GNU Emacs的
一个区别就是它有一个统一的第三方包管理工具。这其中的原因主要是因为GNU Emacs是
GNU Project的一个重要代表,它要求随它发行的所有lisp都要作者签名用GPL授权给FSF,
但是并不是所有的作者都支持GPL,而且这个过程给第三方贡献增加了不少阻碍。所以当时
就有一批开发者开发了GNU XEmacs。所以GNU Emacs一直到现在也没有引入官方的扩展管理
工具(指的是当前的稳定版本,ELPA已经被合并到当前的开发分支了)。

当前第三方包管理方法

  • emacswiki有auto-install.el之类的管理工具
  • linux发行版的包管理(如debian的lisp包)
  • tromey写的package.el
  • 手工使用git之类的版本控制工具来管理lisp扩展
  • 直接下载

当前这些方法的不足之处

  • elpa可以管理当前大多数第三方扩展,但是仍然有很多不在里面
  • 手工管理,升级太麻烦,迁移也不方便
  • linux发行版的包管理,通常你用不了最新的扩展,而且迁移也挺麻烦
  • 开发分支的ELPA,不要认为GNU Emacs会放弃原来的授权方式,要进入官方ELPA估计
    和现在没有什么区别,仍然有很多作者不会把自己的代码交给FSF

el-get华丽登场

el-get简介

  • el-get能够透明的管理各种来源的第三方扩展(不管你是通过linux发行版获取,
    直接下载还是通过git等版本控制器获取的)
  • el-get能够安装,升级和移除它管理的第三方扩展
  • el-get支持安装后的初始化操作,支持hook操作
  • el-get支持扩展包man和info的安装,安装好后,你可以直接C-h i查看info
  • el-get的源描述文件(recipe)超级简单,可以轻松添加自己的扩展源
  • el-get支持异步和同步安装和初始化
  • el-get支持ELPA中的所有package安装,ELPA是它的一种安装方法。。。

安装el-get

el-get的作者参考和ELPA的package.el的做法,使得el-get的安装非常简单:

;; So the idea is that you copy/paste this code into your *scratch* buffer,
;; hit C-j, and you have a working el-get.
(url-retrieve
"https://github.com/dimitri/el-get/raw/master/el-get-install.el"
(lambda (s)
(end-of-buffer)
(eval-print-last-sexp)))

复制上面的代码到scratch中,移动光标到最后,按下C-j然后就可坐等安装完成了。

使用el-get

el-get的作者是debian developer,所以el-get有深深的apt-get烙印。其实我还觉得
el-get很有gentoo portage的影子,直接描诉扩展包地址,然后直接下载安装。

安装扩展

接下来就是最激动人心的时刻了,让我们先用magitpackageauto-complete
演示el-get的几个功能。

对于el-get本身,你需要给它手动指定load-path,因为启动的时候需要先载入它的
功能,然后才能通过它来安装和管理其他lisp扩展。

当然在你刚安装玩el-get还没有重启GNU Emacs之前,你是可以直接使用它的功能的。

(setq el-get-sources
'(el-get
package
auto-complete
(:name magit
:after (lambda () (global-set-key (kbd "C-x C-z") 'magit-status))))
)
(el-get)

复制上面的代码到scratchbuffer,光标移动到buffer最后,键入C-j执行lisp代码。
这样el-get、package、auto-complete和magit就被安装到~/.emacs.d/el-get目录下了。
而且magit包在安装好后还执行了一个按键绑定操作,同样你也可以在任何需要配置的扩展
后面使用定制函数。

初始化扩展

el-get还可以帮助你方便的初始化GNU Emacs扩展,在每个source描诉的:after后面可以
放上自己的初始化函数,就像上面的magit那样。

通常(el-get)是异步执行的,所以如果你的扩展之间有依赖关系,它的初始化过程可能
就会失败,所以为了方便大家写扩展包的初始化函数,作者给(el-get)增加了两种同步
方式:

  • (el-get 'sync) 完全同步,初始化的顺序严格按照el-get-sources中的顺序完成
  • (el-get 'wait) 初始化过程异步,可以多个source同时初始化,但会等待整个初始化完成

交互式命令接口

  • el-get-cd 用dired切换到指定package的文件夹
  • el-get-install 根据用户设定的el-get-sources变量中的package来指定安装其中一个
  • el-get-update 升级指定的package
  • el-get-update-all 升级el-get-sources中的所有package,慎用
  • el-get-remove 删除已经安装而且在el-get-sources中的某个package
  • 加上C-u前缀的时候,el-get-install和el-get-remove是可以操作仓库中的所有
    package

定制和贡献

  • el-get支持本地扩展包仓库,参考el-get-recipe-path变量
  • 参考package描述文件的文档,对仓库中的package进行定制,可以改变来源、构建命令、
    初始化函数。。。
  • 参考el-get-methods的文档,给el-get增加更多的安装来源支持
  • 贡献package描述文件(package recipe),添加你喜欢的package
  • 使用并报告bug,或者要求增加新的特性
  • 让更多的人用上el-get

资源和链接

Avatar_small
bamanzi 女士/先生 said:
Sat, 15 Jan 2011 00:06:14 +0800

顶一下,早在Planet Emacsen上看见这个,但一直没时间来试验。

不知道它是怎么处理load-path的? 我觉得elpa把每个package的路径都加到load-path,多了之后有点烦——也许是我有点洁癖?

Avatar_small
vmlinz said:
Sat, 15 Jan 2011 00:47:11 +0800

@bamanzi 女士/先生: 呵呵,我是第一时间开始用的。它也是会把所有需要reqire的路径加入到load-path,好像没有别的办法了。。。就和shell里面的PATH一样的。el-get可以安装elpa的所有包。

还可以先用el-get安装package.el,然后用elpa来安装

Avatar_small
HeroMe said:
Mon, 17 Jan 2011 14:47:23 +0800

作为标记!听到得一个很不错的消息

Avatar_small
HeroMe said:
Mon, 17 Jan 2011 14:49:32 +0800

这个博客网难道不能提供收藏功能??晕倒。

Avatar_small
oCameLo said:
Mon, 17 Jan 2011 16:55:36 +0800

不知道是我没想明白还是怎么,感觉el-get的逻辑有点奇怪。

既然.status.el里边都已经纪录了各个包的安装情况,为什么还要人工维护一个el-get-sources?el-get-remove了某个包,还得再把el-get-sources里的删掉,这不就是包管理该干的事情么。

而且el-get的稳定性还相当成问题,比如el-get用elpa安装的包每次启动都会尝试再次安装,接着报错already installed。

Avatar_small
vmlinz said:
Mon, 17 Jan 2011 21:22:22 +0800

@HeroMe: 呵呵,我默认大家有rss扩展

Avatar_small
vmlinz said:
Mon, 17 Jan 2011 21:23:21 +0800

@oCameLo: 是哈,可以给作者提意见,现在还有很多不完善的地方,不过已经非常好用了,谁用谁知道

Avatar_small
oCameLo said:
Tue, 18 Jan 2011 11:42:20 +0800

不管是完整性还是稳定性这东西都差得有点多,目前还是算了。

Avatar_small
toksea said:
Sun, 23 Jan 2011 08:06:53 +0800

你好,我在执行“安装扩展”的示例代码时,执行完el-get: evaluating autoload file就返回t了,请问什么地方出错了啊……
已将el-get.el所在目录加到load-path并require……

Avatar_small
vmlinz said:
Mon, 24 Jan 2011 09:07:39 +0800

@toksea: 你好,可能是我的实例代码中的auto-complete写错了,官方的名字叫做autocomplete(没有中间的-)。你可以再试试看安装你自己感兴趣的包,执行安装之后你看看~/.emacs.d/el-get目录下有没有安装好你想要的包,然后要修改emacs的初始化文件,把el-get的初始化加入进去。你可以参考我的init.el(https://github.com/vmlinz/my_emacs_conf/blob/master/init.el#L707)

Avatar_small
toksea said:
Tue, 25 Jan 2011 02:56:23 +0800

@vmlinz: 你好,请问el-get有什么依赖么?
我是新做的ubuntu,只安装了git。emacs除el-get外还没装别的插件,想都通过el-get管理。是加载el-get写错了么?我是这样写的:
(add-to-list 'load-path "~/.emacs.d/el-get/")
(add-to-list 'load-path "~/.emacs.d/el-get/el-get/")
(require 'el-get)
需要加载recipes/么,在(require 'el-get)之后?我用el-get-install,任何插件都说[no match]。
抱歉我太菜了……
谢谢!

Avatar_small
vmlinz said:
Tue, 25 Jan 2011 05:45:42 +0800

@toksea: 你好,可能你没有设置el-get-sources,这样你需要先按下C-u在M-x el-get-install就可以了。呵呵,你试试看。

Avatar_small
toksea said:
Tue, 25 Jan 2011 08:27:01 +0800

@vmlinz: 谢谢!
参考了你和原作者的.emacs,已配置成功。除了magit有问题,一直通不过build……

Avatar_small
vmlinz said:
Tue, 25 Jan 2011 09:44:44 +0800

@toksea: 你好,你单独用git下载magit测试一下能不能make过呢,你也可以自己看看错误

Avatar_small
toksea said:
Tue, 25 Jan 2011 13:28:59 +0800

@vmlinz: git clone magit再make,缺少texinfo,刚做的系统嘛……装上texinfo后再试着el-get magit,还是出错……只能分开加载了……

谢谢!

Avatar_small
vmlinz said:
Tue, 25 Jan 2011 14:41:37 +0800

@toksea: 再折腾一下可能就好了,你可以试试el-get-remove magit再重启emacs安装一下看看。呵呵,emacs就是折腾,得耐心调教它。

Avatar_small
skiff said:
Sun, 01 Jan 2012 18:48:01 +0800

@toksea:

我试过跟你情况一样,不知道如何指定textinfo。然后在make all哪里不动了

不知道你后来怎么解决的?

Avatar_small
toksea said:
Sun, 01 Jan 2012 19:18:28 +0800

@skiff:
你好, 我没解决...
用命令行git...


Login *


loading captcha image...
(type the code from the image)
or Ctrl+Enter