【问题标题】:Is there a way to make the Scala REPL not stop with CTRL-C有没有办法让 Scala REPL 不停止 CTRL-C
【发布时间】:2011-09-15 17:01:57
【问题描述】:

我正在使用 Scala REPL 以交互方式测试我正在构建的一些哈希函数。我经常在产品代码(Eclipse)、浏览器和 Scala 解释器之间切换,复制/粘贴值和结果。在混合中,我经常在解释器上执行 CTRL-C,退出会话并失去所有功能。

有什么方法可以让 Scala REPL 忽略 CTRL-C,或者更好地使用它执行“粘贴”?我在 Linux 上工作。

【问题讨论】:

  • 在 Windows 上我们有相反的问题:如果你想杀死一个 scala 命令(无限循环等)你必须关闭整个窗口,因为 CTRL-C 什么都不做!知道在您的主目录中应该有一个名为 .scala_history 的文件可能会有所帮助,其中包含您的 REPL 命令。
  • 哪个版本的 Scala?在我的机器上,REPL 中的 Ctrl-C 将停止正在运行的命令,但不会退出 REPL。我正在使用 Scala 2.9.1 和 OS X。
  • 在windows上你可以按CTRL-D退出REPL。
  • @Kipton Barros 我使用的是 2.9.0.1 版

标签: scala user-interface read-eval-print-loop


【解决方案1】:

我只知道如何防止 REPL 退出。重新映射 CTRL+C 以执行复制命令可以以相同的方式完成(如果有一些命令能够在不重启终端的情况下更改键盘映射 - 我不知道有没有) .无论如何,要阻止 ^C 将您的 REPL 调用包装在 .sh 脚本中,如下所示:

#!/bin/bash

#switch off sensitivity to ^C
trap '' 2

# here goes REPL invoke
scala

#get back sensitivity to ^C
trap 2

陷阱命令

定义并激活当 shell 接收到时要运行的处理程序 信号 或其他条件。

2 是一个SIGINT 值(这是按下CTRL+C 时触发的信号)

【讨论】:

  • 谢谢。这给了我一个很好的方向。最后我使用stty intr \^kCtrl-C 重定向到Ctrl-K(以防我仍然需要BREAK 来中断我可能创建的任何愚蠢。)scala 启动脚本有一个步骤来保存终端设置,它将恢复它出口。所以我把这个命令放在# save terminal settings 之后。像魅力一样工作。
  • 或者你可以创建一个别名而不是提到的脚本@om-nom-nom。 alias scala="trap '' 2 ; scala"
  • ^: 像alias scala="bash -c \"trap '' SIGINT; scala\"" 这样的东西会更有用,所以它只影响 scala 进程,而不影响当前/交互式 bash 会话。此外,作为别名也很好,因为它只会以交互方式使用(而不是从其他程序调用)。
【解决方案2】:

repl 已经拦截了 ctrl-C,但显然它在 linux 上不起作用。它确实适用于osx。如果使用 linux 的人打开了一张包含足够详细信息的票证以说明原因,我可以修复它。

【讨论】:

  • 天啊,九年没修了……
  • 快10年了……!
【解决方案3】:

作为原生 Scala REPL 的替代方案,您可以使用Ammonite,即does handle Ctrl+C

@ while(true) ()
... hangs ...
^Ctrl-C
Interrupted!

@

传统的 Scala REPL 不处理失控代码,除了终止进程之外别无选择,这会丢失所有工作。
Ammonite-REPL 允许您中断线程,停止失控命令继续前进

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2020-11-19
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多