在使用Leiningen和Swank/Slime在Emacs中运行Clojure测试时如何停止无限循环

12

在某些代码中,很容易造成无限循环但不会使堆栈溢出。当使用clojure-test测试此类代码时,有没有一种方法可以中止当前正在运行的测试而不必重启swank服务器?

目前我的工作流程包括

$ lein swank

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

3个回答

13

是的,程序员在开发中写无限循环是一个常见问题 :). 解决方法非常简单。它被称为“中断命令”,其快捷键为C-c C-b

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

评估(while true)C-c C-b,会出现一个对话框,显示一个java.lang.ThreadDeath错误,可能只有一个选项。您可以输入0q来退出该线程,关闭该错误消息缓冲区,并返回到以前的位置。


它在CIDER中绑定到cider-interrupt,而且它的效果非常好。 - HappyFace

2
根据这篇旧的讨论,在user.clj中添加(use 'clojure.contrib.repl-utils))(add-break-thread!)应该可以使您按下C-c C-c将SIGINT传递给长时间运行的评估/进程。

我的当前Emacs设置将C-c C-c绑定到slime-interrupt,它的行为与您预期的相同。 - skuro

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接