嗨,我扩展了 CIDER 和 clojure-mode,以便它们以这种方式精确地协同工作。你是对的,你正在查看的评估函数试图在源缓冲区中显示结果,这在某些情况下很有用,但REPL提供了更多功能。
有一个按键绑定 C-c C-j
,指向 cider-insert-commands-map
。在这里你会发现
C-c C-j e
: cider-insert-last-sexp-in-repl
C-c C-j d
: cider-insert-defun-in-repl
C-c C-j r
: cider-insert-region-in-repl
C-c C-j n
: cider-insert-ns-form-in-repl
这里重要的是 e
和 d
,分别对应最后一个表达式和顶部表达式。这些将表达式发送到REPL。但是,还有一些配置需要设置。
默认情况下,此工作流程将表达式放入REPL,并期待你继续输入。但我们要在不将该焦点放在REPL上的情况下发送表达式以进行评估。因此,我们需要设置两个选项
(setq cider-switch-to-repl-on-insert nil)
(setq cider-invert-insert-eval-p t)
第一个选项表示我们不想在REPL上放置焦点,保持光标(Emacs术语)当前所在位置。第二个选项是告诉CIDER我们不希望继续输入并修改表达式,仅仅评估它。
只剩下最后一件事要做。当使用 C-c C-j d
发送顶级表达式时,默认情况下,CIDER可能会发送整个顶级表达式
(comment
(map inc (range 3))
)
但我们想修改被认为是顶级表达式的表达式,并在注释形式中,将 (map inc (range 3))
看作顶级表达式,而不是整个 comment
表达式。这可以通过以下方式得到解决
(setq clojure-toplevel-inside-comment-form t)
现在,你可以在 (map inc (range 3))
的任何地方发送顶级表达式,而不是整个 comment
表达式。