如何将键盘宏另存为Lisp函数?


41

我经常需要执行需要多个击键的一组步骤。对于同一会话,可以将这些步骤记录在键盘宏中。

一个示例是将频繁执行的搜索/替换操作另存为键盘宏。但是当我退出emacs时,该宏丢失了。

如何将常用的键盘宏另存为Lisp函数?

为了简单起见,我想将用“ def”替换“ abc”的动作保存为一个函数,以便可以在emacs会话中重用它。

Answers:


48

您可以按照以下步骤进行操作:

  • 选择您要进行搜索替换的区域。
  • 开始录制宏。

    M-x start-kbd-macro

  • 执行所需的操作M-x query-replace-regexp(将“ abc”替换为“ def”)并用于!在整个区域中强制搜索替换。
  • 停止录制宏。

    M-x kmacro-end-or-call-macro

  • 这样做M-x kmacro-name-last-macro,给宏观像一个描述性的名称replace-abc-with-def。然后,您就可以通过再次调用该宏M-x replace-abc-with-def
  • 现在,将该宏作为函数保存到在emacs初始化期间加载的文件中;例如,init.el
    • M-x insert-kbd-macro
    • 选择要在其中插入的命名宏。

自动创建的replace-abc-with-def函数定义如下所示:

(fset 'replace-abc-with-def
   (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([59 39 return 97 98 99 return 100 101 102 return 33] 0 "%d")) arg)))

现在,您可以M-x replace-abc-with-def在所有emacs会话中。


1
为+1 insert-kbd-macro。这就是问题的答案(此答案的其余部分提供了更多帮助)。
德鲁

6
还要注意,Emacs可以为键盘宏生成两种不同的格式。您何时获得哪一个insert-kbd-macro取决于您是使用命名kmacro-name-last-macro(如上述答案)还是name-last-kbd-macro
phils 2014年

1
请注意,如果使用name-last-kbd-macro格式(如上面的@phils所述),则最终将使用字符串而不是函数。fset将其设置为符号可让您使用Mx执行宏,但不能从lisp(commandp-> tfunctionp-> nil)调用它。奇怪的是,即使通过调用也call-interactively不起作用(尽管您可以使用execute-kbd-macro它来运行它)。
焦躁狂

24

@lunaryorn已经提到过elmacro,但是作为此软件包的作者,我认为提供一个示例很好。

如果您记录这样的宏:

F3 C-e M-b M-u C-a C-n F4

然后执行以下操作M-x elmacro-show-last-macro upcase-last-word产生一个缓冲区:

(defun upcase-last-word ()
  "Change me!"
  (interactive)
  (move-end-of-line 1)
  (backward-word 1)
  (upcase-word 1)
  (move-beginning-of-line 1)
  (next-line 1 1))

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.