sbt の Parser の機能使って、 sbt のシェルから git のコマンドを便利に(?)たたける誰得(?)なことをしてみた

最近は、sbtをいじって、projectのbuildの本質とは関係ない自分だけが得する微妙な便利機能を入れて、project定義のファイルをぐちゃぐちゃにするのがマイブームなわけですが(・ω・´)


sbt には(Scalaの標準のものと似ているけど少し違うらしい)独自の Parser がついていて、それらが、 InputTask や Command の Parse に便利に使えるようになってるらしいです。詳しくはこのあたりのページ ↓ 読んでください。

http://www.scala-sbt.org/0.12.3/docs/Detailed-Topics/Tasks.html
http://www.scala-sbt.org/0.12.3/docs/Detailed-Topics/Parsing-Input.html
http://www.scala-sbt.org/0.12.3/docs/Extending/Commands.html


これ、わざわざ Parser を使って定義するとなにが便利かというと、 TAB補完が効くようになります。

つまりsbtは、プロジェクトのbuildに関係なく、

  • 独自の構文を定義した
  • 補完が効いたり、helpを出せる便利な対話的コマンドラインツールを
  • Scalaのプログラムとして書ける

という使い方もできます(ぇ

というわけで、 sbt の ドキュメントページ に載っている例とか、この あたりソースコード読みながら、作ってみました。

Commandのapplyに先に渡した Parser の型によって推論されて、*1最後の effect の引数の型がちゃんと決まるのが便利ですねー*2

自分の勉強のためにつくっただけなのでかなり中途半端ですが、これ頑張れば、かなり色々できそうですねー

*1: https://github.com/harrah/xsbt/blob/v0.10.1/main/Command.scala#L39-42 このあたり

*2: 上記の場合 (String,Seq[Char] ) になる