2011-03-14 20 views
12

मेरे पास वर्तमान में एक बैश पूर्णता फ़ाइल है जो स्क्रिप्ट के लिए अनुमत आदेशों की सूची से एक पैरामीटर पूरा करती है (जिसे "पीबीटी" कहा जाता है)। तो अगर मैं फोनमल्टी लेवल बैश प्राप्ति

pbt <tab> 

बैश सब अनुमति आदेश (asadmin, स्वच्छ, तैनात) है, जो ठीक है के लिए पूरा करता है

_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 asadmin <tab> 

यह सभी विकल्प है कि asadmin- "पर्यावरण" (जो मैं भी बैश पूरा होने फाइल के अंदर परिभाषित करेंगे) के अंदर ही उपलब्ध हैं पूरा करना चाहिए, उदाहरण के pbt asadmin [start-domain|stop-domain] के लिए लेकिन अगर कहते हैं कि मैं टाइप

pbt deploy <tab> 

यह उदाहरण pbt deploy [all|current] के लिए, विकल्पों में से एक और सेट करने के लिए पूरा करना चाहिए। तो दूसरे आदेश के लिए विकल्प हमेशा पहले कमांड पर निर्भर होना चाहिए। मैं इसे पूरा करने की फाइल में कैसे कर सकता हूं?

+1

क्या आपने बैश-पूर्णता पैकेज स्थापित किया है या देखा है? http://bash-completion.alioth.debian.org/ पी 4 और एपीटी मॉड्यूल ऐसा करते हैं। – mkb

उत्तर

19

एमकेबी की टिप्पणी के लिए धन्यवाद मैंने p4-example में देखा, जो कि गिट उदाहरण के विपरीत था;) - मेरे लिए इसे अनुकूलित करने के लिए पर्याप्त सरल मेरा मामला। यहां वर्किंग वर्जन है जो मैंने वही किया है जो मैंने पूछा:

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

उदाहरण के तौर पर आप यह देखना चाहते हैं कि गिट के लिए पूरा होने का तरीका कैसा है। (इसमें 227 लाइनें फ़ंक्शन परिभाषाएं और मेरे बैश सेटअप में अतिरिक्त 14 चर शामिल हैं।)

संबंधित मुद्दे