el-get,Emacs的扩展管理工具

http://emacser.com/el-get.htm/comment-page-1#comments

         

作者: Nick Qi

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

资源和链接

 

 

           #####################################

 

 

http://linux.chinaunix.net/techdoc/system/2008/09/03/1029549.shtml

以前在windows平台下面很喜欢用total command,在linux的终端下面,有个mc也可以做不错的文件操作。虽然我之前说了使用emacs的shell来操作文件也不错,但是如果需要更高级的东西,那么我们还是用emacs提供的dired吧。M-x dired
    我再次重申一点,如果要想对dired要更强的了解,手工操作是最好的办法。你可以将你的工作环境移值过来,在一段时间之后,当你熟练起来的时候,自然而然就过渡过来了。所有有时候强制也是很重要的。
    因为内容比较多的原因,我这里整理了一篇网上的文章,和大家分享一下吧。
一些常用的命令
和文件一样打开目录或通过 C-x d 都可以进入目录的 Dired 缓冲中。这里是打开 Dired-x 之后默认的绑定。说明后面[]中的符号的意义:

  • 作用在已标记的所有文件(目录)或光标所在当前文件(目录)上。
      [p] 用前缀参数表示文件个数,从当前文件开始,正数向下、负数向上。
       用前缀参数改变默认行为。对于设置标记的命令一般变为去掉标记。
      [x] 需要加载 dired-x。
    查看帮助
        * ? 简单帮助
        * h 模式帮助
    移动光标
        * n, p, SPC 上、下移动光标 [p]
        * C-n, C-p 上、下移动光标 [p]
        * M-{, M-} 已标记的文件之间移动 [p]
        * C-M-p, C-M-n 缓冲中的子目录间移动 [p]
        *  缓冲中的目录行间移动 [p]
        * C-M-u 缓冲中的目录树上移动 [p]
        * M-g 光标移动到某个文件上
        * M-G 光标移动到某个缓冲中的子目录上,(用 i 插入的)
    标记文件
        * m 标记文件,下移一行 [p]
        * u 去掉标记,下移一行 [p]
        * U 去掉缓冲中所有的标记
        * M-Backspace 去掉缓冲中所有的某个标记,缺省为 * 标记
        * Backspace 并去掉上一行标记,并上移一行 [p]
        * t 标记/未标记互换
        * D 删除所有标记的文件/目录

  •     * d 设置“删除标记”(字符D),并且光标下移一行 [p]
        * x 删除用 d 标记的文件/目录
        * ~ 将缓冲中备份文件做删除标记 
        * & 没用的文件,做删除标记
        * # 将缓冲中自动保存的文件做删除标记 
        * . 按备份文件版本,将备份文件做删除标记 
        * % g 标记所有“含有”regexp 的文件 
        * * * 标记所有可执行文件 
        * * . 标记所有同扩展名文件 [ux]
        * * / 标记所有目录 
        * * @ 标记所有符号连接 
        * * c 改变标记的符号
        * % d 通过匹配 regexp 标记删除
        * % m 通过匹配 regexp 标记 
    复制、移动、创建 文件或目录以及连接
        * C-x C-f 创建文件
        * + 创建目录
        * R 文件的重命名/移动 [p*]
        * C 复制文件

  •     * S 创建文件的 Symbol link (绝对路径) [p*]
        * Y 创建文件的 Symbol link (相对路径) [px*]
        * H 创建文件的 Hard link [p*]
        * % C 复制匹配 regexp 的文件 [p*]
        * % S 创建匹配 regexp 的 Symbol link (绝对路径) [p*]
        * % Y 创建匹配 regexp 的 Symbol link (相对路径) [p*]
        * % H 创建匹配 regexp 的 Hark link [p*]
    修改文件名、属性
        * M 修改文件 rwx 权限属性

  •     * G 修改文件 Group 属性 [p*]
        * O 修改文件 Owner 属性 [p*]
        * T 修改文件的时间戳 [p*]
        * % l 文件名逐一改为小写 [p*]
        * % u 文件名逐一改为大写 [p*]
        * % R, % r 重命名/移动匹配 regexp 的文件 [p*]
    访问文件,目录
        * e, f, RET 打开文件或目录
        * a 打开文件或目录,并替换当前缓冲
        * v 使用 view 模式查看文件,q 退出,有些文件使用外部查看程序调用
        * o 另一个窗口中,打开文件或目录
        * C-o 另一个窗口中,打开文件或目录,但当前窗口不变
        * F 打开(多个)文件 [x*]
        * I 使用 Info 模式查看文件
        * N 使用 man 模式查看文件,若有前缀参数,提示输入处理命令 [ux*]
        * V 使用 RMAIL 模式查看文件 [x]
    退出
        * ^ 访问目录的父目录,若有前缀参数在另外的窗口中打开 
        * q 退出缓冲,若有前缀参数则关闭缓冲 
    隐藏/刷新缓冲中内容
        * s 互换缓冲中“文件名/时间”排序 
        * C-u s 修改传递给 ls 的参数,即修改每行的内容
        * i 把当前行的子目录插入缓冲中
        * M-o 隐藏/显示部分次要文件,使缓冲更简便,若有前缀参数标记隐藏的文件 [ux]
        * $ 隐藏/显示当前目录中内容 [p]
        * M-$ 隐藏/显示缓冲中所有目录内容
        * k 隐藏文件,按 g 可以再显示出来 [p*]
        * l 刷新缓冲文件 [p*]
        * g 刷新缓冲所有文件
        * C-/, C-_, C-x u dired 模式的 undo
    其他
        * = 比较文件
        * M-= 文件和备份之间比较,若有前缀参数,提示输入 diff 选项 
        * w 复制文件名到 kill-ring [p*]
        * Z 压缩/解压缩文件 [p*]
        * X 在文件上执行 shell 命令 [p*]
        * B 编译(Emacs Lisp)文件 [p*]
        * L 加载(Emacs Lisp)文件 [p*]
        * y 给出文件类型信息 (通过 file 命令)
        * P 打印文件 [p*]
    dired-x.el 中的其他有用的函数
    dired-mark-extension    按后缀标记
        dired-flag-extension 按后缀标记删除 
    dired-clean-patch       标记删除 patch 文件
      dired-clean-tex         标记删除 tex 编译文件
      dired-very-clean-tex    标记删除 tex 编译文件
      dired-jump              跳转到当前缓冲所在目录
      dired-jump-other-window 在另一个窗口中跳转到当前缓冲所在目录
      dired-omit-here-always  在当前目录生成 .dired  文件    

                    
                    
                    

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/15586/showart_1163118.html

  发表评论 查看评论(共有条评论) 我要提问 

 

 

