在粘贴clojure评估结果时,如何使emacs键盘宏正常工作?

时间:2013-02-19 13:50:44

标签: emacs clojure elisp nrepl eval-paste

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功能。

2 个答案:

答案 0 :(得分:1)

键盘宏是一种快速而又脏的方式来重复某些操作序列。它们非常脆弱,因为它们会记住按下的,而不是它们调用的函数,因此它们可能会产生截然不同的结果,具体取决于调用它们的缓冲区,当前命令历史,窗口配置和什么不是。

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

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

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

答案 1 :(得分:1)

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