diff --git a/completions.go b/completions.go index b849b9c844..cb5f4f49bd 100644 --- a/completions.go +++ b/completions.go @@ -574,7 +574,7 @@ func checkIfFlagCompletion(finalCmd *Command, args []string, lastArg string) (*p // 2- c has no subcommands (to avoid creating one), // 3- c already has a 'completion' command provided by the program. func (c *Command) initDefaultCompletionCmd() { - if c.CompletionOptions.DisableDefaultCmd || !c.HasSubCommands() { + if c.CompletionOptions.DisableDefaultCmd { return } @@ -586,6 +586,7 @@ func (c *Command) initDefaultCompletionCmd() { } haveNoDescFlag := !c.CompletionOptions.DisableNoDescFlag && !c.CompletionOptions.DisableDescriptions + hidden := !c.HasSubCommands() completionCmd := &Command{ Use: compCmdName, @@ -596,6 +597,7 @@ See each sub-command's help for details on how to use the generated script. `, c.Root().Name()), Args: NoArgs, ValidArgsFunction: NoFileCompletions, + Hidden: hidden, } c.AddCommand(completionCmd) diff --git a/completions_test.go b/completions_test.go index 70c455af1e..f9c6dcf42c 100644 --- a/completions_test.go +++ b/completions_test.go @@ -2287,14 +2287,21 @@ func TestDefaultCompletionCmd(t *testing.T) { Run: emptyRun, } - // Test that no completion command is created if there are not other sub-commands + // Test that default completion command is created, hidden if there are no other sub-commands assertNoErr(t, rootCmd.Execute()) + found := false for _, cmd := range rootCmd.commands { if cmd.Name() == compCmdName { - t.Errorf("Should not have a 'completion' command when there are no other sub-commands of root") + found = true + if !cmd.Hidden { + t.Errorf("The 'completion' command should be hidden when there are no other sub-commands of root") + } break } } + if !found { + t.Errorf("Should have a 'completion' command when there are no other sub-commands of root") + } subCmd := &Command{ Use: "sub", @@ -2303,7 +2310,7 @@ func TestDefaultCompletionCmd(t *testing.T) { rootCmd.AddCommand(subCmd) // Test that a completion command is created if there are other sub-commands - found := false + found = false assertNoErr(t, rootCmd.Execute()) for _, cmd := range rootCmd.commands { if cmd.Name() == compCmdName { diff --git a/shell_completions.md b/shell_completions.md index 4ba06a11c0..dbab72dd6b 100644 --- a/shell_completions.md +++ b/shell_completions.md @@ -8,7 +8,8 @@ The currently supported shells are: - PowerShell Cobra will automatically provide your program with a fully functional `completion` command, -similarly to how it provides the `help` command. +similarly to how it provides the `help` command. If there are no other subcommands, the +default `completion` command will be hidden, but still functional. ## Creating your own completion command