golangでコマンドライン引数を受け取るには、標準のflagパッケージを使うのが基本となります。
普段はkingpinを使っているのでBash/ZSH Shell Completion
が標準で組み込まれていますが、flagにはそれがありません。
実際、flagにbash completion (コマンド補完)を追加したところで、さほどメリットはないかもしれませんがgolangとbashの練習もかねて作ってみました。
Goal
flagパッケージにbash completionを追加するflagcmplを紹介する。
使い方
いきなりですが、使い方。
-
import "github.com/sago35/flagcmpl"
を追加 -
flag.Parse()
を使っている箇所を、flagcmpl.Parse()
に書き換える - bash_profile等で
eval "$(your-cli-tool --completion-script-bash)"
を実行
flagcmpl.Parse() に書き換える
まずは、bash completionしたいgolangソース内のflag.Parse()
をflagcmpl.Parse()
に書き換えます。
package main
import "flag"
import "github.com/sago35/flagcmpl"
var verbose = flag.Bool("verbose", false, "Verbose mode.")
func main() {
// flag.Parse() を↓に書き換える
flagcmpl.Parse()
}
補完させたいgolangソースがflag.FlagSet()
を使っている場合は以下のような形に書き換えます。
package main
import (
"flag"
"github.com/sago35/flagcmpl"
"os"
)
func main() {
flags := flag.NewFlagSet("sample2", flag.ExitOnError)
flags.Bool("verbose", false, "Verbose mode.")
// flags.Parse(os.Args[1:]) を↓に書き換える
flagcmpl.ParseFlagSet(os.Args[0], flags, os.Args)
}
bash に補完を追加する
作っているものがyour-cli-tool
の場合、eval "$(your-cli-tool --completion-script-bash)"
を実行してください。
Demo
git for windowsのbash上でのDemoはこちら。
Demoに使用したソースはこちら。
まとめ
以上のように、簡単にbash completionを追加できました。