我经常需要执行需要多个击键的一组步骤。对于同一会话,可以将这些步骤记录在键盘宏中。
一个示例是将频繁执行的搜索/替换操作另存为键盘宏。但是当我退出emacs时,该宏丢失了。
如何将常用的键盘宏另存为Lisp函数?
为了简单起见,我想将用“ def”替换“ abc”的动作保存为一个函数,以便可以在emacs会话中重用它。
我经常需要执行需要多个击键的一组步骤。对于同一会话,可以将这些步骤记录在键盘宏中。
一个示例是将频繁执行的搜索/替换操作另存为键盘宏。但是当我退出emacs时,该宏丢失了。
如何将常用的键盘宏另存为Lisp函数?
为了简单起见,我想将用“ def”替换“ abc”的动作保存为一个函数,以便可以在emacs会话中重用它。
Answers:
您可以按照以下步骤进行操作:
开始录制宏。
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。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会话中。
insert-kbd-macro取决于您是使用命名kmacro-name-last-macro(如上述答案)还是name-last-kbd-macro。
                    name-last-kbd-macro格式(如上面的@phils所述),则最终将使用字符串而不是函数。fset将其设置为符号可让您使用Mx执行宏,但不能从lisp(commandp-> t,functionp-> nil)调用它。奇怪的是,即使通过调用也call-interactively不起作用(尽管您可以使用execute-kbd-macro它来运行它)。
                    @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))
insert-kbd-macro。这就是问题的答案(此答案的其余部分提供了更多帮助)。