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 一起使用吗? (事实上,解决了一般问题,以便任意键盘宏可以像使用 emacs lisp 一样使用 C-u C-x C-e
正常工作)
编辑,因为人们似乎误解了:
手动按键在 elisp 或 clojure 缓冲区中都可以正常工作。在一个 C-u C-x C-e 中使用 emacs lisp 进行评估,在其他中则在外部 clojure 进程中进行评估。
尝试运行包含 C-u C-x C-e 的键盘宏(记录在 clojure 缓冲区中)时会出现问题
在 clojure 缓冲区中运行宏,事情会以某种方式重新排序。看起来宏可能正在继续执行,即使 eval-paste 尚未完成。
我想知道是否有一种方法可以强制键盘宏(或相应的函数)按照与手动相同的顺序执行。
如果有必要,我很乐意将键盘宏转换为适当的 elisp 函数。
最佳答案
键盘宏是重复特定操作序列的一种快速但肮脏的方法。它们非常脆弱,因为它们记住按下的键,而不是它们调用的函数,因此它们可能会产生截然不同的结果,具体取决于它们调用的缓冲区、当前命令历史记录、窗口配置等等。
在您的情况下,宏中的某个键可能会在 clojure/nrepl 缓冲区中调用与您测试宏的缓冲区中不同的命令。您确实需要在将使用宏的缓冲区中定义宏。
如果你要重新使用宏,我建议你写一个emacs lisp 函数可以做你想做的事,而不是搞乱宏。
您可能会发现 (format-kbd-macro nil t)
的输出很有用,但请注意,您不应该使用 eval-last 等命令-sexp
在您的函数中,使用一个较低级别的函数来返回计算结果,而不是将其插入到当前缓冲区中。
关于emacs - 粘贴 clojure 评估结果时如何使 emacs 键盘宏正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14959155/