如何在Leiningen REPL中捕获Ctrl-C?
set-break-handler!
似乎没有效果:
user=> (set-break-handler! (fn [sig] (println "HERE!" sig)))
#object[clojure.repl.proxy$java.lang.Object$SignalHandler$d8c00ec7 0x22e61b57
"clojure.repl.proxy$java.lang.Object$SignalHandler$d8c00ec7@22e61b57"]
user=>
第二个提示后(如果你能看到它)那个有趣的字符是ASCII 3.那是我按下Ctrl-C时出现的。似乎Leiningen已禁用Ctrl-C和SIGINT信号之间的连接。 (这是在Linux系统上。)Leiningen将Ctrl-C视为另一个角色。如果我按Enter键,Clojure编译器会抱怨它无法解析符号。 (同样,您可能无法看到它;在大多数字体中,Ctrl-C不是可打印的字形。)
我想要这个的原因是我可以运行一些我尝试作为无限循环的代码,看看它暂时做了什么,停止它,稍微改变一下,再试一次,等等上。我实际上并不想通过直接在REPL调用set-break-handler
来设置INT处理程序。我想把它放到我的代码中,以便清理它的线程并杀死它的子进程。
顺便说一句,我以为我看看Leiningen是否在搞乱我的设置,所以我输入了这个:
user=> (clojure.java.shell/sh "stty" "-a")
{:exit 1, :out "", :err "stty: standard input: Invalid argument\n"}
什么?如果我在shell提示符下键入它,stty -a
工作正常。这是问题的线索吗?