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.
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ć.
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
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")
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')
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.
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
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.
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