24

我目前有一个 Bash 完成文件,它从脚本的允许命令列表(称为“pbt”)中完成单个参数。这是有效的 Bash 完成文件:

_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-“环境”中可用的所有选项(我还将在 bash 完成文件中定义),例如pbt asadmin [start-domain|stop-domain]但是如果我输入

pbt deploy <tab>

它应该完成另一组选项,例如pbt deploy [all|current]. 所以第二个命令的选项应该总是依赖于第一个命令。我怎样才能在完成文件中做到这一点?

4

2 回答 2

32

感谢 mkb 的评论,我查看了p4-example,它 - 与 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
于 2011-03-14T19:09:43.717 回答
2

例如,您可能想看看 git 的完成是如何完成的。(在我的 bash 设置中,这需要 2257 行函数定义和额外的 14 个变量。)

于 2011-03-14T18:49:27.133 回答