Commands created by auto-completion go cobra in the linux fish shell

The book picks up where it left off, since cobra-basedGolang AST parses struct fields to automatically generate CRUD code, added some more features. This code generator that automatically moves bricks for me is basically complete. ??

However, when using it in the project, it’s still a little bit flawed, that is, it can’t auto-complete the commands in the fish shell, mainly the commands I created, the commands I can’t remember myself ?. It’s also a bit of a pain in the ass to look at them by typing in the cobra help parameter each time. So I wondered if it is possible to auto-complete commands like smug. I looked it up, and it works:

Add fish autocomplete

cobra has built-in auto-completion for various shells. Such as, fish, bash, zsh, powershell.

For example, my bricklaying tool is called go_snip, and to see how to generate a fish autocomplete configuration, you can enter the command

> go_snip completion fish --help 
 
Generate the autocompletion script for the fish shell. 
 
To load completions in your current shell session: 
 
        go_snip completion fish | source 
 
To load completions for every new session, execute once: 
 
        go_snip completion fish > ~/.config/fish/completions/go_snip.fish 
 
You will need to start a new shell for this setup to take effect. 
 
Usage: 
  go_snip completion fish [flags] 
 
Flags: 
  -h, --help              help for fish 
      --no-descriptions   disable completion descriptions 

If, however, the fish shell has not been configured for auto-completion before, you need to create a new directory:

mkdir ~/.config/fish/completions/ 

Then perform the Import Configuration operation:

> go_snip completion fish > ~/.config/fish/completions/go_snip.fish 

Then, you can use autocomplete normally.

actual effect

Pressing tab once brings up the command prompt, and pressing tab twice brings up all the commands:

linux fish shell 中自动补全 go cobra 创建的命令

What is the content of the generated fish configuration?

For pure curiosity, open ~/.config/fish/completions/go_snip.fish

The previous function definitions are omitted. It is completely unreadable as if it were a ghost note.

# Remove any pre-existing completions for the program since we will be handling all of them. 
complete -c go_snip -e 
 
# this will get called after the two calls below and clear the $__go_snip_perform_completion_once_result global 
complete -c go_snip -n '__go_snip_clear_perform_completion_once_result' 
# The call to __go_snip_prepare_completions will setup __go_snip_comp_results 
# which provides the program's completion choices. 
# If this doesn't require order preservation, we don't use the -k flag 
complete -c go_snip -n 'not __go_snip_requires_order_preservation && __go_snip_prepare_completions' -f -a '$__go_snip_comp_results' 
# otherwise we use the -k flag 
complete -k -c go_snip -n '__go_snip_requires_order_preservation && __go_snip_prepare_completions' -f -a '$__go_snip_comp_results' 

Do you need to re-import after creating a new command

For example, I’ll add a new subcommand

> cobra-cli add test1 
> go install 

It is not necessary to import fish again to complete the configuration, the previous configuration supports listing all commands.

The configuration directory structure of fish

> tree ~/.config/fish/ 
/home/zhongwei/.config/fish/ 
├── completions 
│   └── go_snip.fish 
├── config.fish 
└── fish_variables 
 
1 directory, 3 files