Tab-completamento nel interprete Python in X Terminal OS
-
21-08-2019 - |
Domanda
Diversi mesi fa, ho scritto un postare dettaglio come realizzare scheda di completamento nell'interprete interattivo standard di Python - una caratteristica che si pensava disponibile solo in IPython. Ho trovato estremamente utile dato che io a volte ho dovuto passare l'interprete standard a causa di problemi di unicode ipython.
Recentemente ho fatto qualche lavoro in OS X. Per il mio malcontento, lo script non sembra funzionare per l'applicazione Terminale di OS X. Spero che alcuni di voi con esperienza in OS X potrebbe essere in grado di aiutarmi problemi sparare in modo che possa lavorare in Terminal, pure.
sto riproducendo il codice seguente
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))
Si noti che ho un po 'modificato dalla versione sul mio blog post in modo che il IrlCompleter
viene inizializzato con una vera e propria scheda, che sembra essere quello che è uscita dal tasto Tab in Terminale.
Soluzione
Per evitare di dover utilizzare codice più GPL, Apple non include un vero e proprio readline. Invece utilizza la licenza BSD- libedit , che è compatibile solo per lo-readline-. Costruisci il tuo Python (o usare Fink o MacPorts) se si desidera che il completamento.
Altri suggerimenti
Questo dovrebbe funzionare sotto il pitone del leopardo:
import rlcompleter
import readline
readline.parse_and_bind ("bind ^I rl_complete")
considerando che questo non lo fa:
import readline, rlcompleter
readline.parse_and_bind("tab: complete")
Salva in ~ / .pythonrc.py ed eseguire in .bash_profile
export PYTHONSTARTUP=$HOME/.pythonrc.py
qui è una versione cross-platform completa di completamento automatico di caricamento per Windows / OS X / Linux in un solo colpo:
#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")
Questo funziona per me sia su bash Linux e OS X 10.4
import readline
import rlcompleter
readline.parse_and_bind('tab: complete')
Se dopo aver provato quanto sopra, si continua a non funzionare, quindi provare ad eseguire nella shell:
sudo easy_install readline
Quindi, creare ~ / .profile file con il contenuto:
export PYTHONSTARTUP=$HOME/.pythonrc.py
e ~ / .pythonrc.py file con il contenuto:
try:
import readline
except:
print ("Module readline is not available.")
else:
import rlcompleter
readline.parse_and_bind("tab: complete")
Grazie alla Steven Bamford la punta easy_install, e Nicolas per il contenuto del file.
Il modo documentato per dire libedit (il semi-readline Mac OS) e da quella reale è: se "libedit" in readline doc .: passare caso # Mac altro: passare caso readline # GNU
Dopo l'incidente in molte questioni che si occupano di Python (2 e 3) su FreeBSD, finalmente ho avuto un'estensione adeguata per lavorare con libedit direttamente come la più completa per Python.
Il problema di base con libedit / readline è che il completamento e l'ingresso di Python è stato fortemente piegata verso GNU readline ... Purtroppo, questo non è in realtà una particolarmente buona interfaccia. Si richiede un numero enorme di variabili globali in C e non funziona bene su una base "istanza".
Soluzione:
https://github.com/mark-nicholson/python-editline
Si tratta di una vera e propria estensione pitone separato che collega direttamente al libedit utilizzando l'attuale interfaccia di "libedit" -. Non la colla readline sul lato
ho provato abbastanza bene su Ubuntu, FreeBSD, OpenBSD, NetBSD e MacOS - i risultati sono pubblicati nel readme. Il c-codice è molto pulito e non ha praticamente piattaforma bit dipendenti - a differenza del modulo readline.c in Python
.Note: Funziona su python3> 3.2. NON è un rimpiazzo per 'importazione readline' in altri script, ma questi script può essere facilmente regolato. Può coesistere con readline.so - c'è il codice di un file sitecustomize.py che consente la selezione. E 'possibile utilizzare una distribuzione 'libedit.so', una su misura uno o libedit integrato nel estensione in sé.