The cleanest GLI Bash / ZSH Tab-Completion

The perfect solution for you GLI::App based console-tools in Bash/ZSH

Official recommendation

function get_todo_commands()
{
  if [ -z $2 ] ; then
    COMPREPLY=(`todo help -c`)
  else
    COMPREPLY=(`todo help -c $2`)
  fi
}

Problems with that solution:

  • does not work on ZSH
  • does autocompletion only for the 1st and 2nd level, stops after that
  • is not very extendable

After fiddling for 2 hours I came up with the simplest and always working solution:

## this enables bash completion in ZSH
if [[ -n ${ZSH_VERSION-} ]]; then
  autoload -U +X bashcompinit && bashcompinit
fi

## instruct, where the completions for my-cli come from
complete -F get_my_cli_commands my-cli

function get_my_cli_commands()
{
  ## we have following variables available:
  # - COMP_WORDS: array with arguments, that starts with  "my-cli"
  # - COMP_CWORD: the index of the current "tab-completed" word

  local binary="my-cli"

  # args-array starting by index:1
  help_params=${COMP_WORDS[@]:1}

  # remove flags/options, so we have only "verbs"
  clean_params=${help_params//-*([^ ])?( )}
  COMPREPLY=(`$binary help -c $clean_params`)
}

Comments