golangのflagにbash completion (補完)を追加する

  • 5
    いいね
  • 0
    コメント

golangでコマンドライン引数を受け取るには、標準のflagパッケージを使うのが基本となります。
普段はkingpinを使っているのでBash/ZSH Shell Completionが標準で組み込まれていますが、flagにはそれがありません。

実際、flagにbash completion (コマンド補完)を追加したところで、さほどメリットはないかもしれませんがgolangとbashの練習もかねて作ってみました。

Goal

flagパッケージにbash completionを追加するflagcmplを紹介する。

使い方

いきなりですが、使い方。

  1. import "github.com/sago35/flagcmpl" を追加
  2. flag.Parse()を使っている箇所を、flagcmpl.Parse()に書き換える
  3. 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はこちら。

sample3.gif

Demoに使用したソースはこちら。

まとめ

以上のように、簡単にbash completionを追加できました。

リンク等