3.9 KiB
Cobra Shell Completions Reference
Cobra generates shell completion scripts for bash, zsh, fish, and PowerShell automatically. Subcommand names and flag names are completed for free. You add completions for flag values and positional arguments.
Built-in completion command
Cobra registers a completion subcommand automatically:
myapp completion bash # generate bash script
myapp completion zsh # generate zsh script
myapp completion fish # generate fish script
myapp completion powershell
# Install (example for zsh):
myapp completion zsh > "${fpath[1]}/_myapp"
ShellCompDirective
The ShellCompDirective controls shell behavior after your completion function returns:
| Directive | Meaning |
|---|---|
ShellCompDirectiveDefault |
Fall back to file completion after your results |
ShellCompDirectiveNoFileComp |
Disable file completion fallback |
ShellCompDirectiveNoSpace |
Don't add a space after the completion |
ShellCompDirectiveFilterFileExt(exts) |
Only show files with given extensions |
ShellCompDirectiveFilterDirs(dirs) |
Only show directories |
ShellCompDirectiveError |
Signal an error (show no completions) |
Combine with bitwise OR: cobra.ShellCompDirectiveNoFileComp | cobra.ShellCompDirectiveNoSpace.
Use ShellCompDirectiveNoFileComp whenever your list is exhaustive — it prevents the shell from appending irrelevant files.
Static arg completions
var getCmd = &cobra.Command{
Use: "get <resource>",
ValidArgs: []string{"pod", "service", "deployment", "configmap"},
Args: cobra.OnlyValidArgs,
RunE: func(cmd *cobra.Command, args []string) error { /* ... */ },
}
Dynamic arg completions
var getCmd = &cobra.Command{
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
if len(args) > 0 {
// first arg already provided — no more completions
return nil, cobra.ShellCompDirectiveNoFileComp
}
resources, err := listResources(toComplete)
if err != nil {
return nil, cobra.ShellCompDirectiveError
}
return resources, cobra.ShellCompDirectiveNoFileComp
},
}
toComplete is the prefix the user has typed so far — filter your results by it for responsive completions.
Flag value completions
func init() {
rootCmd.RegisterFlagCompletionFunc("output", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return []string{"json\tJSON output", "yaml\tYAML output", "table\tTable output"}, cobra.ShellCompDirectiveNoFileComp
})
rootCmd.RegisterFlagCompletionFunc("namespace", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
ns, err := listNamespaces()
if err != nil {
return nil, cobra.ShellCompDirectiveError
}
return ns, cobra.ShellCompDirectiveNoFileComp
})
}
Descriptions after \t are shown in zsh and fish menus.
Completion annotations
Mark a flag to complete as a file or directory:
cmd.Flags().String("config", "", "config file")
cmd.MarkFlagFilename("config", "yaml", "yml", "json") // only those extensions
cmd.Flags().String("dir", "", "output directory")
cmd.MarkFlagDirname("dir")
Testing completions
func TestCompletion(t *testing.T) {
rootCmd.SetArgs([]string{"__complete", "get", ""})
buf := new(bytes.Buffer)
rootCmd.SetOut(buf)
rootCmd.Execute()
assert.Contains(t, buf.String(), "pod")
assert.Contains(t, buf.String(), "service")
}
__complete is cobra's internal completion request verb. Pass the partial args as additional arguments.
Disabling the completion command
rootCmd.CompletionOptions.DisableDefaultCmd = true // remove the completion subcommand
rootCmd.CompletionOptions.HiddenDefaultCmd = true // keep it but hide from help