10

我的意思不是清理 REPL 的文本输出;我的意思是清理 REPL 中的所有评估结果。在开发过程中,反复出现C-c C-q效率C-c M-j低下。


更新

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

例如,在一个clojure prog单元的顶部,我使用declare声明一个函数foo,该函数被另一个函数使用bar,并foo在之后实现bar。然后,我C-c C-k等,编得很好。后来,我删除了foo偶尔的前向声明。会发生什么?前卫还是很顺利。真的吗?然后,我完成了我的全部工作并愉快地终止了 CIDER REPL 会话。

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

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

4

5 回答 5

11

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

refresh 函数将扫描类路径上的所有目录以查找 Clojure 源文件,读取它们的 ns 声明,构建它们的依赖关系图,并按依赖顺序加载它们。

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

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

...卸载(删除)更改以清除任何旧定义的命名空间。

我们通常将它和一些其他有用的东西添加到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,然后将以下内容添加到您的 leinproject.clj文件中:

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

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

于 2015-02-07T08:14:39.070 回答
10

在 EMACS 中,当我在 cider 模式下使用 Clojure 时,我使用:

在 repl 缓冲区中抄送 Mo

它绑定到cider-repl-clear-buffer

于 2016-11-07T13:15:34.657 回答
6

就像其他人已经指出的那样,“正确”的解决方案是使用 Stuart Sierra 的组件库。

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

于 2015-02-08T07:57:11.257 回答
1

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

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

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

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

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

于 2015-02-06T17:40:44.097 回答
1

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

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

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

另一方面,如果您想这样做来清理不需要的 defn 或 defmacro 定义,即从您的 repl 中清除“污染”,那么老实说,我不会打扰。如果没有调用 defn 或宏,那真的没关系。

于 2015-02-07T23:40:40.963 回答