diff --git a/autocomplete/bash_autocomplete b/autocomplete/bash_autocomplete index d9305db..303d126 100755 --- a/autocomplete/bash_autocomplete +++ b/autocomplete/bash_autocomplete @@ -11,9 +11,6 @@ _cli_bash_autocomplete() { else opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash-completion ) fi - if [[ "$opts1" == "$cur1" ]]; then - return 0 - fi COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 } diff --git a/help.go b/help.go index be79e88..bd68295 100644 --- a/help.go +++ b/help.go @@ -162,6 +162,22 @@ func DefaultAppComplete(c *Context) { } func DefaultAppCompleteWithFlags(cmd *Command) func(c *Context) { + cliArgContains := func(flagName string) bool { + for _, name := range strings.Split(flagName, ",") { + name = strings.Trim(name, " ") + count := utf8.RuneCountInString(name) + if count > 2 { + count = 2 + } + flag := fmt.Sprintf("%s%s", strings.Repeat("-", count), name) + for _, a := range os.Args { + if a == flag { + return true + } + } + } + return false + } return func(c *Context) { if len(os.Args) > 2 { lastArg := os.Args[len(os.Args)-2] @@ -171,12 +187,13 @@ func DefaultAppCompleteWithFlags(cmd *Command) func(c *Context) { for _, flag := range c.App.Flags { for _, name := range strings.Split(flag.GetName(), ",") { name = strings.Trim(name, " ") - if strings.HasPrefix(name, lastArg) && lastArg != name { - count := utf8.RuneCountInString(name) - if count > 2 { - count = 2 - } - fmt.Fprintf(c.App.Writer, "%s%s\n", strings.Repeat("-", count), name) + count := utf8.RuneCountInString(name) + if count > 2 { + count = 2 + } + flagCompletion := fmt.Sprintf("%s%s", strings.Repeat("-", count), name) + if strings.HasPrefix(name, lastArg) && lastArg != name && !cliArgContains(flag.GetName()) { + fmt.Fprintln(c.App.Writer, flagCompletion) } } } @@ -184,12 +201,13 @@ func DefaultAppCompleteWithFlags(cmd *Command) func(c *Context) { for _, flag := range cmd.Flags { for _, name := range strings.Split(flag.GetName(), ",") { name = strings.Trim(name, " ") - if strings.HasPrefix(name, lastArg) && lastArg != name { - count := utf8.RuneCountInString(name) - if count > 2 { - count = 2 - } - fmt.Fprintf(c.App.Writer, "%s%s\n", strings.Repeat("-", count), name) + count := utf8.RuneCountInString(name) + if count > 2 { + count = 2 + } + flagCompletion := fmt.Sprintf("%s%s", strings.Repeat("-", count), name) + if strings.HasPrefix(name, lastArg) && lastArg != name && !cliArgContains(flag.GetName()) { + fmt.Fprintln(c.App.Writer, flagCompletion) } } }