2011-08-19 21 views
42

Antes de actualizar a lion, tenía la pestaña completa trabajando en una shell de python a través de la terminal. Después de these instructions, era posible tener la pestaña completa funcionando.finalización de la pestaña python Mac OSX 10.7 (Lion)

Desde que me actualicé a Lion, ahora no puedo obtener la pestaña completa trabajando en una sesión de terminal de Python. He seguido las instrucciones anteriores al pie de la letra, y todavía no funciona.

¿Hay alguna diferencia con el módulo de lectura en Lion? Conectarse a la opción 'tab: complete' ya no parece funcionar. Me pregunto si es terminal que está ignorando readline, o si es python. Versión

Python: 2.7.1

Editar:

Por pestaña completa, me refiero a lo que podía hacer algo como lo siguiente:

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

¿Qué tipo de cosas tenía antes? –

+0

¿Has considerado usar algo como ipython o bpython? –

+0

Si aún no funciona, consulte [mi respuesta en otra publicación] (http://stackoverflow.com/questions/675370/tab-completion-in-python-interpreter-in-os-x-terminal/23908884# 23908884). –

Respuesta

102

de Apple no se distribuye GNU readline con OS X .Envío BSD libedit que incluye una interfaz de compatibilidad readline. El sistema Pythons enviado por Apple y el Pythons de 64 bits/32 bits de los instaladores de python.org se construyen con libedit. El problema es que los comandos compatibles con libedit son completamente diferentes de los de readline (consulte, por ejemplo, la discusión here). Los instaladores tradicionales de python.org de 32 bits solo usan GNU readline, al igual que otros distribuidores de Python para OS X, como MacPorts. Lo más probable es que haya usado previamente un Python como este y no uno reciente de Apple. Tiene algunas opciones, además de modificar Django: puede instalar el módulo de reemplazo readline de terceros; o puede usar otro Python que viene con la línea de lectura GNU. Sin embargo, no debe usar Pythons de Python.org de 32 bits en 10.7 porque, desafortunadamente, Xcode 4 en 10.7 ya no incluye gcc-4.0 y el SDK OS X 10.4u que esas Pythons necesitan para compilar e instalar paquetes con módulos de extensión C .

Poner lo siguiente en el archivo de inicio de Python permitirá completar las pestañas tanto para la interfaz de libedit como para el módulo de lectura típico. Para obtener más información sobre el archivo de inicio pitón, 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

Solía ​​usar Python 2.7 con osx 10.6, por lo que no era el sistema python.Sin embargo, creo que tienes razón en lo que dices. Tengo que usar el sistema python, debido a algunas bibliotecas de Oracle que estoy usando para django. –

+0

Agregué la solución para que la finalización de la pestaña funcione con tu respuesta en lugar de crear una nueva ya que la información en tu respuesta es mucho mejor. Siéntase libre de eliminarlo si lo desea, y crearé una nueva respuesta. Aclamaciones –

12

ya que utiliza libedit/editline, la sintaxis para permitir la terminación automática es un poco diferente. En primer lugar, se puede obligar a los enlaces de emacs (como lo es con readline si no estoy equivocado) escribiendo:

readline.parse_and_bind("bind -e")

continuación, puede añadir la terminación automática ligada a su botón TAB (hombre editrc):

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

y si quieren apoyar sangría y tiene una historia (que se encuentra en Internet), que debe ser similar que (a menos que he cometido un error):

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 
Cuestiones relacionadas