http://lifegoo.pluskid.org/wiki/EmacsAsFileManger.html

nc.el

如果你很喜欢 Norton Commander 的话,这个扩展正是在 Emacs 里模拟出 Norton Commander 来。功能比较强大,同时又简单好用。

dired

dired 是 Emacs 自带的文件管理器,操作非常方便,再加上一些扩展之后无疑是 一个理想的文件管理器。看看这里来了解如何增强你的 dired 。

Mark & Flag

dired 最方便的一点就是可以对许多文件进行标记,并进行批量操作。标记的方 法有很多,最普通的标记就是 d 为当前文件贴上删除标签,之后可以使用 x 来 真正删除所有贴上删除标签的文件。

dired 还提供了许多预定义的方便的标记操作(当使用 C-u 传递一个前缀参数 时,他们执行相反操作,即去掉标记),例如:

  • # 为所有自动保存的文件(通常是文件名开始和结尾都是 # 的文件)贴上删除 标签。
  • ~ 为所有备份文件(即文件名以 ~ 结尾的文件,Emacs 和 vi 等编辑器默认 情况下都会产生这样的文件)贴上删除标签。
  • & 为“垃圾文件”(看 dired-garbage-files-regexp 的值可以知道 dired 把 哪些文件当作了垃圾文件)贴上删除标签。

