2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以获取更多关于该工作原理的信息。

+1 投票
REPL
编辑

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

我在使用 Cider 在 Emacs 中。历史上,我倾向于仅仅重新加载文件然后直接在 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,并假设你将继续输入。但我们需要不将焦点放在那里,并直接评估表达式。因此,我们需要设置两个选项

(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 (见下文) 绑定到快捷键可以真正优化我的工作流程。

再次感谢!

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