【问题标题】:Convert Emacs macro into Elisp将 Emacs 宏转换为 Elisp
【发布时间】:2010-12-15 14:40:10
【问题描述】:

有没有办法将 emacs 宏转换为 elisp,不像 M-x insert-kbd-macro 所做的那样,实际活动变成 elisp 语句。

感谢您的帮助。

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    我在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 ". ") 这样的东西真的很酷,而不是“真正输入”的命令,这将与适当的模式一起工作。强大!
    • 很高兴你喜欢它 ;-)
    • 我只是偶然发现了这个。我也喜欢,谢谢 Silex。
    【解决方案2】:

    不,对不起。没有简单的方法可以将 emacs 宏转换为 elisp。

    更新:在 Emacs 上进行了一些工作以开始这条道路。请参阅this thread 作为起点。仍然不可能(2010 年 6 月),但有活动。

    我能想到的第一个原因是处理交互式命令并将击键转换为函数的正确参数。

    考虑以下顺序:

    C-x b .em TAB RET

    这开始了切换到缓冲区的命令,键入三个字符,使用 TAB 完成来完成它并 RET 接受。最终结果的等效 lisp(在 TAB 完成唯一的 emacs 会话中)是:

    (switch-to-buffer ".emacs")
    

    想到补全,还有各种类型的展开交互(dabbrevhippie-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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      相关资源
      最近更新 更多