sbt解析器和动态完成

时间:2015-06-04 20:51:39

标签: scala sbt

我正在尝试在sbt中构建一个git命令解析器。

解析器的目标不是验证实际的git命令,而是在sbt控制台中提供自动完成。

解析器依赖于bash完成脚本,所以可以说生成完成是相当昂贵的,因为每次都必须生成一个进程。这就是为什么我想尽量减少对bash-completion过程的调用次数。

我有一个可行的解决方案,如下所示:

def autoCompleteParser(state: State) = {
  val extracted = Project.extract(state)
  import extracted._

  val dir = extracted.get(baseDirectory)

  def suggestions(args: Seq[String]): Seq[String] = {
    // .. calling Process and collecting the completions into a Seq[String]
  }

  val gitArgsParser: Parser[Seq[String]] = {

    def loop(previous: Seq[String]): Parser[Seq[String]] =
      token(Space) ~> NotSpace.examples(suggestions(previous): _*).flatMap(res => loop(previous :+ res))

    loop(Vector())

  }

  gitArgsParser
}

val test = Command("git-auto-complete")(autoCompleteParser _)(autoCompleteAction)

但是我有两个问题:

  • 为每个角色调用完成过程,这比我想要的更多
  • 潜在的完成似乎作为参数传递给另一轮完成,这意味着更多的外部过程调用。

我的问题如下:如何告诉sbt在没有为每个字符调用进程的情况下重用/缓存他为其余参数获得的完成?例如:

'git a'的完成是:

dd m nnotate pply rchive

然后'git ad'的完成是:

d

无需再次调用建议方法。我试图实现一个ExampleSource,但我无法从中获取我想要的行为。

任何指针都是受欢迎的。如果有人理解为什么潜在的完成似乎会被传递到另一轮完成,这将对我有很大帮助。

谢谢。

0 个答案:

没有答案