2011-03-14 61 views
12

我目前有一个Bash补全文件,它完成了脚本允许命令列表中的单个参数(称为“pbt”)。这是工作bash补全文件:多级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> 

击完成对所有允许的命令(asadmin的,干净的,部署),这是好的。

现在我想为完成添加“第二”级别。因此,例如,如果键入

pbt asadmin <tab> 

它应该完成那些只有asadmin-“环境”(这也是我将定义bash补全文件内)内的所有选项,例如说pbt asadmin [start-domain|stop-domain]但是,如果我类型

pbt deploy <tab> 

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

+1

您是否已安装或查看bash完成软件包? http://bash-completion.alioth.debian.org/ p4和apt模块执行此操作。 – mkb 2011-03-14 18:39:01

回答

19

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

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