通常这些命令可以方便地帮你清理垃圾,如果还不满意,可以使用 % d REGEXP <RET> 来输入自己的正则表达式,匹配到的文件会被贴上删除标签。

当然,能用的标签并不止是 D (即删除标签),几乎任何一个字符都可以使用,不 过最常用的还是 * , m 命令即是以 * 标记当前文件。同样,dired 提供了很多 方便的标记操作(这些命令在传递一个前缀参数的时候都会执行相反的操作,例如 C-u * * 会去掉所有可执行文件的标记):

  • * * 标记所有可执行文件。
  • * @ 标记所有符号链接。
  • * / 标记所有目录(不包括 . 和 .. )。
  • * s 标记所有文件(不高考 . 和 .. )。
  • * . 标记具有给定扩展名的文件。
  • % m REGEXP <RET> 或 * % REGEXP <RET> 标记所有匹配到给定的正则表达式 的文件。
  • % g REGEXP <RET> 标记所有文件 内容 匹配到给定的正则表达式的文件。

另外,还有一些相关的命令:

  • u 去除当前行的标记。
  • <DEL> 上移一行并去除该行的标记。
  • U 去除所有标记。
  • * ? MARKCHAR 或 M-<DEL> 去除所有以 MARKCHAR 标记的文件的标记,如果 传递一个前缀参数,则会对每一个文件要求你确认是否去除标记。
  • t 交换标记,即所有原来标记为 * 的文件被置于未标记状态,原来未标记的 文件被标记为 * ,原来有其他标记的文件不受影响。

上面的操作都是使用 * 进行标记,但是 dired 可以使用更多的字符进行标记, 只是没有提供相应的快捷键操作而已,你可以先以 * 标记,然后使用 * c OLD-MARKCHAR NEW-MARKCHAR 来把 * 标记变换成其他标记,几乎任何字符(当然 不包括中文这种多字节的字符)都可以作为标记,不过空格被特殊对待,用于表示 所有未标记的文件。

列举了这么多命令,多少有些枯燥,作为一个例子,我们来把当前目录下的所有 备份文件移动到 ~/backup 目录下。假设当前目录已经有一些文件被你以 D 标 记,但是暂时还不想删除:

  1. 选择个临时标记,比如 t ,只要保证当前 buffer 里面没有已经存在的 这种标记就行了。
  2. * c D t 把当前所有 D 标签换为 t 标签。
  3. ~ 以 D 标记所有备份文件。
  4. * c D * 把 D 标签换为 * 标签。
  5. R ~/backup <RET> 来把所有标记为 * 的文件移动到 ~/backup 目录里面。
  6. * c t D 恢复原来的 D 标记。

当然这要假设你原来没有设定其他的 * 标记,要不然你也可以再添加一个临时 标记。总之操作和清晰也很方便,感觉像在汇编语言里面使用寄存器一样,大多 数批量操作都是针对 * 标记的,所以对某个标记操作之前需要把他先转换为 * 标记。

