diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/LineReader.scala b/internal/util-complete/src/main/scala/sbt/internal/util/LineReader.scala index 34526a948..52a36ca8d 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/LineReader.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/LineReader.scala @@ -57,11 +57,14 @@ object LineReader { * `testOnly testOnly\ com.foo.FooSpec` instead of `testOnly com.foo.FooSpec`. */ if (c.append.nonEmpty) { - if (!pl.line().endsWith(" ")) { - candidates.add(new Candidate(pl.line().split(" ").last + c.append)) - } else { - candidates.add(new Candidate(c.append)) - } + val comp = + if (!pl.line().endsWith(" ")) pl.line().split(" ").last + c.append else c.append + // tell jline to append a " " if the completion would be valid with a " " appended + // which can be the case for input tasks and some commands. We need to exclude + // the empty string and ";" which always seem to be present. + val complete = (Parser.completions(parser, comp + " ", 10).get.map(_.display) -- + Set(";", "")).nonEmpty + candidates.add(new Candidate(comp, comp, null, null, null, null, complete)) } } } diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala b/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala index 52cad90de..e44573930 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala @@ -7,7 +7,7 @@ package sbt.internal.util -import java.io.{ InputStream, InterruptedIOException, OutputStream, PrintStream } +import java.io.{ InputStream, InterruptedIOException, IOException, OutputStream, PrintStream } import java.nio.channels.ClosedChannelException import java.util.{ Arrays, Locale } import java.util.concurrent.atomic.{ AtomicBoolean, AtomicReference } @@ -171,7 +171,8 @@ object Terminal { if (System.getProperty("sbt.jline.verbose", "false") != "true") jline.internal.Log.setOutput(new PrintStream(_ => {}, false)) def consoleLog(string: String): Unit = { - Terminal.console.printStream.println(s"[info] $string") + try Terminal.console.printStream.println(s"[info] $string") + catch { case _: IOException => } } private[sbt] def set(terminal: Terminal) = { activeTerminal.set(terminal)