我经常需要执行需要多个击键的一组步骤。对于同一会话,可以将这些步骤记录在键盘宏中。
一个示例是将频繁执行的搜索/替换操作另存为键盘宏。但是当我退出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
。这就是问题的答案(此答案的其余部分提供了更多帮助)。