Многоуровневое завершение Bash - PullRequest
15 голосов
/ 14 марта 2011

В настоящее время у меня есть файл завершения Bash, который завершает один параметр из списка разрешенных команд для скрипта (называемый «pbt»). Это рабочий файл Bash Completion:

_pbt_complete()
{
  local cur goals

  COMPREPLY=()
  cur=${COMP_WORDS[COMP_CWORD]}
  goals='asadmin clean deploy'
  cur=`echo $cur`
  COMPREPLY=($(compgen -W "${goals}" ${cur}))
}

complete -F _pbt_complete pbt

Так что, если я позвоню

pbt <tab>

Bash выполняет все разрешенные команды (asadmin, clean, deploy), что нормально.

Теперь я хочу добавить «второй» уровень к завершению . Так, например, если я наберу

pbt asadmin <tab>

он должен завершить все параметры, которые доступны только внутри asadmin- "environment" (которую я также определю в файле завершения bash), скажем, например, pbt asadmin [start-domain|stop-domain] Но если я наберу

pbt deploy <tab>

он должен завершиться другим набором опций, например pbt deploy [all|current]. Таким образом, параметры для второй команды всегда должны зависеть от первой команды. Как я могу сделать это в файле завершения?

Ответы [ 2 ]

23 голосов
/ 14 марта 2011

Благодаря комментарию mkb я посмотрел на p4-пример , который был - в отличие от примера Git;) - достаточно простым для меня, чтобы приспособить его к моему случаю.Вот рабочая версия, которая делает именно то, что я просил:

have pbt &&
_pbt_complete()
{
  local cur prev

  COMPREPLY=()
  cur=${COMP_WORDS[COMP_CWORD]}
  prev=${COMP_WORDS[COMP_CWORD-1]}

  if [ $COMP_CWORD -eq 1 ]; then
    COMPREPLY=( $(compgen -W "asadmin deploy" -- $cur) )
  elif [ $COMP_CWORD -eq 2 ]; then
    case "$prev" in
      "asadmin")
        COMPREPLY=( $(compgen -W "start-domain stop-domain" -- $cur) )
        ;;
      "deploy")
        COMPREPLY=( $(compgen -W "all current" -- $cur) )
        ;;
      *)
        ;;
    esac
  fi

  return 0
} &&
complete -F _pbt_complete pbt
2 голосов
/ 14 марта 2011

В качестве примера вы можете посмотреть, как завершается git.(Это занимает 2257 строк определений функций и еще 14 переменных в моей настройке bash.)

...