6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-06-07

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を追加できました。

リンク等

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?