diff --git a/cmd/sops/completion.go b/cmd/sops/completion.go new file mode 100644 index 000000000..445402652 --- /dev/null +++ b/cmd/sops/completion.go @@ -0,0 +1,59 @@ +package main + +import "fmt" + +// https://github.com/urfave/cli/blob/v1-maint/autocomplete/zsh_autocomplete +var Zshcompletion = ` +#compdef %s + +_cli_zsh_autocomplete() { + + local -a opts + local cur + cur=${words[-1]} + if [[ "$cur" == "-"* ]]; then + opts=("${(@f)$(_CLI_ZSH_AUTOCOMPLETE_HACK=1 ${words[@]:0:#words[@]-1} ${cur} --generate-bash-completion)}") + else + opts=("${(@f)$(_CLI_ZSH_AUTOCOMPLETE_HACK=1 ${words[@]:0:#words[@]-1} --generate-bash-completion)}") + fi + + if [[ "${opts[1]}" != "" ]]; then + _describe 'values' opts + else + _files + fi + + return +} + +compdef _cli_zsh_autocomplete %s +` + +// https://github.com/urfave/cli/blob/v1-maint/autocomplete/bash_autocomplete +var Bashcompletion = ` +#! /bin/bash + +_cli_bash_autocomplete() { + if [[ "${COMP_WORDS[0]}" != "source" ]]; then + local cur opts base + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + if [[ "$cur" == "-"* ]]; then + opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} ${cur} --generate-bash-completion ) + else + opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash-completion ) + fi + COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) + return 0 + fi +} +complete -o bashdefault -o default -o nospace -F _cli_bash_autocomplete %s +` + +func GenBashCompletion(name string) string { + return fmt.Sprintf(Bashcompletion, name) +} + +func GenZshCompletion(name string) string { + return fmt.Sprintf(Zshcompletion, name, name) +} diff --git a/cmd/sops/main.go b/cmd/sops/main.go index ceb1977da..e3be225a6 100644 --- a/cmd/sops/main.go +++ b/cmd/sops/main.go @@ -151,6 +151,27 @@ func main() { For more information, see the README at https://github.com/getsops/sops` app.EnableBashCompletion = true app.Commands = []cli.Command{ + { + Name: "completion", + Usage: "Generate shell completion scripts", + Subcommands: []cli.Command{ + { + Name: "bash", + Usage: fmt.Sprintf("Generate bash completions. To load completions: `$ source <(%s completion bash)`", app.Name), + Action: func(c *cli.Context) error { + fmt.Fprint(c.App.Writer, GenBashCompletion(app.Name)) + return nil + }, + }, + { + Name: "zsh", + Usage: fmt.Sprintf("Generate zsh completions. To load completions: `$ source <(%s completion zsh)`", app.Name), + Action: func(c *cli.Context) error { + fmt.Fprint(c.App.Writer, GenZshCompletion(app.Name)) + return nil + }, + }}, + }, { Name: "exec-env", Usage: "execute a command with decrypted values inserted into the environment",