115 lines
2.6 KiB
Markdown
115 lines
2.6 KiB
Markdown
|
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.
|
||
|
|
||
|
<!-- {
|
||
|
"args": ["complete", "--generate-bash-completion"],
|
||
|
"output": "laundry"
|
||
|
} -->
|
||
|
``` go
|
||
|
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.:
|
||
|
|
||
|
<!-- {
|
||
|
"args": ["--compgen"],
|
||
|
"output": "wat\nhelp\nh"
|
||
|
} -->
|
||
|
``` go
|
||
|
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)
|
||
|
}
|
||
|
}
|
||
|
```
|