2013-05-20 3 views
8

के साथ स्वत: पूर्ण स्क्रिप्ट बनाना मैं मछली के साथ उपयोग के लिए एक स्वत: पूर्ण स्क्रिप्ट बनाने की कोशिश कर रहा हूं; मैं एक ही कार्यक्रम के लिए एक बैश समापन स्क्रिप्ट पर पोर्टिंग कर रहा हूँ।उप आदेश

कार्यक्रम तीन शीर्ष स्तर आदेशों है, कहते हैं कि foo, bar, और baz और प्रत्येक कुछ subcommands है, बस ab और c प्रत्येक के लिए कहते हैं।

क्या मैं दिखाई दे रही है शीर्ष स्तर आदेशों स्वत: पूर्ण ठीक है, यदि ऐसा है तो मैं टाइप f मैं स्वत: पूर्ण करने के लिए foo हो रही है, लेकिन फिर अगर मैं फिर से टैब मारा देखने के लिए यह क्या उप आदेशों कर रहे हैं, मैं foo देखना है , bar, baz, a, b, c और यह सिर्फ a, b होना चाहिए, c

मैं एक संदर्भ के रूप में उपयोग कर रहा हूँ git completion script यह बाद से सही काम करने के लिए लगता है। मैं भी संदर्भ के रूप में git flow script का उपयोग कर रहा हूं।

मुझे लगता है कि इस Git पूरा होने लिपि में द्वारा नियंत्रित किया जाता:

function __fish_git_needs_command 
    set cmd (commandline -opc) 
    if [ (count $cmd) -eq 1 -a $cmd[1] = 'git' ] 
    return 0 
    end 
    return 1 
end 

कौन समझ में आता है, आप केवल पूरा होने अगर वहाँ आदेश के लिए एक एकल आर्ग, स्क्रिप्ट ही है उपयोग कर सकते हैं; यदि आप शीर्ष स्तर के आदेशों पर कॉल करने के लिए कॉल के लिए स्थिति (-n) के रूप में उपयोग करते हैं, तो मुझे लगता है कि सही बात होगी।

हालांकि, जो मैं देख रहा हूं वह मामला नहीं है। मैंने उस स्क्रिप्ट को मेरी लिपि में कॉपी किया, उचित रूप से "गिट" बदल दिया, और कोई भाग्य नहीं था।

function __fish_prog_using_command 
    set cmd (commandline -opc) 
    set subcommands $argv 
    if [ (count $cmd) = (math (count $subcommands) + 1) ] 
    for i in (seq (count $subcommands)) 
     if not test $subcommands[$i] = $cmd[(math $i + 1)] 
     return 1 
     end 
    end 
    return 0 
    end 
    return 1 
end 

function __fish_git_needs_command 
    set cmd (commandline -opc) 
    set startsWith (echo "$cmd[1]" | grep -E 'prog$') 
    # there's got to be a better way to do this regex, fish newb alert 
    if [ (count $cmd) = 1 ] 
    # wtf, this is always false? it this the problem? 
    if [ $cmd[1] -eq $cmd[1] ] 
     return 1 
    end 
    end 

    return 0 
end 

complete --no-files -c prog -a bar -n "__fish_git_needs_command" 

complete --no-files -c prog -a foo -n "__fish_git_needs_command" 

complete --no-files -c prog -a a -n "__fish_prog_using_command foo" 
complete --no-files -c prog -a b -n "__fish_prog_using_command foo" 
complete --no-files -c prog -a c -n "__fish_prog_using_command foo" 

complete --no-files -c prog -a baz -n "__fish_git_needs_command" 

यह कैसे काम करने के लिए पर कोई सुझाव बहुत सराहना की है:

कांट छांट स्क्रिप्ट इस प्रकार है।

उत्तर

7

मुझे लगता है कि आप जानते हैं कि return 0 सही है और return 1 का अर्थ है झूठा?

आपके आउटपुट से ऐसा लगता है कि आपका needs_command फ़ंक्शन ठीक से काम नहीं कर रहा है, इस प्रकार उप-बैंड होने पर भी बार दिखा रहा है।

मैं बस निम्नलिखित कोड की कोशिश की और यह उम्मीद के रूप में काम करता है: पूरा होने से

function __fish_prog_needs_command 
    set cmd (commandline -opc) 
    if [ (count $cmd) -eq 1 -a $cmd[1] = 'prog' ] 
    return 0 
    end 
    return 1 
end 

function __fish_prog_using_command 
    set cmd (commandline -opc) 
    if [ (count $cmd) -gt 1 ] 
    if [ $argv[1] = $cmd[2] ] 
     return 0 
    end 
    end 
    return 1 
end 

complete -f -c prog -n '__fish_prog_needs_command' -a bar 

complete -f -c prog -n '__fish_prog_needs_command' -a foo 
complete -f -c prog -n '__fish_prog_using_command foo' -a a 
complete -f -c prog -n '__fish_prog_using_command foo' -a b 
complete -f -c prog -n '__fish_prog_using_command foo' -a c 

complete -f -c prog -n '__fish_prog_needs_command' -a baz 

आउटपुट:

➤ prog <Tab> 
bar baz foo 
➤ prog foo <Tab> 
a b c 
➤ prog foo 

इस है कि तुम क्या चाहते हो?

+0

हाँ, यह काम किया, धन्यवाद। – Michael

+0

महान उदाहरण @terje और @Michael के लिए धन्यवाद! 'Full -f -c prog -n' सूचीबद्ध करने के बजाय __fish_prog_using_command foo '-aa',' full -f -c prog -n '__fish_prog_using_command foo' -ab', और 'full -f -c prog -n' __fish_prog_using_command foo अलग-अलग लाइनों पर '-एसी', मेरा मानना ​​है कि आप एक अंतरिक्ष के साथ तीनों पूर्णताओं को सीमित कर सकते हैं: 'full -f -c prog -n' __fish_prog_using_command foo '-a "abc" ' – yegeniy