【发布时间】:2010-12-15 14:40:10
【问题描述】:
有没有办法将 emacs 宏转换为 elisp,不像 M-x insert-kbd-macro 所做的那样,实际活动变成 elisp 语句。
感谢您的帮助。
【问题讨论】:
有没有办法将 emacs 宏转换为 elisp,不像 M-x insert-kbd-macro 所做的那样,实际活动变成 elisp 语句。
感谢您的帮助。
【问题讨论】:
我在https://github.com/Silex/elmacro制作了一个几乎完全允许这样做的包
它有一些怪癖,但效果很好......例如,以下宏:
F3 C-e M-b M-u C-a C-n F4
生成以下省略号:
(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 ". ") 这样的东西真的很酷,而不是“真正输入”的命令,这将与适当的模式一起工作。强大!
不,对不起。没有简单的方法可以将 emacs 宏转换为 elisp。
更新:在 Emacs 上进行了一些工作以开始这条道路。请参阅this thread 作为起点。仍然不可能(2010 年 6 月),但有活动。
我能想到的第一个原因是处理交互式命令并将击键转换为函数的正确参数。
考虑以下顺序:
C-x b .em TAB RET
这开始了切换到缓冲区的命令,键入三个字符,使用 TAB 完成来完成它并 RET 接受。最终结果的等效 lisp(在 TAB 完成唯一的 emacs 会话中)是:
(switch-to-buffer ".emacs")
想到补全,还有各种类型的展开交互(dabbrev、hippie-expand等)。
起点可以是 M-x edit-last-kbd-macro (在我的情况下)显示如下:
;; Keyboard Macro Editor. Press C-c C-c to finish; press C-x k RET to cancel.
;; Original keys: C-x b .em <tab> RET
Command: last-kbd-macro
Key: none
Macro:
C-x b ;; switch-to-buffer
.em ;; self-insert-command * 3
<tab> ;; pabbrev-expand-maybe
RET ;; newline-and-indent
这至少为您提供了一些函数名称。但是您会看到 RET 被标记为 'newline-and-indent,这是不正确的,因为在宏执行时,迷你缓冲区处于活动状态,并且绑定实际上是 'minibuffer-complete-and-exit。同样,TAB 的正确绑定是'minibuffer-complete。
【讨论】: