علامة التبويب الانتهاء في واجهة سطر الأوامر بيثون - كيفية قبض على الأحداث التبويب

StackOverflow https://stackoverflow.com/questions/2046050

سؤال

أنا أكتب cli قليلا في بيثون (كملحق إلى mercurial) وترغب في دعم إكمال علامة التبويب. على وجه التحديد، أود الحصول على علامات التبويب في المطالبة وإظهار قائمة من خيارات المطابقة (تماما مثل باش).

مثال: أدخل اسم القسم:

 ext*TAB*  
 extensions  
 extras

المشكلة هي أنني لست متأكدا من كيفية التقاط أحداث علامة التبويب. أنا أستخدم ui.prompt() واجهة برمجة تطبيقات Mercurial، والتي تدعو فقط raw_input() تحت الغطاء.

بقدر ما أعرف، raw_input() فقط إرجاع "أدخل" وإذا دخل المستخدم علامة تبويب، فإن السلسلة التي تم إرجاعها ببساطة "\t".

هل كانت مفيدة؟

المحلول

لأنك تستخدم readline وحدة.

أبسط رمز يمكنني التفكير فيه:

import readline
COMMANDS = ['extra', 'extension', 'stuff', 'errors',
            'email', 'foobar', 'foo']

def complete(text, state):
    for cmd in COMMANDS:
        if cmd.startswith(text):
            if not state:
                return cmd
            else:
                state -= 1

readline.parse_and_bind("tab: complete")
readline.set_completer(complete)
raw_input('Enter section name: ')

مثال على الاستخدام:

Enter section name: <tab>
email      errors     extension  extra      foo        foobar    stuff
Enter section name: e<tab>
email      errors     extension  extra      
Enter section name: ext<tab>
extension  extra      

إلى جانب الانتهاء، readline يوفر لك:

  • تحرير الخط
  • تكوين KeyBinding (emacs و 6 أوضاع VI المدرجة)
  • التاريخ (السهم لأعلى لتذكر القيم السابقة)
  • البحث عن التاريخ والحفظ والتحميل

نصائح أخرى

مثال ممتاز حول كيفية إجراء إكمال علامة التبويب بالتعاون مع Readline. يتم توفيرها في المكتبة القياسية كما rlcompleter. الوحدة النمطية - لا يمكنك استخدامها كما هو (يكمل بناء على الأسماء المعرفة حاليا في Python الرئيسي والمدمجة)، ولكنها تظهر كيفية القيام بالمهمة العامة وكيفية ربط ذلك readline.

يجب عليك بالتأكيد استخدام وحدة CMD., ، والتي تنفذ بالفعل إكمال علامة التبويب وهلم جرا، وربما أجزاء أخرى من ما تحاول القيام به، باستخدام وحدة ReadLine وما إلى ذلك. لا يوجد نقطة إعادة اختراع العجلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top