2008-10-16 14 views
6

पायथन की शुरुआत में, इसकी रीडलाइन बाइंडिंग के माध्यम से महान कमांड लाइन स्वत: पूर्णता (here में वर्णित) के लिए अनुमति देता है।पाइथन कमांड-लाइन स्वत: पूर्णता कैसे करें, न केवल स्ट्रिंग

लेकिन, पूरा होने केवल तारों की शुरुआत में काम करता प्रतीत होता है। यदि आप स्ट्रिंग रीडलाइन के मध्य या अंत से मेल खाना चाहते हैं तो काम नहीं करता है।

मैं उपलब्ध स्ट्रिंग्स की सूची में किसी भी स्ट्रिंग के साथ टाइप किए गए मिलान से मेल करके एक कमांड लाइन पायथन प्रोग्राम में स्ट्रिंग को स्वत: पूर्ण करना चाहता हूं।

  • स्वत: पूर्णता के प्रकार का एक अच्छा उदाहरण यह है कि जब आप फ़ील्ड में टाइप करते हैं तो जीमेल में ऐसा होता है। यदि आप अपने संपर्कों में से एक का अंतिम नाम टाइप करते हैं, तो यह ठीक उसी तरह आएगा जब आप उसका पहला नाम टाइप करेंगे।
  • मिलान किए गए तारों से चयन करने के लिए ऊपर और नीचे तीर या कुछ अन्य विधि के कुछ उपयोग की आवश्यकता हो सकती है (और रीडलाइन के मामले में आवश्यक नहीं) और यह मेरे मामले में ठीक है।
  • मेरा विशेष उपयोग केस एक कमांड लाइन प्रोग्राम है जो ईमेल भेजता है।
  • विशिष्ट कोड उदाहरण बहुत उपयोगी होंगे।

शाप जैसे टर्मिनल अनुकरणकर्ताओं का उपयोग करना ठीक होगा। इसे केवल लिनक्स पर चलाना है, मैक या विंडोज नहीं। कहो मैं एक सूची में निम्नलिखित तीन तार

['Paul Eden <[email protected]>', 
'Eden Jones <[email protected]>', 
'Somebody Else <[email protected]>'] 

मैं कुछ कोड है कि सूची में पहले दो आइटम स्वतः पूर्ण कर चाहते हैं के बाद मैं 'ईडन' टाइप है और उसके बाद:

यहाँ एक उदाहरण है मुझे उनमें से एक चुनने की अनुमति दें (सभी कीबोर्ड का उपयोग कर कमांड लाइन के माध्यम से)।

उत्तर

10

मुझे यकीन नहीं है कि मैं समस्या को समझता हूं। आप readline.clear_history और readline.add_history का उपयोग अपने इच्छित पूर्ण स्ट्रिंग को सेट करने के लिए कर सकते हैं, फिर इतिहास में बैकवर्ड खोजने के लिए नियंत्रण-आर (जैसे कि आप शेल प्रॉम्प्ट पर थे)। उदाहरण के लिए:

#!/usr/bin/env python 

import readline 

readline.clear_history() 
readline.add_history('foo') 
readline.add_history('bar') 

while 1: 
    print raw_input('> ') 

वैकल्पिक रूप से, आप अपना स्वयं का पूर्ण संस्करण लिख सकते हैं और उचित कुंजी को बांध सकते हैं। यह संस्करण आपकी मिलान सूची विशाल होने पर कैशिंग का उपयोग करता है:

#!/usr/bin/env python 

import readline 

values = ['Paul Eden <[email protected]>', 
      'Eden Jones <[email protected]>', 
      'Somebody Else <[email protected]>'] 
completions = {} 

def completer(text, state): 
    try: 
     matches = completions[text] 
    except KeyError: 
     matches = [value for value in values 
        if text.upper() in value.upper()] 
     completions[text] = matches 
    try: 
     return matches[state] 
    except IndexError: 
     return None 

readline.set_completer(completer) 
readline.parse_and_bind('tab: menu-complete') 

while 1: 
    a = raw_input('> ') 
    print 'said:', a 
+0

हां, मैं केवल शुरुआत में ही नहीं बल्कि स्ट्रिंग के बीच या अंत में खोज करने में सक्षम होना चाहता हूं। –

+0

उपर्युक्त उदाहरण इस तरह से काम करता है। अगर मैं "नियंत्रण-आर ओ" दबाता हूं, तो यह "foo" का चयन करता है। –

+0

उपन्यास विचार। क्या स्वचालित रूप से करने का कोई तरीका है (यानी, पहले नियंत्रण-आर दबाए बिना)? –

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