IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Emacs: keyboard macros

    Yukang (moorekang@gmail.com)发表于 2010-07-17 00:00:00
    love 0

    宏编辑

    以前知道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调用。


沪ICP备19023445号-2号
友情链接