سؤال

منذ عدة أشهر كتبت أ مشاركة مدونة تفاصيل كيفية تحقيق إكمال علامة التبويب في مترجم Python التفاعلي القياسي - وهي ميزة اعتقدت ذات مرة أنها متوفرة فقط في IPython.لقد وجدت أنه مفيد للغاية نظرًا لأنني أحيانًا أضطر إلى التبديل إلى المترجم القياسي بسبب مشكلات IPython unicode.

لقد قمت مؤخرًا ببعض الأعمال في OS X.مما يثير استيائي هو أن البرنامج النصي لا يبدو أنه يعمل مع تطبيق OS X الطرفي.آمل أن يتمكن بعضكم من ذوي الخبرة في نظام التشغيل OS X من مساعدتي في استكشاف الأخطاء وإصلاحها حتى يتمكن من العمل في الوحدة الطرفية أيضًا.

أقوم بإعادة إنتاج الكود أدناه

import atexit
import os.path

try:
    import readline
except ImportError:
    pass
else:
    import rlcompleter

    class IrlCompleter(rlcompleter.Completer):
        """
        This class enables a "tab" insertion if there's no text for
        completion.

        The default "tab" is four spaces. You can initialize with '\t' as
        the tab if you wish to use a genuine tab.

        """

        def __init__(self, tab='    '):
            self.tab = tab
            rlcompleter.Completer.__init__(self)


        def complete(self, text, state):
            if text == '':
                readline.insert_text(self.tab)
                return None
            else:
                return rlcompleter.Completer.complete(self,text,state)


    #you could change this line to bind another key instead tab.
    readline.parse_and_bind('tab: complete')
    readline.set_completer(IrlCompleter('\t').complete)


# Restore our command-line history, and save it when Python exits.
history_path = os.path.expanduser('~/.pyhistory')
if os.path.isfile(history_path):
    readline.read_history_file(history_path)
atexit.register(lambda x=history_path: readline.write_history_file(x))

لاحظ أنني قمت بتحريره قليلاً من الإصدار الموجود في مشاركة مدونتي بحيث يكون IrlCompleter تتم تهيئته بعلامة تبويب حقيقية، والتي يبدو أنها ما يتم إخراجه بواسطة مفتاح Tab في الوحدة الطرفية.

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

المحلول

لتجنب الحاجة إلى استخدام رمز أكثر GPL، وأبل لا تشمل يقوم readline الحقيقي. بدلا من ذلك يستخدم المرخصة BSD libedit ، التي ليست سوى معظمها يقوم readline متوافق. بناء بيثون الخاص بك (أو استخدام فينك أو MacPorts) إذا كنت تريد الانتهاء.

نصائح أخرى

وهذا يجب أن تعمل تحت الثعبان ليوبارد:

import rlcompleter
import readline
readline.parse_and_bind ("bind ^I rl_complete")

وبينما هذا واحد لا:

import readline, rlcompleter
readline.parse_and_bind("tab: complete")

واحفظه في ~ / .pythonrc.py وتنفيذ في .bash_profile

export PYTHONSTARTUP=$HOME/.pythonrc.py

وهنا هو نسخة عبر منصة كاملة من إنجاز التبويب تحميل ويندوز / OS X / لينكس في طلقة واحدة:

#Code  UUID = '9301d536-860d-11de-81c8-0023dfaa9e40'
import sys
try:
        import readline
except ImportError:
        try:
                import pyreadline as readline
        # throw open a browser if we fail both readline and pyreadline
        except ImportError:
                import webbrowser
                webbrowser.open("http://ipython.scipy.org/moin/PyReadline/Intro#line-36")
                # throw open a browser
        #pass
else:
        import rlcompleter
        if(sys.platform == 'darwin'):
                readline.parse_and_bind ("bind ^I rl_complete")
        else:
                readline.parse_and_bind("tab: complete")

http://www.farmckon.net/؟p=181

وهذا يعمل بالنسبة لي على كل من باش لينكس وOS X 10.4

import readline
import rlcompleter
readline.parse_and_bind('tab: complete')

إذا بعد محاولة ما سبق، فإنه لا يزال لا يعمل، ثم محاولة تنفيذ في وعاء:

sudo easy_install readline

وبعد ذلك، إنشاء <م> ~ / .profile الملف مع المحتوى:

export PYTHONSTARTUP=$HOME/.pythonrc.py

وو<م> ~ / .pythonrc.py الملف مع المحتوى:

try:
    import readline
except:
    print ("Module readline is not available.")
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")

ستيفن بامفورد للحصول على غيض easy_install، و نيكولا للحصول على محتوى الملف.

الطريقة الموثقة لتمييز libedit (خط القراءة شبه لنظام التشغيل Mac OS) عن الطريقة الحقيقية هي:إذا كان "libidit" في readline.وثيقة:تمرير # mac case else:تمرير # حالة قراءة جنو

وبعد تحطمها في العديد من القضايا التي تتعامل مع بيثون (2 و 3) على فري، وأخيرا حصلت على تمديد السليم للعمل باستخدام libedit مباشرة كما متمما لبيثون.

والقضية الأساسية مع libedit / يقوم readline هي أن إنجاز بايثون والمدخلات وعازمة بقوة نحو GNU يقوم readline ... للأسف، وهذا هو في الواقع ليست واجهة جيدة للغاية. ويتطلب ذلك عددا من العملاق غلوبالس في C و لا تعمل بشكل جيد على أساس "مثيل".

والحل:

https://github.com/mark-nicholson/python-editline

وهذا هو الصحيح تمديد الثعبان منفصل الذي يربط مباشرة إلى libedit باستخدام الفعلية "libedit" واجهة - لا الغراء يقوم readline على الجانب

ولقد اختبرت ذلك جدا بدقة على أوبونتو، فري، اكبر برهان، نت بي وماك - يتم نشرها النتائج في التمهيدي. ج-متاحة نظيفة جدا وليس لديها أي منصة بت تعتمد - على عكس وحدة readline.c في بيثون

.

وملاحظات:     وهي تعمل على Python3> 3.2.     وهي ليست بديلا الإفلات في ل"يقوم readline استيراد" في مخطوطات أخرى، ولكن هذه النصوص يمكن تعديلها بسهولة.     ويمكن أن تتعايش مع readline.so - هناك رمز لملف sitecustomize.py التي تمكن التحديد.     فإنه يمكن استخدام توزيع "libedit.so"، وهي مخصصة لبناء واحد أو libedit صلب التمديد نفسه.

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