علامة التبويب الانتهاء في واجهة سطر الأوامر بيثون - كيفية قبض على الأحداث التبويب
-
20-09-2019 - |
سؤال
أنا أكتب 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 وما إلى ذلك. لا يوجد نقطة إعادة اختراع العجلة.