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的安装非常简单:
;; 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
#####################################
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
标 记,但是暂时还不想删除:
- 选择个临时标记,比如
t
,只要保证当前 buffer 里面没有已经存在的 这种标记就行了。 * c D t
把当前所有D
标签换为t
标签。~
以D
标记所有备份文件。* c D *
把D
标签换为*
标签。R ~/backup <RET>
来把所有标记为*
的文件移动到~/backup
目录里面。* 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 内建了很多文件操作,对于操作的文件有一个统一的约定,按照顺序是:
- 如果你通过
C-u
传递一个前缀参数N
,那么它对从当前行开始的N
行执 行操作(N
也可以是负数)。 - 如果有被标记为
*
的文件,则以这些文件为操作对象。 - 只对当前光标所在的文件进行操作。
常用操作
这些命令全部绑定到大写字母上,记忆也非常方便:
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
为所有标记的文件创建一个到指定目录的相对符号连接(即使用相对路径进 行引用,而不是绝对路径)。