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

粘贴clojure评估结果时,如何使emacs键盘宏正常工作?,emacs,clojure,elisp,nrepl,eval-paste,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

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的C-u C-x C-e评估中,以及在外部clojure过程中的其他评估中

当尝试运行包含C-u C-x C-e的键盘宏(记录在clojure缓冲区中)时会出现问题

在clojure缓冲区中运行宏,事情会以某种方式重新排序。看起来宏可能正在执行,即使评估粘贴尚未完成

我想知道是否有办法强制键盘宏(或相应的函数)以与手动相同的顺序执行


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

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

在您的例子中,宏中的一个键很可能在clojure/nrepl缓冲区中调用与您测试宏的缓冲区中不同的命令。您确实需要在缓冲区中定义要使用的宏

如果要重复使用宏,我建议您编写一个emacs lisp函数,它做你想做的事情,而不是与宏混乱


您可能会发现
(format kbd macro nil t)
的输出很有用,但请注意,您应该不要在函数中使用
eval last sexp
等命令,使用一个较低级别的函数返回计算结果,而不是将其插入当前缓冲区。

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

C-xC-e是根据内部lisp过程(即clojure)而不是Emacs lisp来评估表单。菲尔,这取决于你所说的“因此”是什么意思。看起来宏在执行eval粘贴时仍在运行。有没有一种方法可以等待它完成,而不是(显然)分叉一个单独的线程?谢谢,但这不是问题所在。同样的按键也可以手工操作。我认为这与手工操作时在它们之间有短暂的停顿有关。不要使用宏。编写一个函数,在clojure中计算代码并插入结果。这将解决您的计时问题。(defun my eval paste()(交互式)(下一行)(插入“(is=”)(forward sexp)(insert“”)(eval last sexp't)(insert”))在elisp中不起作用。我以(is=(*89)72(#o110,#x48))结尾。你能看到(#o110,#x48)是从哪里来的吗?clojure版本(defun my eval paste()(interactive)(下一行)(insert)(is=“)(forward sexp)(insert”“)(nrepl eval last expression't)(insert”))几乎可以工作,但我以(is=(*89))72结尾,就好像insert“)”在粘贴发生之前执行。不要使用
nrepl eval last表达式
eval last sexp
;使用返回字符串而不是插入字符串的低级函数。