From e52807e9a57bf335fd23fabd152d1de9239cd96f Mon Sep 17 00:00:00 2001 From: longyuxiang Date: Thu, 10 Jul 2025 09:25:48 +0800 Subject: [PATCH 1/3] add completion script. Resolves #1868 Signed-off-by: longyuxiang --- cmd/sops/completion.go | 56 ++++++++++++++++++++++++++++++++++++++++++ cmd/sops/main.go | 21 ++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 cmd/sops/completion.go diff --git a/cmd/sops/completion.go b/cmd/sops/completion.go new file mode 100644 index 000000000..d42b29c5b --- /dev/null +++ b/cmd/sops/completion.go @@ -0,0 +1,56 @@ +package main + +import "fmt" + +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` + +var Bashcompletion = `#! /bin/bash + +PROG=%s + +_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 $PROG +unset PROG` + +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 bdbd5eab1..241f81cb4 100644 --- a/cmd/sops/main.go +++ b/cmd/sops/main.go @@ -150,6 +150,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 completion script", + 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", From e21b921b065bf19e87b62a47f5cf2e032604d3e4 Mon Sep 17 00:00:00 2001 From: longyuxiang Date: Mon, 4 Aug 2025 09:07:50 +0800 Subject: [PATCH 2/3] add source link for completion snippet Signed-off-by: longyuxiang --- cmd/sops/completion.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/cmd/sops/completion.go b/cmd/sops/completion.go index d42b29c5b..445402652 100644 --- a/cmd/sops/completion.go +++ b/cmd/sops/completion.go @@ -2,7 +2,10 @@ package main import "fmt" -var Zshcompletion = `#compdef %s +// https://github.com/urfave/cli/blob/v1-maint/autocomplete/zsh_autocomplete +var Zshcompletion = ` +#compdef %s + _cli_zsh_autocomplete() { local -a opts @@ -23,11 +26,12 @@ _cli_zsh_autocomplete() { return } -compdef _cli_zsh_autocomplete %s` - -var Bashcompletion = `#! /bin/bash +compdef _cli_zsh_autocomplete %s +` -PROG=%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 @@ -43,9 +47,8 @@ _cli_bash_autocomplete() { return 0 fi } - -complete -o bashdefault -o default -o nospace -F _cli_bash_autocomplete $PROG -unset PROG` +complete -o bashdefault -o default -o nospace -F _cli_bash_autocomplete %s +` func GenBashCompletion(name string) string { return fmt.Sprintf(Bashcompletion, name) From 71114d548f405dfb6ab08ce5da4927a999c84903 Mon Sep 17 00:00:00 2001 From: longyuxiang Date: Mon, 4 Aug 2025 09:09:28 +0800 Subject: [PATCH 3/3] update completion command usage description Signed-off-by: longyuxiang --- cmd/sops/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/sops/main.go b/cmd/sops/main.go index 241f81cb4..27cfa72f1 100644 --- a/cmd/sops/main.go +++ b/cmd/sops/main.go @@ -152,7 +152,7 @@ func main() { app.Commands = []cli.Command{ { Name: "completion", - Usage: "Generate completion script", + Usage: "Generate shell completion scripts", Subcommands: []cli.Command{ { Name: "bash",