另外,还有一个非常强大的标记的方法,绑定到 M-( 或 * ( 上。它可以让你使 用断言来决定标记哪些文件。 C-h f dired-mark-sexp RET 可以得到详细的文档。 这个功能非常强大,有点类似于 find 程序,例如,标记所有没有编译的Elisp 文件(如果编译了,那么会有一个同名,但是扩展名为 .elc 的文件存在) 的方法 是输入这个断言: (and (string-match "\\.el$" name) (not (file-exists-p (concat name "c")))) 。

文件操作

dired 内建了很多文件操作,对于操作的文件有一个统一的约定,按照顺序是:

  1. 如果你通过 C-u 传递一个前缀参数 N ,那么它对从当前行开始的 N 行执 行操作( N 也可以是负数)。
  2. 如果有被标记为 * 的文件,则以这些文件为操作对象。
  3. 只对当前光标所在的文件进行操作。

常用操作

这些命令全部绑定到大写字母上,记忆也非常方便:

  • C 拷贝文件。把 dired-recursive-copies 设为非 nil 的值可以递归拷贝目 录,通常我们设定为 top ,这表示对于顶层目录 dired 会先进行询问是否 要递归拷贝,而其中的子目录则不再询问。如果嫌询问太麻烦,可以直接设 置为 always 。
  • D 删除文件。类似的有一个 dired-recursive-deletes 变量可以控制递归删 除。
  • R 重命名文件,也就是移动文件。
  • H 创建硬链接。
  • S 创建软链接。
  • M 修改权限位,即 shell 里面的 chmod 命令。
  • G 修改文件所属的组。
  • O 修改文件的所有者。
  • T 修改文件的修改时间,类似于 shell 命令 touch 。
  • P 打印文件。
  • Z 压缩或解压文件。
  • L 把 Elisp 文件加载进 Emacs 。
  • B 对 Elisp 文件进行 Byte compile 。
  • A 对文件内容进行正则表达式搜索,搜索会在第一个匹配的地方停下,然后 可以使用 M-, 搜索下一个匹配。
  • Q 对文件内容进行交互式的正则表达式替换。

shell 命令

除了这些操作,还可以使用 ! 来执行 shell 命令。这里介绍了自动猜测 shell 命令的办法,就类似于通常的文件管理器里面以关联的程序打开了。

强大的重命名功能

dired 有一个文件名转换的理念,所以转换,并不一定是重命名,还可以是复制 和创建链接。所以,除了 % u 和 % l 重命名原文件为大写、小写外,一个使用 正则表达式进行转换的命令提供了四个选项: % X其中 X 可以是 R , C , H 和 S ,分别代表重命名、复制、创建硬链接和创建软链接,他们使用匹配和替换的 机制,这有点像 rename 这个程序,例如: % R \.[^.]*$ <RET> .1\& <RET> 给原来的文件名加个标号 1 ,把 foo.txt 变成 foo.1.txt 。

另外,dired 还有一个叫做 Wdired 的扩展可以直接在 dired 的 buffer 里面编 辑文件名来达到重命名的效果。使用 M-x wdired-change-to-wdired-mode 进入 编辑模式,这个时候可以直接像编辑普通文本一样编辑文件名,还可以添加路径 来实现把文件移动到其他目录。除了文件名可以编辑以外,其他部分被标记为只 读,但是如果把 wdired-allow-to-change-permissions 设为 t 的话,还可以 编辑文件的权限位。编辑完成之后使用 C-c C-c 来应用所做的编辑。非常方便。

排序和过滤

dired 有方便的排序功能,这里介绍了如何方便地使用排序功能。另外 dired 还有一个 k 用于去掉不想显示出来的文件,它并不删除磁盘上的文件,只是临 时从 dired 的 buffer 中去掉他们, g 刷新一下它们又会显示出来,这样,首 先用强大的标记功能进行标记,然后使用 k 去掉,就实现了过滤的功能。

子目录操作

dired 允许同时操作当前目录和子目录。在 dired-listing-switches 里面加入 R 选项就可以显示子目录,如果只是想临时显示某个子目录的内容,对该目录执 行 i 操作就会把该子目录的内容添加到 dired 当前 buffer 的末尾并把光标移 动到那里,dired 在移动之前会先设置一个 mark ,所以可以使用 C-u C-<SPC> (对于我来说,我把 set-mark-command 绑定到了 M-<SPC> 上,这里自然就是使 用 C-u M-<SPC> 了)回到原来的位置。

关于子目录的更多方便的操作可以参见 Emacs 的 info 文档。

其他功能

还有一些方便的功能,我把几个常用的命令列在这里:

  • + 创建目录
  • w 复制文件名,如果通过 C-u 传递一个前缀参数 0 ,则复制决定路径名, 如果只是 C-u 则复制相对于 dired 当前目录的相对路径。
  • I 把当前文件以 info 文档的格式打开。
  • N 把当前文件以 man 格式打开(使用 WoMan)。
  • Y 为所有标记的文件创建一个到指定目录的相对符号连接(即使用相对路径进 行引用,而不是绝对路径)。

 

 

posted @ 2013-09-18 14:35  陳聽溪  阅读(715)  评论(0)    收藏  举报