2011-08-19 8 views
42

Prima di eseguire l'aggiornamento a lion, il tab completo funzionava in una shell python tramite terminale. A seguito di these instructions, è stato possibile avere scheda completa funzionante.completamento della scheda python Mac OSX 10.7 (Lion)

Dall'aggiornamento a Lion, ora non riesco a ottenere il tab completo funzionante in una sessione terminale di Python. Ho seguito le istruzioni di cui sopra alla lettera, e ancora non funziona.

C'è una differenza con il modulo readline in Lion? L'aggancio all'opzione "tab: complete" sembra non funzionare più. Mi chiedo se è terminale che sta ignorando readline, o se è Python stesso. Versione

Python: 2.7.1

Edit:

Con scheda completa, voglio dire avrei potuto fare qualcosa di simile al seguente:

# django 
import MyModel 
MyModel.objects.a[TAB] # will complete to all() 
+0

Che tipo di materiale hai completato prima? –

+0

Hai mai pensato di usare qualcosa come ipython o bpython? –

+0

Se ancora non funziona, vedi [la mia risposta in un altro post] (http://stackoverflow.com/questions/675370/tab-completion-in-python-interpreter-in-os-x-terminal/23908884# 23.908.884). –

risposta

102

di Apple non viene fornito GNU readline con OS X Spedisce BSD libedit che include un'interfaccia di compatibilità readline. Il sistema Python spedito da Apple e Python a 64 bit/32 bit dagli installatori di python.org sono costruiti con libedit. Il problema è che i comandi supportati da libedit sono completamente diversi da quelli di readline (si veda ad esempio la discussione here). I tradizionali programmi di installazione python.org a 32 bit usano GNU readline come altri distributori di terze parti di Python per OS X, come MacPorts. È probabile che tu stia già usando un Python come questo e non un recente Apple. Hai alcune opzioni, oltre a modificare Django: puoi installare il modulo di sostituzione di terze parti readline; oppure puoi usare un altro Python fornito con GNU readline. Tuttavia, non dovresti usare Python.org Python a 32 bit solo su 10.7 perché, sfortunatamente, Xcode 4 su 10.7 non include più gcc-4.0 e OS X 10.4u SDK che quei Python hanno bisogno di costruire e installare pacchetti con i moduli di estensione C .

Inserendo quanto segue nel file di avvio di Python verrà abilitato il completamento del tab per l'interfaccia libedit e il tipico modulo readline. Per ulteriori informazioni sul file di avvio di pitone, see here

import readline 
import rlcompleter 
if 'libedit' in readline.__doc__: 
    readline.parse_and_bind("bind ^I rl_complete") 
else: 
    readline.parse_and_bind("tab: complete") 
+0

Ero abituato a usare python 2.7 con osx 10.6, quindi non era il python di sistema.Credo che tu abbia ragione su ciò che stai dicendo. Devo usare il sistema python, a causa di alcune librerie di oracle che sto usando per django. –

+0

Ho aggiunto la soluzione per ottenere il completamento della tabulazione lavorando alla tua risposta piuttosto che crearne una nuova in quanto le informazioni nella tua risposta sono molto migliori. Sentiti libero di rimuoverlo se vuoi, e creerò una nuova risposta. Saluti –

12

in quanto utilizza libedit/esiste EDITLINE, la sintassi per consentire il completamento automatico è un po 'diverso. È possibile prima forza binding emacs (come è con readline se non sbaglio) digitando:

readline.parse_and_bind("bind -e")

Quindi è possibile aggiungere completamento automatico collegato al tuo tasto TAB (uomo editrc):

readline.parse_and_bind("bind '\t' rl_complete")

e se si vuole sostenere il rientro e ha una storia (trovato su internet), dovrebbe apparire così (a meno che non ho commesso un errore):

import readline,rlcompleter 

### Indenting 
class TabCompleter(rlcompleter.Completer): 
    """Completer that supports indenting""" 
    def complete(self, text, state): 
     if not text: 
      return (' ', None)[state] 
     else: 
      return rlcompleter.Completer.complete(self, text, state) 

readline.set_completer(TabCompleter().complete) 

### Add autocompletion 
if 'libedit' in readline.__doc__: 
    readline.parse_and_bind("bind -e") 
    readline.parse_and_bind("bind '\t' rl_complete") 
else: 
    readline.parse_and_bind("tab: complete") 

### Add history 
import os 
histfile = os.path.join(os.environ["HOME"], ".pyhist") 
try: 
    readline.read_history_file(histfile) 
except IOError: 
    pass 
import atexit 
atexit.register(readline.write_history_file, histfile) 
del histfile