2009-01-09 20 views
27

मेरी अजगर कार्यक्रम की तरह अलग अलग विकल्प (या subcommands) की एक सीमा के साथ शुरू किया जा सकता है:कस्टम के साथ रेखा पूरा होने के आदेश

$ myProgram doSomething 
$ myProgram doSomethingElse 
$ myProgram nowDoSomethingDifferent 

मैं इसके साथ स्वत: पूर्ण करने का उपयोग करना चाहते, इसलिए यदि मैं टाइप "MyProgram घ कि "यह" myProgram doSomething "देता है और यदि मैं" myProgram n "टाइप करता हूं तो यह" myProgram NowDo SomomethingDifferent "प्रस्तुत करता है। यह मॉड्यूल rlcompleter के औसत उपयोग के समान है, लेकिन यह फाइल सिस्टम (या इतिहास से) से संभव समापन विकल्प नहीं लेता है, लेकिन स्ट्रिंग के कस्टम सेट से (जो मेरे प्रोग्राम के लिए उपलब्ध विकल्पों के अनुरूप है)

इस पर लागू करने के तरीके पर कोई विचार?

मुझे वैरिएबल PYTHONSTARTUP के बारे में पता है (जो उस फ़ाइल को इंगित करना चाहिए जिसे मुझे नहीं लिखना है)।

एक काम उदाहरण के रूप में, Django-व्यवस्थापक (Django पैकेज से) एक ही सटीक सुविधा मैं

+0

जो एक बाश सवाल है। इसे काम करने के लिए आपको बैश को कस्टमाइज़ करना होगा। इसमें अजगर के साथ कुछ लेना देना नहीं है। – nosklo

उत्तर

37

"myprog-complet.bash" फ़ाइल बनाएं और इसे अपनी .bashrc फ़ाइल में स्रोत बनाएं। कुछ इस तरह आप आरंभ करने के लिए ...

_myProgram() 
{ 
    cur=${COMP_WORDS[COMP_CWORD]} 
    case "${cur}" in 
    d*) use="doSomething" ;; 
    n*) use="nowDoSomethingElse" ;; 
    esac 
    COMPREPLY=($(compgen -W "$use" -- $cur)) 
} 
complete -o default -o nospace -F _myProgram myProgram 
+0

क्या इसका उपयोग उपनामों के साथ किया जा सकता है? मेरे पास [gist] है (https://gist.github.com/vko-online/8fc32fb6bcf0369b3ab0) और मैं ट्विटर Google आदि जैसी कुछ वेबसाइटों पर स्वत: पूर्ण होना चाहता हूं, कोई विचार? –

+0

मुझे अजीब त्रुटि मिली, 'आदेश नहीं मिला: पूर्ण' = ( –

3

तलाश कर रहा हूँ के रूप में अच्छी तरह से मुझे पता है है, PYTHONSTARTUP जब दुभाषिया शुरू होता आदेशों निष्पादित करने के लिए के लिए है [1]rlcompleter स्वत: पूर्णता के लिए आपकी स्क्रिप्ट के लिए है, यदि यह readline लाइब्रेरी का उपयोग कर रहा है। कुछ इस तरह:

$ ./myscript.py 
My Script version 3.1415. 
Enter your commands: 
myscript> B<TAB>egin 
myscript> E<TAB>nd 

अपने उदाहरण में आप खोल कमांड लाइन पर पूरा करना चाहते हैं। यह स्वत: पूर्णता एक खोल सुविधा है (या तो bash या zsh, जो भी आप उपयोग करते हैं)। देखें, उदाहरण के लिए, an introduction to bash autocompletion (part 2)। zsh के लिए, उदाहरण के लिए this guide देखें।

6

यदि मैं सही ढंग से समझता हूं तो आप अपनी पायथन लिपि शुरू होने से पहले कमांड लाइन पर लाइन पूर्ण करना चाहते हैं। फिर आपको एक अजगर समाधान की खोज नहीं करनी चाहिए, लेकिन खोल सुविधाओं को देखें।

यदि आप बैश का उपयोग कर रहे हैं तो आप/etc/bash_completion पर देख सकते हैं, और कम से कम डेबियन/उबंटू पर आपको /etc/bash_completion.d/ में एक फ़ाइल बनाना चाहिए जो आपके प्रोग्राम के पूर्ण होने को निर्दिष्ट करता है।

+0

+1। मैं इसके लिए जाऊंगा। यदि आपके पास पूरा होने का एक सीमित सेट है तो इसे सेट अप करना बहुत आसान है। और यह उपयोगकर्ता को एक इंटरफ़ेस देता है जिसका उपयोग किया जाता है। – PEZ

0

यदि आप चाहते हैं कि आपका प्रोग्राम कमांड लाइन विकल्प का चयन करे, भले ही आपने केवल इस विकल्प के संक्षिप्त रूप का उपयोग किया हो, तो आपको मानक पुस्तकालय में optparse module पर एक नज़र रखना चाहिए।

15

मॉड्यूल optcomplete जो आप अपने अजगर कार्यक्रम में पार्टी स्वतः पूर्णता के लिए पूरा होने लिखने की अनुमति देता है। यह optparse के साथ संयोजन में बहुत उपयोगी है। आप केवल अपने तर्क एक बार परिभाषित करते हैं, को जोड़ने के अपने .bashrc

complete -F _optcomplete <program> 

और अपने सभी विकल्पों को स्वतः पूर्ण हो जाएगा करने के लिए निम्न।

+2

ऑप्टपरसे को बहिष्कृत नहीं किया गया है और argparse के साथ प्रतिस्थापित किया गया है। Argcomplete पसंद करें: https://github.com/kislyuk/argcomplete – user48956

8

जैसा कि अन्य उत्तरों में बताया गया है, बैश में यह बैश-बिल्टिन complete के साथ किया जा सकता है। एक फ़ंक्शन लिखने से आसान (जैसे richq's answer) complete के विकल्प -W का उपयोग कर रहा है जो आपको शब्दों की एक सूची निर्दिष्ट करने देता है।अपने उदाहरण में यह होगा:

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram 

यह एक-लाइनर आप इस के लिए एक फ़ाइल बनाने के लिए नहीं है के रूप में, लेकिन अगर आप अपने .bashrc में रख सकते हैं।

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

  • कोई संबंधित समस्या नहीं^_^