2011-08-19 3 views
42

Avant la mise à niveau vers le lion, j'avais tabulation complète fonctionnant dans un shell python via le terminal. Suite à these instructions, il était possible d'avoir l'onglet complet de travail.Python tab achèvement Mac OSX 10.7 (Lion)

Depuis la mise à niveau vers Lion, je n'arrive plus à terminer l'exécution de l'onglet dans une session terminal de Python. J'ai suivi les instructions ci-dessus à la lettre, et cela ne fonctionne toujours pas.

Y a-t-il une différence avec le module readline dans Lion? Accrocher à l'option 'tab: complete' ne semble plus fonctionner. Je me demande si c'est terminal qui ignore readline, ou si c'est python lui-même.

Python version: 2.7.1

Edit:

par onglet complet, je veux dire que je pouvais faire quelque chose comme ce qui suit:

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

Quel genre de choses l'avez-vous fait compléter avant? –

+0

Avez-vous envisagé d'utiliser quelque chose comme ipython ou bpython? –

+0

Si cela ne fonctionne toujours pas, voir [ma réponse dans un autre post] (http://stackoverflow.com/questions/675370/tab-completion-in-python-interpreter-in-os-x-terminal/23908884# 23908884). –

Répondre

102

Apple ne sont pas livrés avec GNU readline OS X Il embarque BSD libedit qui inclut une interface de compatibilité readline. Le système Python livré par Apple et les Pythons 64 bits/32 bits des installeurs python.org sont construits avec libedit. Le problème est que les commandes supportées par libedit sont complètement différentes de celles de readline (voir par exemple la discussion here). Les installateurs python.org traditionnels 32 bits utilisent GNU readline comme d'autres distributeurs tiers de Python pour OS X, comme MacPorts. Les chances sont que vous utilisiez précédemment un tel Python et pas un Apple récent. Vous avez quelques options, en plus de modifier Django: vous pouvez installer le module de remplacement tiers readline; ou vous pouvez utiliser un autre Python fourni avec GNU readline. Cependant, vous ne devriez pas utiliser les python 32 bits seulement Python sur 10.7 car, malheureusement, Xcode 4 sur 10.7 ne comprend plus gcc-4.0 et le SDK OS X 10.4u dont ces Pythons ont besoin pour construire et installer des paquets avec des modules d'extension C . La mise en place de ce qui suit dans le fichier de démarrage de Python activera l'achèvement de l'onglet à la fois pour l'interface libedit et le module readline standard. Pour plus d'informations sur le fichier de démarrage de python, 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

J'avais l'habitude d'utiliser python 2.7 avec osx 10.6, donc ce n'était pas le système python.Je crois que vous avez raison dans ce que vous dites. Je dois utiliser le système python, en raison de certaines bibliothèques Oracle que j'utilise pour django. –

+0

J'ai ajouté la solution pour que l'achèvement de l'onglet travaille à votre réponse plutôt que d'en créer un nouveau, car l'information dans votre réponse est beaucoup mieux. N'hésitez pas à l'enlever si vous le souhaitez, et je vais créer une nouvelle réponse. À votre santé –

12

Comme il utilise libedit/editline, la syntaxe pour permettre autocomplétion est un peu différent. Vous pouvez d'abord forcer les liaisons emacs (comme il est avec readline si je ne me trompe pas) en tapant:

readline.parse_and_bind("bind -e")

vous pouvez ajouter autocomplétion lié à votre bouton TAB (man editrc):

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

et si vous voulez soutenir et indenter a une histoire (qui se trouve sur Internet), il devrait ressembler à ça (à moins que je fait une erreur):

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 
Questions connexes