GNU Emacs的终极扩展管理工具 -- el-get
今天, 你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的影子,直接描诉扩展包地址,然后直接下载安装。
安装扩展
接下来就是最激动人心的时刻了,让我们先用magit、package和auto-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
资源和链接
-
el-get github地址:
https://github.com/dimitri/el-get -
el-get 作者blog:
http://tapoueh.org/news.dim.html -
我的el-get分支:
https://github.com/vmlinz/el-get
Sat, 15 Jan 2011 00:06:14 +0800
顶一下,早在Planet Emacsen上看见这个,但一直没时间来试验。
不知道它是怎么处理load-path的? 我觉得elpa把每个package的路径都加到load-path,多了之后有点烦——也许是我有点洁癖?
Sat, 15 Jan 2011 00:47:11 +0800
@bamanzi 女士/先生: 呵呵,我是第一时间开始用的。它也是会把所有需要reqire的路径加入到load-path,好像没有别的办法了。。。就和shell里面的PATH一样的。el-get可以安装elpa的所有包。
还可以先用el-get安装package.el,然后用elpa来安装
Mon, 17 Jan 2011 14:47:23 +0800
作为标记!听到得一个很不错的消息
Mon, 17 Jan 2011 14:49:32 +0800
这个博客网难道不能提供收藏功能??晕倒。
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。
Mon, 17 Jan 2011 21:22:22 +0800
@HeroMe: 呵呵,我默认大家有rss扩展
Mon, 17 Jan 2011 21:23:21 +0800
@oCameLo: 是哈,可以给作者提意见,现在还有很多不完善的地方,不过已经非常好用了,谁用谁知道
Tue, 18 Jan 2011 11:42:20 +0800
不管是完整性还是稳定性这东西都差得有点多,目前还是算了。
Sun, 23 Jan 2011 08:06:53 +0800
你好,我在执行“安装扩展”的示例代码时,执行完el-get: evaluating autoload file就返回t了,请问什么地方出错了啊……
已将el-get.el所在目录加到load-path并require……
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)
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]。
抱歉我太菜了……
谢谢!
Tue, 25 Jan 2011 05:45:42 +0800
@toksea: 你好,可能你没有设置el-get-sources,这样你需要先按下C-u在M-x el-get-install就可以了。呵呵,你试试看。
Tue, 25 Jan 2011 08:27:01 +0800
@vmlinz: 谢谢!
参考了你和原作者的.emacs,已配置成功。除了magit有问题,一直通不过build……
Tue, 25 Jan 2011 09:44:44 +0800
@toksea: 你好,你单独用git下载magit测试一下能不能make过呢,你也可以自己看看错误
Tue, 25 Jan 2011 13:28:59 +0800
@vmlinz: git clone magit再make,缺少texinfo,刚做的系统嘛……装上texinfo后再试着el-get magit,还是出错……只能分开加载了……
谢谢!
Tue, 25 Jan 2011 14:41:37 +0800
@toksea: 再折腾一下可能就好了,你可以试试el-get-remove magit再重启emacs安装一下看看。呵呵,emacs就是折腾,得耐心调教它。
Sun, 01 Jan 2012 18:48:01 +0800
@toksea:
我试过跟你情况一样,不知道如何指定textinfo。然后在make all哪里不动了
不知道你后来怎么解决的?
Sun, 01 Jan 2012 19:18:28 +0800
@skiff:
你好, 我没解决...
用命令行git...
Sun, 15 May 2022 03:33:59 +0800
Hey! This is my first visit to your blog! We are a team of volunteers and starting a new initiative in a community in the same niche. Your blog provided us valuable information to work on. You have done a outstanding job! Selling Credit Card Machines
======================================
i really love a good read like, please keep us updated with info. North American Bancard
Tue, 17 May 2022 14:30:19 +0800
I’d should check with you here. Which isn’t some thing I do! I like reading a post which will make people believe. Also, thank you permitting me to comment! 三麗鷗