如何在 Leiningen REPL 中捕获 Ctrl-C?

Ben*_*itz 5 signals clojure leiningen read-eval-print-loop

如何在 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=> 
Run Code Online (Sandbox Code Playgroud)

第二个提示后的那个有趣的字符(如果你能看到它)是 ASCII 3。这就是我按下 Ctrl-C 时出现的内容。Leiningen 似乎已禁用 Ctrl-C 和 SIGINT 信号之间的连接。(这是在 Linux 系统上。)Leiningen 将 Ctrl-C 视为另一个字符。如果我按 Enter 键,Clojure 编译器会抱怨它无法解析该符号。(同样,您可能看不到它;Ctrl-C 在大多数字体中都不是可打印的字形。)

我想要这个的原因是这样我可以运行一些我正在试验的代码作为无限循环,看看它做了一段时间,停止它,改变它一点,再试一次,等等。我实际上不想通过set-break-handler直接调用 REPL 来设置 INT 处理程序。我想将它放入我的代码中,以便它清理其线程并终止其子进程。


顺便说一句,我想看看 Leiningen 是否弄乱了我的 stty 设置,所以我输入了以下内容:

user=> (clojure.java.shell/sh "stty" "-a")
{:exit 1, :out "", :err "stty: standard input: Invalid argument\n"}
Run Code Online (Sandbox Code Playgroud)

什么??stty -a如果我在 shell 提示符下输入它,效果很好。这是问题的线索吗?