CatCoding

Emacs: keyboard macros

2010-07-17

宏编辑

以前知道 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 下可以执行下面一系列快捷键来处理一行。

如果行数不多,那么敲几下键盘就可以了,如果是很多行呢,总不可能一直这样用手动的吧。上次遇到那个几百行的代码,每 行前面都有一个表示行数目的数字,一狠心写了个 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])

公号同步更新,欢迎关注👻
Tags: Emacs