宏编辑
以前知道Emacs有一个keyboard macros,不过一直没认真看一下,今天算是粗略懂了一些。宏编辑很早就有了,很多编辑器都有这种功能,word好像是有的,不过没用过,格式刷算宏编辑不?甚至Emacs 的起名有一种说法就是 Edit MACroS,最初是作为一个叫作TECO编辑器上的一套宏而编写,然后就是重写了N次,现在Emacs上还有个模拟TECO的模式:)。kbd macros就是把一系列要做的动作集合成一个,然后可以执行多次。以前有时在网上拷贝代码,但是前面都加有行好,不编辑一下不能编译,这种情况 就可以用这个kbd macro一下就解决了。 先来一个例子,比如说有这么一段文字:
Newton, Isaac
Einstein, Albert
Maxwell, James
Turing, Alan
...
现在要变成这个样子
Isaac Newton
James Maxwell
Alan Turing
...
在Emacs下可以执行下面一系列快捷键来处理一行。
action |
key |
到行首 |
C-a |
剪切第一个word, |
M-d |
删除下面两个空格 |
DEL DEL |
到行尾 |
C-e |
插入一个空格 |
SPC |
粘贴 |
C-y |
到下一行 |
C-n |
定义一个kbd macro
如果行数不多,那么敲几下键盘就可以了,如果是很多行呢,总不可能一直这样用手动的吧。上次遇到那个几百行的代码,每 行前面都有一个表示行数目的数字,一狠心写了个C程序来处理,囧。为了不让手指报废,定义一个kbd macro是很快速的方法。也就是在我处理的一行的之前按F3(或者"C-x (" ),在处理第一行的时候Emacs已经在记录这即个命令,结束完一行的处理就可以按F4(或者"C-x )"。这样就已经完成了定义。
使用宏
定义好以后下面的很多行都可以使用这个宏去操作,只要按C-x e就是执行上一次定义的宏,C-u 20 C-x e执行20次,甚至可以选中一个区域然后执行M-x apply-macro-to-region-lines (或者 C-x C-k r)。但这个时候宏里面别加go-to-the-next-line,因为上面这个命令就已经是逐渐移动区域的每一行,执行上面的宏,如果再加goto命 令就会跳过一些行。另外还可以手动编辑这个宏,命令M-x edit-kbd-macro,会让你选择要编辑的宏,比如说选刚才保存的那个宏,得到:
;; Keyboard Macro Editor. Press C-c C-c to finish; press C-x k RET to cancel.
;; Original keys: C-a M-d 2*C-d C-e SPC C-y C-n
Command: last-kbd-macro
Key: none
Macro:
C-a ;; move-beginning-of-line
M-d ;; kill-word
2*C-d ;; delete-char
C-e ;; move-end-of-line
SPC ;; self-insert-command
C-y ;; yank
C-n ;; next-line
编辑完后按C-c C-c完成。
如果这个操作经常会用到(比如清楚带行号的代码),还可以把这个操作保存下来,以后都可以用。在.emacs或者自己的配置文件中增加:
(fset 'foo
[?\C-a ?\M-d delete delete ?\C-e ? ?\C-y ?\C-n])
然后可以把这个函数绑定个快捷键,或者直接M-x调用。