diff --git a/src/main/scala/sbt/LineReader.scala b/src/main/scala/sbt/LineReader.scala index 2bd655bef..558b08936 100644 --- a/src/main/scala/sbt/LineReader.scala +++ b/src/main/scala/sbt/LineReader.scala @@ -9,6 +9,7 @@ trait LineReader extends NotNull } class Completors(val projectAction: String, val projectNames: Iterable[String], val generalCommands: Iterable[String], val propertyActions: Iterable[String], + val specificPrefix: String, val scalaVersions: Iterable[String], val prefixes: Iterable[String]) extends NotNull import jline.ConsoleReader abstract class JLine extends LineReader @@ -102,7 +103,12 @@ class JLineReader(historyPath: Option[Path], completors: Completors, log: Logger private def propertyCompletor(propertyNames: Iterable[String]) = simpleArgumentCompletor(propertyActions, propertyNames) private def prefixedCompletor(baseCompletor: Completor) = - singleArgumentCompletor(simpleCompletor(prefixes.toList.toArray[String]), baseCompletor) + singleArgumentCompletor(simpleCompletor(prefixes), baseCompletor) + private def specificCompletor(baseCompletor: Completor) = + { + val specific = simpleCompletor(specificPrefix :: Nil) // TODO + new ArgumentCompletor( Array( specific, simpleCompletor(scalaVersions), baseCompletor ) ) + } def setVariableCompletions(taskNames: Iterable[String], propertyNames: Iterable[String], extra: Iterable[(String, Iterable[String])] ) { import scala.collection.immutable.TreeSet @@ -110,6 +116,6 @@ class JLineReader(historyPath: Option[Path], completors: Completors, log: Logger val extraCompletors = for( (first, repeat) <- extra) yield repeatedArgumentCompletor(simpleCompletor(first :: Nil), simpleCompletor(repeat)) val baseCompletors = generalCompletor :: taskCompletor :: projectCompletor :: propertyCompletor(propertyNames) :: extraCompletors.toList val baseCompletor = new MultiCompletor(baseCompletors.toArray) - completor.setCompletors( Array(baseCompletor, prefixedCompletor(baseCompletor)) ) + completor.setCompletors( Array(baseCompletor, prefixedCompletor(baseCompletor), specificCompletor(baseCompletor)) ) } } \ No newline at end of file diff --git a/src/main/scala/sbt/Main.scala b/src/main/scala/sbt/Main.scala index d3d573d8d..918114f0a 100755 --- a/src/main/scala/sbt/Main.scala +++ b/src/main/scala/sbt/Main.scala @@ -258,7 +258,7 @@ class xMain extends xsbti.AppMain object SpecificBuild { import java.util.regex.Pattern.{compile,quote} - val pattern = compile(quote(SpecificBuildPrefix) + """(\S+)\s*(.*)""") + val pattern = compile(quote(SpecificBuildPrefix) + """\s*(\S+)\s*(.*)""") def unapply(s: String) = { val m = pattern.matcher(s) @@ -313,7 +313,8 @@ class xMain extends xsbti.AppMain { val projectNames = baseProject.projectClosure.map(_.name) val prefixes = ContinuousExecutePrefix :: CrossBuildPrefix :: Nil - val completors = new Completors(ProjectAction, projectNames, interactiveCommands, List(GetAction, SetAction), prefixes) + val scalaVersions = baseProject.crossScalaVersions ++ Seq(baseProject.defScalaVersion.value) + val completors = new Completors(ProjectAction, projectNames, interactiveCommands, List(GetAction, SetAction), SpecificBuildPrefix, scalaVersions, prefixes) val reader = new JLineReader(baseProject.historyPath, completors, baseProject.log) val methodCompletions = for( (name, method) <- project.methods) yield (name, method.completions) reader.setVariableCompletions(project.taskNames, project.propertyNames, methodCompletions) @@ -365,7 +366,7 @@ class xMain extends xsbti.AppMain /** The list of all available commands at the interactive prompt in addition to the tasks defined * by a project.*/ - protected def interactiveCommands: Iterable[String] = basicCommands.toList ++ logLevels.toList + protected def interactiveCommands: Iterable[String] = basicCommands.toList ++ logLevels.toList ++ TerminateActions /** The list of logging levels.*/ private def logLevels: Iterable[String] = TreeSet.empty[String] ++ Level.levels.map(_.toString) /** The list of all interactive commands other than logging level.*/