2

emacs lisp 有一个非常有用的功能,您可以在其中评估表达式的结果并将结果直接粘贴到缓冲区中。

假设我想检查附加作品。然后我输入:

(* 3 2)

我定义了键盘宏:

(setq last-kbd-macro
   [down ?\( ?i ?s ?= ?  ?\C-\M-f ?  ?\C-u ?\C-x ?\C-e ?\) home])

如果我然后将点放在表达式上方,然后按 F4 执行宏,则表达式变为:

(is= (* 3 2) 6)

这是一个很好的回归测试。

不幸的是,在 clojure/nrepl 缓冲区中执行的相同键盘宏会导致:

(* 8 9)(is=  )

以及来自 clojure 的关于无法解析符号的错误is=

所以我认为事情的排序发生了一些奇怪的事情,宏正试图评估错误的事情。

任何人都可以让它与clojure一起使用吗?(实际上解决了一般问题,以便任意键盘宏可以C-u C-x C-e像使用 emacs lisp 一样正常工作)


编辑因为人们似乎误解了:

手动按键在 elisp 或 clojure 缓冲区中都可以正常工作。在一个带有 emacs lisp 的 Cu Cx Ce evals 和在外部 clojure 过程中的其他 evals 中。

尝试运行包含 Cu Cx Ce 的键盘宏(记录在 clojure 缓冲区中)时出现问题

在 clojure 缓冲区中运行宏,事情会以某种方式重新排序。即使 eval-paste 尚未完成,看起来宏可能仍在执行。

我想知道是否有一种方法可以强制键盘宏(或相应的功能)以与手动相同的顺序执行。

如有必要,我很乐意将键盘宏转换为适当的 elisp 函数。

4

2 回答 2

1

键盘宏是重复特定操作序列的一种快速而肮脏的方式。它们非常脆弱,因为它们记住的是按下的,而不是它们调用的函数,因此它们可能会根据调用它们的缓冲区、当前的命令历史记录、窗口配置等等产生截然不同的结果。

在您的情况下,宏中的一个键可能会在 clojure/nrepl 缓冲区中调用与您在其中测试宏的缓冲区中不同的命令。您确实需要在将要使用它的缓冲区中定义宏。

如果您要重新使用宏,我建议您编写一个 emacs lisp 函数来执行您想要的操作,而不是弄乱宏。

您可能会发现输出(format-kbd-macro nil t)有用,但请注意,您不应使用函数中的命令,使用返回评估结果eval-last-sexp的低级函数,而不是其插入当前缓冲区。

于 2013-02-19T14:49:43.560 回答
1

解决您尚未遇到但很快就会遇到的问题:不要忘记'在计算表达式的结果之前插入一个字符:您想要(= (cons 1 nil) '(1)),而不是(= (cons 1 nil) (1))

于 2013-02-19T21:41:41.860 回答