2012-01-25 15 views
12

मैं उप आदेशों ज्यादा मर्क्युरियल, Git, सबवर्सन & सी, कि यहां की सामान्य उपयोग है की तरह का उपयोग करता है एक कमांड लाइन उपकरण लिखा है:।समापन जब कार्यक्रम उप आदेश है

>myapp [OPTS] SUBCOMMAND [SUBCOMMAND-OPTS] [ARGS] 

जैसे

>myapp --verbose speak --voice=samantha --quickly "hello there" 

अब मैं इसके लिए ज़श पूरा करने की प्रक्रिया में हूं लेकिन जल्दी ही पता चला है कि यह एक बहुत ही जटिल जानवर है। मैंने _hg और _git पूर्णता पर एक नज़र डाली है लेकिन वे दृष्टिकोण में बहुत जटिल और अलग हैं (मैं उन्हें समझने के लिए संघर्ष करता हूं), लेकिन दोनों अलग-अलग उप-आदेश को अलग-अलग संभालने लगते हैं।

किसी को भी पता है वहाँ अगर एक तरह से काम करता है में बनाया (_arguments, _values, pick_variant & सी।) का उपयोग कर सही ढंग से उप आदेशों की अवधारणा को संभालने के लिए, उचित रूप से सामान्य विकल्प और उप आदेश विशिष्ट विकल्प से निपटने सहित? या सामान्य विकल्प और सब-कमांड मैन्युअल रूप से संभालने का सबसे अच्छा तरीका होगा?

एक बेवकूफ उदाहरण की बहुत सराहना की जाएगी।

बहुत धन्यवाद।

उत्तर

21

आप सही हैं कि zsh के लिए लेखन लेखन स्क्रिप्ट बहुत मुश्किल हो सकती है। आपकी सबसे अच्छी शर्त एक मौजूदा के रूप में एक गाइड के रूप में उपयोग करना है। गिट के लिए एक शुरुआत शुरुआती के लिए बहुत अधिक है, इमो। आप इस रेपो उपयोग कर सकते हैं:

https://github.com/zsh-users/zsh-completions

अपने प्रश्न के लिए के रूप में, आप राज्य की अवधारणा का उपयोग कर सकते है। आप अपनी उप-सामग्रियों को एक सूची में परिभाषित करते हैं, और उसके बाद $ राज्य के माध्यम से पहचानें कि आप किस आदेश में हैं। फिर आप प्रत्येक कमांड के लिए विकल्पों को परिभाषित करते हैं। आप इसे खेल के लिए पूर्णता स्क्रिप्ट में देख सकते हैं। एक सरलीकृत संस्करण नीचे है:

_play() { 
    local ret=1 

    _arguments -C \ 
    '1: :_play_cmds' \ 
    '*::arg:->args' \ 
    && ret=0 

    case $state in 
    (args) 
     case $line[1] in 
     (build-module|list-modules|lm|check|id) 
      _message 'no more arguments' && ret=0 
     ;; 
     (dependencies|deps) 
      _arguments \ 
      '1:: :_play_apps' \ 
      '(--debug)--debug[Debug mode (even more informations logged than in verbose mode)]' \ 
      '(--jpda)--jpda[Listen for JPDA connection. The process will suspended until a client is plugged to the JPDA port.]' \ 
      '(--sync)--sync[Keep lib/ and modules/ directory synced. Delete unknow dependencies.]' \ 
      '(--verbose)--verbose[Verbose Mode]' \ 
      && ret=0 
     ;; 
     esac 
    esac 

(यदि आप इसे पेस्ट करने जा रहे हैं, तो मूल स्रोत का उपयोग करें, क्योंकि यह काम नहीं करेगा)।

यह चुनौतीपूर्ण लग रहा है, लेकिन सामान्य विचार जटिल नहीं है। सबकॉमैंड पहले आता है (_play_cmds प्रत्येक के लिए विवरण के साथ उप-सामग्रियों की एक सूची है), फिर तर्क आओ। तर्क आपके द्वारा चुने गए उप-आदेश के आधार पर बनाए गए हैं। ध्यान दें कि यदि वे तर्क साझा करते हैं, तो आप एकाधिक उप-सामग्रियों को समूहित कर सकते हैं।

मैन zshcompsys के साथ आप पूरे सिस्टम के बारे में अधिक जानकारी प्राप्त कर सकते हैं, हालांकि यह कुछ घना है।

+1

यह शानदार है आपको बहुत धन्यवाद। मुझे खुशी है कि आपने कहा था कि 'zshcompsys' घना है क्योंकि मुझे लगता है कि यह मुझे लगता है कि यह मुझे शुरू हो रहा था;) –

+0

20 वर्षों में यह कोड आज मेरे लिए बाइनरी जैसा दिखता है। – aaaaaa

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