【问题标题】:How to clear the REPL in cider-mode?如何在苹果酒模式下清除 REPL?
【发布时间】:2015-04-06 21:50:28
【问题描述】:

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


更新

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

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

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

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

【问题讨论】:

    标签: emacs clojure leiningen read-eval-print-loop cider


    【解决方案1】:

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

    C-c M-o 在 repl 缓冲区中

    绑定到 cider-repl-clear-buffer

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • C-c C-x 绑定是什么?我通过M-x 运行该函数。这就是我需要的。一个完美的解决方案。谢谢。
      • @DanielWu,绑定到cider-refresh。您总是可以使用 C-h k 后跟绑定来询问 Emacs 键绑定到什么,例如C-h k C-c C-x.
      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        我们通常会在 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)

        【讨论】:

          【解决方案5】:

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

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

          推测使用状态的正当理由:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-12-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-07
            • 2023-03-08
            • 2014-12-01
            相关资源
            最近更新 更多