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缓冲区中正常工作。在一个C-u C-x C-e版本中使用emacs lisp和外部clojure过程中的其他版本。
尝试运行包含C-u C-x C-e的键盘宏(记录在clojure缓冲区中)时出现问题
在clojure缓冲区中运行宏,事情会以某种方式重新排序。即使eval-paste还没有完成,看起来宏可能正在执行。
我想知道是否有一种方法可以强制键盘宏(或相应的功能)以与手动相同的顺序执行。
如果有必要,我很乐意将键盘宏转换为正确的elisp功能。
答案 0 :(得分:1)
键盘宏是一种快速而又脏的方式来重复某些操作序列。它们非常脆弱,因为它们会记住按下的键,而不是它们调用的函数,因此它们可能会产生截然不同的结果,具体取决于调用它们的缓冲区,当前命令历史,窗口配置和什么不是。
在您的情况下,可能是宏中的一个键在clojure / nrepl缓冲区中调用的命令与在您测试宏的缓冲区中调用的命令不同。你真的需要在缓冲区中定义宏来使用它。
如果你要重新使用宏,我建议你写一个emacs lisp函数可以执行您想要的操作,而不是弄乱宏。
您可能会发现(format-kbd-macro nil t)
的输出很有用,但请注意您应该不在您的函数中使用eval-last-sexp
之类的命令,使用较低级别的函数< strong>返回评估结果,而不是将插入当前缓冲区。
答案 1 :(得分:1)
解决你尚未遇到的问题,但很快就会:在评估表达式的结果之前不要忘记插入'
字符:你想要(= (cons 1 nil) '(1))
,而不是{{1 }}