如何在苹果酒模式下清除 REPL?

How to clear the REPL in cider-mode?

我不是要清理 REPL 的文本输出;我的意思是清理 REPL 中所有 evaluated 结果。开发中,重复C-c C-qC-c M-j效率低下。


更新

我的调试行为可能有些不好。我不确定其他人如何使用 CIDER 开发程序,但我确实需要上述功能。我想其他开发者也遇到了和我一样的问题。

例如,在 clojure prog 单元的顶部,我使用 declare 声明一个函数 foo,它被另一个函数 bar 使用,并且 foobar之后实现。然后,我 C-c C-k,等等,程序进展顺利。后来偶尔去掉了foo的前向声明。发生了什么?该编仍然顺利。 真的?然后,我提交我的全部工作并愉快地终止 CIDER REPL 会话。

早上的灾难:找不到符号foo

这就是我的故事。所以,没有人遇到过类似的问题吗?

如果您正在处理大量具有您想要清除的状态以拥有干净的开发环境的事物,您可以考虑执行以下操作之一:

1.) 重新评估您的设计并查看实际需要多少状态。在许多情况下,您可能会不必要地使用 atom、refs 或其他有状态项,如果您采用更实用的方法,您将不会发现自己需要经常清理开发环境。

假设使用状态的正当理由:

2.) 您可以使用 clojure 函数 remove-ns 清除命名空间及其所有内容:例如对于名为 user.fancy-namespace 的命名空间,您可以通过 运行 (remove-ns 'user.fancy-namespace') 清除 NS,然后简单地重新评估命名空间。这适用于清理单个命名空间,但如果您需要清理的有状态项位于其他命名空间中,则对涉及的每个命名空间执行此操作可能会很乏味。

3.) Stuart Sierra 的 component 库旨在管理涉及状态的组件。对于管理数据库连接、内存缓存客户端等非常有用,但需要重新构建项目才能充分利用它。

尝试 clojure.tools.namespace.repl 命名空间中的 (refresh) 函数:

The refresh function will scan all the directories on the classpath for Clojure source files, read their ns declarations, build a graph of their dependencies, and load them in dependency order.

https://github.com/clojure/tools.namespace#reloading-code-usage

它似乎没有删除我在 REPL 中输入的 user 命名空间中声明的变量,但它确实删除了:

...unload (remove) the namespaces that changed to clear out any old definitions.

我们通常将它加上一些其他有用的东西添加到 user 命名空间,因此它会在启动时加载到 REPL 中:

(ns user
  (:require [clojure.tools.namespace.repl :refer [refresh]]
            [clojure.repl :refer [doc source]]
            [clojure.pprint :refer [pprint pp]]
            [midje.repl :as midje]
            [clojure.stacktrace :as st]))

要将该代码与您的主要源代码和测试源代码分开,请将其放在 <project root>/dev/user.clj 的文件中,然后将以下内容添加到您的 lein project.clj 文件中:

:profiles {:dev {:source-paths ["dev"]}}

(p.s。虽然这不是你想要回答的问题,但对于那些看到这个答案并想清除 Cider REPL 中文本的人来说,它是 C-c M-o (https://github.com/clojure-emacs/cider)

正如其他人所提到的,如果您有保存状态信息的变量,则只需要清除repl。对于非状态承载组件,只需重新加载源缓冲区(重新评估)就足够了。

管理具有跟踪状态组件的工作流的一种非常有趣的方法是 Stuart Seirra 的组件框架。参见 http://youtu.be/13cmHf_kt-Q

另一种方法是使用 defonce 而不是 def 编写代码,这将允许您重新加载源代码而无需重新定义状态变量。

如果另一方面,你想这样做来清理你不需要的 defn 或 defmacro 定义,即从你的 repl 中清理掉 'polution',那么说实话,我不会打扰.如果没有任何东西在调用 defn 或宏,那真的没关系。

正如其他人已经指出的那样,'proper' 解决方案是使用 Stuart Sierra 的 component 库。

但是由于您运行正在使用 CIDER,您可以使用 C-c C-x 到 运行 cider-refresh,这将重新加载您的项目,从而重新创建您的初始状态.

在 EMACS 中,当我在苹果酒模式下使用 Clojure 时,我使用:

C-c M-o 在 repl 缓冲区

它绑定到 cider-repl-clear-buffer