我正在尝试在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在没有为每个字符调用进程的情况下重用/缓存他为其余参数获得的完成?例如:
dd m nnotate pply rchive
然后'git ad'的完成是:
d
无需再次调用建议方法。我试图实现一个ExampleSource,但我无法从中获取我想要的行为。
任何指针都是受欢迎的。如果有人理解为什么潜在的完成似乎会被传递到另一轮完成,这将对我有很大帮助。
谢谢。