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

时间:2015-02-06 17:11:36

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

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


更新

我的调试行为可能有些不好。我不确定其他人如何用CIDER开发prog,但我真的需要上面提到的功能。我猜其他开发人员也会遇到与我相同的问题。

例如,在clojure prog单元的顶部,我使用declare声明一个函数foo,该函数由另一个函数barfoo使用在bar之后实施。然后,我C-c C-k等,编程进展顺利。后来,我偶尔删除了foo的前瞻声明。怎么了?编程仍然顺利。 ?然后,我完成了整个工作并愉快地终止了CIDER REPL会议。

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

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

5 个答案:

答案 0 :(得分:10)

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

  

刷新函数将扫描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的文件中,然后将以下内容添加到lein project.clj文件中:

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

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

repl缓冲区中的

C-c M-o

它与 cider-repl-clear-buffer

绑定

答案 3 :(得分:1)

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

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

假设使用州的正当理由:

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

3。)Stuart Sierra的component图书馆旨在管理涉及国家的组件。对于管理数据库连接,内存缓存客户端等非常有用,但需要对项目进行重新架构才能充分利用它。

答案 4 :(得分:1)

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

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

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

另一方面,如果你想这样做来清理defn或defmacro的定义,你就不需要清理掉#polution&#39;从你的repl,然后说实话,我不会打扰。如果没有任何东西可以称之为定义或宏观,那真的无关紧要。