【问题标题】:Console input within SBT does not echo to the screenSBT 中的控制台输入不回显到屏幕
【发布时间】:2014-05-12 14:22:18
【问题描述】:

我希望我遗漏了一些东西,因为当程序在 sbt 中运行时,击键似乎不会回显到屏幕上。 这是一个例子:

object ConsoleTest extends App {
  println("Enter a line:")
  val input = Console.readLine()
  println("You entered: " + input)
}

当我编译这个简单的代码并从命令行(在 sbt 之外)运行它时,当我键入它们进行输入时,我看到了击键,并且一切正常。
不幸的是,当我使用 sbt 编译和运行相同的代码时,它根本不会将击键回显到屏幕上。这是一次令人不安的经历。
有其他人经历过这种差异吗?
我已经进行了一些搜索以查看其他人是否遇到此问题以及是否可能存在 sbt 运行时参数以允许击键回显。到目前为止没有运气。
我正在使用 sbt-0.13.2 并且上述代码的 Java 版本也遇到了同样的差异,因此它似乎本地化为在 sbt 环境中运行。
任何见解都值得赞赏。

【问题讨论】:

  • 您正在运行什么操作系统?你从什么终端运行 sbt?
  • Windows 7 专业版、MS-DOS 外壳、Java 1.7、Scala 2.10.4。如果不清楚,println 工作正常,它是先前的 readLine,它的击键没有在 SBT 中回显。
  • 输入打印是否正常,即使字符没有回显到屏幕上?它会停止等待输入吗?
  • 是的,println 工作正常。唯一的问题是击键在键入时不会在屏幕上回显;这令人不安。但是,击键被作为标准输入处理,当输入返回时,程序继续执行 println。我的同事也有同样的困难,但它似乎在 *nix shell(但不是 Cygwin)中运行良好。感谢您的帮助。
  • 我遇到了同样的问题,OSX、bash、iTerm 和终端。 sbt 单独工作,但 sbt 控制台没有。你有想过吗?

标签: sbt


【解决方案1】:

这个问题已经 2.5 年了,仍然没有答案,所以这里:)

我使用 Scala 2.12.1、SBT 0.13.13.1 在 Windows 10 上进行了测试。测试程序在 Cmd 和 WSL 的 bash 下运行良好。

从历史上看,这个问题一直是 JLine 问题的症状。您可以使用 jline.terminal Java 系统变量将 JLine 设置覆盖为 autononewindows 等值。 Here are the complete docs.

以下是一些如何指定各种设置的示例:

C:\work\experiments\sbt\optionTest>sbt run
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
[info] Loading project definition from C:\work\experiments\sbt\optionTest\project
[info] Updating {file:/C:/work/experiments/sbt/optionTest/project/}optiontest-build...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Set current project to change-me (in build file:/C:/work/experiments/sbt/optionTest/)
[warn] there was one deprecation warning (since 2.11.0); re-run with -deprecation for details
[warn] one warning found
Enter a line:
asdf
You entered: asdf
[success] Total time: 46 s, completed Jan 7, 2017 1:27:27 PM

C:\work\experiments\sbt\optionTest> sbt "-Djline.terminal=none" run
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
[info] Loading project definition from C:\work\experiments\sbt\optionTest\project
[info] Set current project to change-me (in build file:/C:/work/experiments/sbt/optionTest/)
Enter a line:
asdf
You entered: asdf
[success] Total time: 3 s, completed Jan 7, 2017 1:28:12 PM

C:\work\experiments\sbt\optionTest> sbt "-Djline.terminal=windows" run
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
[info] Loading project definition from C:\work\experiments\sbt\optionTest\project
[info] Set current project to change-me (in build file:/C:/work/experiments/sbt/optionTest/)
Enter a line:
asdf
You entered: asdf
[success] Total time: 3 s, completed Jan 7, 2017 1:28:26 PM

【讨论】:

  • 也可以与sbt "-Djline.terminal=none" console 一起使用,并且是我从 sbt 控制台找到的用于自定义 REPL 内容的唯一解决方案。
  • @kberg:令人沮丧,因为“none”是原始的......这意味着人们可能不会使用内置编辑(例如向上箭头支持从历史中回忆)。并且“unix”设置需要在 <ENTER> 键上“双击”(或在 <ENTER> 键之后使用另一个“一次性”键。选择:使用“unix”以获得编辑支持或使用“none|off” |false" 以摆脱烦人的“双击”功能。:(
  • SBT 对 JLine2 进行了分叉,从那时起 JLine 取得了很大的进步,并继续升级到 v3。但是,SBT 仍然坚持使用 v2 的孤立版本。 JLine3没有这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
相关资源
最近更新 更多