2011-03-14 70 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設置。)