• 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

    资源和链接

  • 相关阅读:
    php+ajax文件上传
    安装ruby及sass
    大佬
    ES6--let,解构赋值,promise && ES7--async
    miniapp基础
    8月笔记
    webpack 打包html文件
    webpack压缩打包不成功
    nvm安装成功后,但命令不可用(command not found)
    jq库extend的区别
  • 原文地址:https://www.cnblogs.com/babe/p/2441623.html
Copyright © 2020-2023  润新知