【问题标题】:Stopping infinite loops while running clojure tests in emacs with leiningen and swank/slime在使用 leiningen 和 swank/slime 在 emacs 中运行 clojure 测试时停止无限循环
【发布时间】:2011-02-25 03:50:20
【问题描述】:

在某些类型的代码中,相对容易导致无限循环而不会破坏堆栈。在使用 clojure-test 测试这种性质的代码时,有没有办法在不重新启动 swank 服务器的情况下中止当前正在运行的测试?

目前我的工作流程已经涉及到

$ lein swank

使用 slime-connect 连接到 emacs 的 swank,然后切换到测试,使用 C-c C-, 执行,测试一直运行到无限循环,然后返回,但一个 cpu 仍在测试中运行。我发现阻止这种情况的唯一方法是重新启动 lein swank,但这似乎是一个相对常见的问题?谁有更好的解决方案?

【问题讨论】:

    标签: emacs clojure slime leiningen swank


    【解决方案1】:

    是的,程序员在开发中编写无限循环是一个常见的问题:)。答案很简单。它被称为“中断命令”,它是C-c C-b

    Leiningen 与此无关。这是 SLIME/Swank/Clojure。当您在 Emacs 中评估代码时,您将在 Clojure 中生成一个新线程。 SLIME 保持对这些线程的引用,并向您显示在 Emacs 模式行中运行的线程数。如果您在图形环境中,您可以单击指示您的命名空间的模式行并查看许多选项。一种选择是“中断命令”

    评估(while true)C-c C-b 得到一个对话框,显示java.lang.ThreadDeath 错误,可能只有一个选项。您可以键入 0q 以退出该线程,终止该错误消息缓冲区并将焦点返回到您之前的缓冲区。

    【讨论】:

    • 它必然会在 CIDER 中中断苹果酒,它就像一个魅力。
    【解决方案2】:

    根据this old discussion,将(use 'clojure.contrib.repl-utils))(add-break-thread!) 添加到user.clj 应该使您能够按C-c C-c 将SIGINT 传递给长期运行的评估/进程。

    【讨论】:

    • 我当前的 Emacs 设置将 C-c C-c 绑定到 slime-interrupt,其行为与您预期的一样
    【解决方案3】:

    如果一切都失败了..alt-x slime-quit-lisp 并重新启动 REPL。当然首先尝试 Psyllo 的答案。

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      相关资源
      最近更新 更多