Go to file
Eyal Posener d752070d0f
Merge pull request #152 from sethvargo/sethvargo/deps
Switch to Go 1.20 errors package
2023-07-19 21:28:32 +03:00
.github/workflows Update goreadme 2021-04-06 19:36:48 +03:00
compflag Use autogen 2020-05-10 06:04:42 +03:00
example Use command line name instead of external name 2019-11-27 22:01:40 +02:00
gocomplete gocomplete: suppress error output by default 2021-04-06 14:23:51 +03:00
install Switch to Go 1.20 errors package 2023-07-16 17:37:11 -04:00
internal Move install package back to project root 2019-11-19 05:17:52 +02:00
predict Add forgoten option tests 2019-11-23 11:39:35 +02:00
.gitignore build(go111): Add go module support 2018-08-27 11:55:41 -08:00
.travis.yml V2 2019-11-18 01:05:47 +02:00
LICENSE.txt change license to MIT 2017-05-20 23:22:26 +03:00
README.md Update readme according to godoc 2021-04-06 16:39:51 +00:00
command.go V2 2019-11-18 01:05:47 +02:00
complete.go complete: enable complete.Complete() output capturing (#138) 2021-04-06 06:46:20 +03:00
complete_test.go complete: enable complete.Complete() output capturing (#138) 2021-04-06 06:46:20 +03:00
doc.go Better godoc badge 2020-04-10 10:35:27 +03:00
flags.go Use command line name instead of external name 2019-11-27 22:01:40 +02:00
flags_test.go V2 2019-11-18 01:05:47 +02:00
go.mod Switch to Go 1.20 errors package 2023-07-16 17:37:11 -04:00
go.sum Switch to Go 1.20 errors package 2023-07-16 17:37:11 -04:00
testing.go update module import path 2019-11-18 01:25:16 +02:00

README.md

complete

Build Status codecov GoDoc

Package complete is everything for bash completion and Go.

Writing bash completion scripts is a hard work, usually done in the bash scripting language. This package provides:

  • A library for bash completion for Go programs.

  • A tool for writing bash completion script in the Go language. For any Go or non Go program.

  • Bash completion for the go command line (See ./gocomplete).

  • Library for bash-completion enabled flags (See ./compflag).

  • Enables an easy way to install/uninstall the completion of the command.

The library and tools are extensible such that any program can add its one logic, completion types or methologies.

Go Command Bash Completion

./gocomplete is the script for bash completion for the go command line. This is an example that uses the complete package on the go command - the complete package can also be used to implement any completions, see #usage.

Install:

  1. Type in your shell:
go get -u github.com/posener/complete/v2/gocomplete
COMP_INSTALL=1 gocomplete
  1. Restart your shell

Uninstall by COMP_UNINSTALL=1 gocomplete

Features:

  • Complete go command, including sub commands and flags.
  • Complete packages names or .go files when necessary.
  • Complete test names after -run flag.

Complete Package

Supported shells:

  • bash
  • zsh
  • fish

The installation of completion for a command line tool is done automatically by this library by running the command line tool with the COMP_INSTALL environment variable set. Uninstalling the completion is similarly done by the COMP_UNINSTALL environment variable. For example, if a tool called my-cli uses this library, the completion can install by running COMP_INSTALL=1 my-cli.

Usage

Add bash completion capabilities to any Go program. See ./example/command.

 import (
 	"flag"
 	"github.com/posener/complete/v2"
 	"github.com/posener/complete/v2/predict"
 )
 var (
 	// Add variables to the program.
 	name      = flag.String("name", "", "")
 	something = flag.String("something", "", "")
 	nothing   = flag.String("nothing", "", "")
 )
 func main() {
 	// Create the complete command.
 	// Here we define completion values for each flag.
 	cmd := &complete.Command{
	 	Flags: map[string]complete.Predictor{
 			"name":      predict.Set{"foo", "bar", "foo bar"},
 			"something": predict.Something,
 			"nothing":   predict.Nothing,
 		},
 	}
 	// Run the completion - provide it with the binary name.
 	cmd.Complete("my-program")
 	// Parse the flags.
 	flag.Parse()
 	// Program logic...
 }

This package also enables to complete flags defined by the standard library flag package. To use this feature, simply call complete.CommandLine before flag.Parse. (See ./example/stdlib).

 import (
 	"flag"
+	"github.com/posener/complete/v2"
 )
 var (
 	// Define flags here...
 	foo = flag.Bool("foo", false, "")
 )
 func main() {
 	// Call command line completion before parsing the flags - provide it with the binary name.
+	complete.CommandLine("my-program")
 	flag.Parse()
 }

If flag value completion is desired, it can be done by providing the standard library flag.Var function a flag.Value that also implements the complete.Predictor interface. For standard flag with values, it is possible to use the github.com/posener/complete/v2/compflag package. (See ./example/compflag).

 import (
 	"flag"
+	"github.com/posener/complete/v2"
+	"github.com/posener/complete/v2/compflag"
 )
 var (
 	// Define flags here...
-	foo = flag.Bool("foo", false, "")
+	foo = compflag.Bool("foo", false, "")
 )
 func main() {
 	// Call command line completion before parsing the flags.
+	complete.CommandLine("my-program")
 	flag.Parse()
 }

Instead of calling both complete.CommandLine and flag.Parse, one can call just compflag.Parse which does them both.

Testing

For command line bash completion testing use the complete.Test function.

Sub Packages

  • compflag: Package compflag provides a handful of standard library-compatible flags with bash complition capabilities.

  • compflag/gen: Generates flags.go.

  • example/command: command shows how to have bash completion to an arbitrary Go program using the complete.Command struct.

  • example/compflag: compflag shows how to use the github.com/posener/complete/v2/compflag package to have auto bash completion for a defined set of flags.

  • example/stdlib: stdlib shows how to have flags bash completion to an arbitrary Go program that uses the standard library flag package.

  • gocomplete: Package main is complete tool for the go command line

  • install: Package install provide installation functions of command completion.

  • predict: Package predict provides helper functions for completion predictors.

Examples

OutputCapturing

ExampleComplete_outputCapturing demonstrates the ability to capture the output of Complete() invocations, crucial for integration tests.

defer func(f func(int)) { exit = f }(exit)
defer func(f getEnvFn) { getEnv = f }(getEnv)
exit = func(int) {}

// This is where the actual example starts:

cmd := &Command{Sub: map[string]*Command{"bar": {}}}
getEnv = promptEnv("foo b")

Complete("foo", cmd)

Output:

bar

Readme created from Go doc with goreadme