【问题标题】:Multi Level Bash Completion多级 Bash 完成
【发布时间】:2011-03-14 18:18:53
【问题描述】:

我目前有一个 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]。所以第二个命令的选项应该总是依赖于第一个命令。我怎样才能在完成文件中做到这一点?

【问题讨论】:

标签: bash bash-completion


【解决方案1】:

感谢 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

【讨论】:

  • 在查看 git 示例后我完全迷失了,这个看起来非常好!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多