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

标签 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 一起使用吗? (事实上​​,解决了一般问题,以便任意键盘宏可以像使用 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/

相关文章:

Clojure:为什么 if-let 只允许绑定(bind)向量中有 2 种形式?

emacs - EShell中的多行输入

emacs - 在 Emacs Lisp 中检查 forward-sexp 是否成功

python - Pymacs - 无法调用使用 pymacs-eval 获得的方法

emacs - 用flyspell标记所有拼写错误的单词,即使在当前 session 期间未写的单词也是如此

emacs - 如何为 Org 模式内联源代码 src_lang{} 突出显示语法?

emacs - emacs 中的 "history"文件在哪里?

clojure - lein repl (-main "something") 和 lein run "something"之间的区别

clojure - Leiningen:如何在 project.clj 中定义常量?

Emacs CEDET 语义标签折叠