Bash Completions
You can enable completion commands by setting the EnableBashCompletion
flag on the App
object. By default, this setting will only auto-complete to
show an app's subcommands, but you can write your own completion methods for
the App or its subcommands.
package main
import (
"fmt"
"log"
"os"
"github.com/urfave/cli"
)
func main() {
tasks := []string{"cook", "clean", "laundry", "eat", "sleep", "code"}
app := cli.NewApp()
app.EnableBashCompletion = true
app.Commands = []cli.Command{
{
Name: "complete",
Aliases: []string{"c"},
Usage: "complete a task on the list",
Action: func(c *cli.Context) error {
fmt.Println("completed task: ", c.Args().First())
return nil
},
BashComplete: func(c *cli.Context) {
// This will complete if no args are passed
if c.NArg() > 0 {
return
}
for _, t := range tasks {
fmt.Println(t)
}
},
},
}
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
}
}
Enabling¶
Source the autocomplete/bash_autocomplete
file in your .bashrc
file while
setting the PROG
variable to the name of your program:
PROG=myprogram source /.../cli/autocomplete/bash_autocomplete
Distribution¶
Copy autocomplete/bash_autocomplete
into /etc/bash_completion.d/
and rename
it to the name of the program you wish to add autocomplete support for (or
automatically install it there if you are distributing a package). Don't forget
to source the file to make it active in the current shell.
sudo cp src/bash_autocomplete /etc/bash_completion.d/<myprogram>
source /etc/bash_completion.d/<myprogram>
Alternatively, you can just document that users should source the generic
autocomplete/bash_autocomplete
in their bash configuration with $PROG
set
to the name of their program (as above).
Customization¶
The default bash completion flag (--generate-bash-completion
) is defined as
cli.BashCompletionFlag
, and may be redefined if desired, e.g.:
package main
import (
"log"
"os"
"github.com/urfave/cli"
)
func main() {
cli.BashCompletionFlag = cli.BoolFlag{
Name: "compgen",
Hidden: true,
}
app := cli.NewApp()
app.EnableBashCompletion = true
app.Commands = []cli.Command{
{
Name: "wat",
},
}
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
}
}