Clojure 2024调查问卷中分享您的想法!

欢迎!有关如何运行的更多信息,请参阅关于页面。

+1
REPL
编辑

这是一个Emacs问题,但是由于有那么多Clojure Emacs用户,所以我在这里提问,因为这让我对人们的知识和乐于助人感到惊讶。

我在Emacs中使用Cider。历史上,我倾向于只是重新加载文件,然后直接在REPL中输入。我最近注意到还有另一种在(注释. . .)块中进行编写/测试的风格。我真的很喜欢这种风格,但对我来说它并不完全无缝。 (我知道这在JSCode中工作得很好,但我无法再训练我的手指……)

有两个命令看起来对将源文件中的代码评估到REPL中非常有用

1) cider-eval-sexp-at-point
2) cider-eval-last-sexp-to-repl

cider-eval-sexp-at-point的问题在于结果会被发送到消息缓冲区,而不是到REPL

cider-eval-last-sexp-to-repl的问题虽然会将评估结果发送到REPL缓冲区,但它是发送到光标所在的任何地方,而不是REPL的末尾。而且,它不会执行一个“返回”,所以光标还没有准备好进行另一次评估。理想情况下,我希望能评估另一段代码,并且以一个全新的光标结束。

也许有一种方法可以做到这一点,那将是非常理想的。否则,我正在考虑编写一个新的Emacs命令来实现这个功能。

作为一个漫长的Emacs用户(目前是Doom Emacs),我已经编写了一些基本的函数,但这比我以前的尝试要复杂。所以任何建议都将受到欢迎。(我可能也会在Emacs网站上发帖。)

以下就是基本函数的基本功能
1) 在 Clojure 文件中开始,光标位于sexp的末尾。
2) 执行功能。
3) sexp会被评估。
4) 在REPL缓冲区中,光标会移动到REPL的末尾,根据需要刷新光标。
5) 评估结果将随后被打印(在REPL的末尾)。
6) 然后将向REPL发送“返回”,因此会有一个新的光标。
7) Clojure文件中的原始点位置不会移动。
8) 这样就可以在Clojure文件内重复此函数,而无需在REPL之间移动。

这几乎等同于 cider-eval-last-sexp-to-repl 的功能。如上所述,它不会首先前往REPL的末尾,并且也不会发送“返回”。

欢迎提出建议。

1 答案

+1
by

嗨,我扩展了 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

这里重要的是 ed,分别对应最后一个表达式和顶部表达式。这些将表达式发送到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 表达式。

dpsutton - 真是一个既快又精彩的回答!这个调整让我达到了预期的Cider工作流程。防止注释块成为顶级表单的额外设置是我完全没有预期能够解决的。我已经修改了我的config.el文件,并且一切工作都如我所希望的那样。下面展示的'cider-insert-defun-in-repl的绑定('cider-insert-defun-in-repl)实际上优化了我的工作流程。

再次感谢!

(define-key cider-mode-map (kbd "C-c RET") 'cider-insert-defun-in-repl)
...