GNU Emacs的终极扩展管理工具 — elget

Let’s el-get together

通常我们在配置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。不过也会有第三方ELPA。

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的安装非常简单:

?View Code LISP
 
;; 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之前,你是可以直接使用它的功能的。

?View Code LISP
 
(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

资源和链接

原文地址:https://www.cnblogs.com/babe/p/2441623.html