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

欢迎!有关此工作的更多信息,请参阅关于页面。

+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 (如下所示) 极大优化了我的工作流程。

再次感谢!

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