Tab-dopełnienie w interpreterze Pythona w terminalu OS X

Kilka miesięcy temu napisałem post na blogu opisujący, jak osiągnąć wypełnienie tabulatorów w standardowym interpreterze Pythona-funkcji, którą kiedyś uważałem za dostępną tylko w Ipythonie. Uważam, że jest to niezwykle przydatne, biorąc pod uwagę, że czasami muszę przełączyć się na standardowy interpreter z powodu problemów z IPython unicode.

Ostatnio wykonałem trochę pracy w OS X. ku mojemu niezadowoleniu, skrypt nie wydaje się działać dla aplikacji terminalowej OS X. Mam nadzieję, że niektórzy z was z doświadczenie w OS X może być w stanie pomóc mi w problemach-strzelać go, aby mógł działać również w Terminalu.

Odtwarzam poniższy kod

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))

Zauważ, że lekko zmodyfikowałem go z wersji na moim blogu tak, że {[1] } jest inicjalizowana z true tab, która wydaje się być tym, co jest wyprowadzane przez klawisz Tab w Terminalu.

Author: gotgenes, 2009-03-24

7 answers

Aby uniknąć konieczności używania większej ilości kodu GPL, Apple nie zawiera prawdziwego readline. Zamiast tego używa licencjonowanego przez BSD libedit, który jest w większości kompatybilny z readline. Zbuduj własny Python (lub użyj Fink lub MacPorts), jeśli chcesz ukończyć.

 8
Author: vasi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-26 11:47:57

To powinno działać pod Pythonem Leoparda:

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

Natomiast ten nie:

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

Zapisz w~/. pythonrc.py i wykonać .bash_profile

export PYTHONSTARTUP=$HOME/.pythonrc.py
 56
Author: B0rG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-14 08:52:51

Oto pełna wieloplatformowa wersja loading tab completion Dla Windows/OS X/Linux w jednym ujęciu:

#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")

Z http://www.farmckon.net/?p=181

 11
Author: FarMcKon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-11 01:52:21

To działa dla mnie zarówno na Linux bash i OS X 10.4

import readline
import rlcompleter
readline.parse_and_bind('tab: complete')
 1
Author: Van Gale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-23 23:11:58

Jeśli po wypróbowaniu powyższego, nadal nie działa, spróbuj wykonać w powłoce:

sudo easy_install readline

Następnie utwórz ~/.profil plik o treści:

export PYTHONSTARTUP=$HOME/.pythonrc.py

I ~/. pythonrc.py plik o treści:

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

Podziękowania dla Stevena Bamforda za końcówkę easy_install i Nicolasa za zawartość pliku.

 1
Author: Gilad Beeri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-28 10:17:56

Udokumentowanym sposobem odróżnienia libedit (Mac OS semi-readline) od rzeczywistego jest: jeśli "libedit" w readline.doc : pass # Mac case else: pass # GNU readline case

 0
Author: Paul Koning,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-16 19:25:27

Po wielu problemach dotyczących Pythona (2 i 3) na FreeBSD, w końcu dostałem odpowiednie rozszerzenie do pracy z libedit bezpośrednio jako completer dla Pythona.

Podstawowy problem z libedit / readline polega na tym, że zakończenie i wejście Pythona było mocno pochylone w kierunku GNU readline... Niestety, nie jest to szczególnie dobry interfejs. Wymaga olbrzymiej liczby globali w C i nie działa dobrze na " instancji" podstawa.

Rozwiązanie:

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

Jest to prawdziwe oddzielne rozszerzenie Pythona, które bezpośrednio łączy się z libedit za pomocą rzeczywistego interfejsu "libedit" - a nie kleju readline z boku.

Przetestowałem go dość dokładnie na Ubuntu, FreeBSD, OpenBSD, NetBSD i MacOS -- wyniki są zamieszczone w readme . Kod c jest bardzo czysty i praktycznie nie ma bitów zależnych od platformy-w przeciwieństwie do readline.moduł c w Python.

Uwagi: Działa na Python3 > 3.2. Nie jest to zamiennik 'Importuj readline' w innych skryptach, ale te skrypty można łatwo dostosować. Może współistnieć z readline.so -- there is code for a sitecustomize.py plik, który umożliwia zaznaczenie. Może korzystać z dystrybucji "libedit.so', Niestandardowy wbudowany lub libedit wbudowany w samo rozszerzenie.

 0
Author: mjn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-01 16:35:13