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



我不是要清理REPL的文本输出;我的意思是清理REPL中所有评估的结果。在显影过程中,重复使用C-c C-qC-c M-j效率较低。


更新

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

例如,在clojure程序单元的顶部,我使用declare声明一个函数foo,该函数由另一个函数bar使用,而foo是在bar之后实现的。然后,我C-c C-k等,程序运行良好。后来,我偶尔删除了foo的正向声明。发生了什么?节目仍然进行得很顺利真的?然后,我提交了我的全部工作,并愉快地终止了CIDERREPL会话。

上午发生灾难:找不到符号foo

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

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

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

https://github.com/clojure/tools.namespace#reloading-代码使用

它似乎没有删除user命名空间中声明的vars,我已经在REPL中键入了这些vars,但它确实删除了:

卸载(移除)已更改的名称空间以清除任何旧名称空间定义。

我们通常会将其加上其他一些有用的东西添加到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"]}}

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

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

C-C M-o在复制缓冲中

它与cider repl清除缓冲液

绑定

正如其他人已经指出的,"正确"的解决方案是使用Stuart Sierra的组件库。

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

如果你正在处理大量的事情,这些事情的状态是你想要清除的,以拥有一个干净的开发环境,你可以考虑做以下之一:

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

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

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

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

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

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

另一种方法是使用defence而不是def编写代码,这将允许您在不重新定义状态变量的情况下重新加载源代码。

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

最新更新