7
votes

Achèvement de l'onglet dans l'interface de ligne de commande Python - Comment attraper les événements

J'écris un petit cli à Python (comme une extension au Mercurial) et souhaitez prendre en charge l'achèvement de l'onglet. Plus précisément, j'aimerais attraper des onglets de capture dans l'invite et montrer une liste d'options de correspondance (comme Bash).

Exemple: Entrez le nom de la section: P>

 ext*TAB*  
 extensions  
 extras


0 commentaires

3 Réponses :


17
votes

Pour cela, vous utilisez le readline module. < p> code le plus simple que je puisse penser: xxx

exemple d'utilisation: xxx

Outre l'achèvement, readline vous fournit:

  • édition de ligne
  • Configuration de Keybinding (modes EMACS et VI inclus)
  • Historique (flèche vers le haut pour rappeler les valeurs précédentes)
  • Historique Recherche, sauvegarde et chargement

2 commentaires

Merci, c'est exactement ce que j'espérais! Il n'y a qu'un seul problème - je ne peux pas l'amener à travailler sur mon système principal. Je suis sur OSX 10.6 avec Python 2.6 et il insère simplement une "\ t" comme normale. Alors j'ai démarré Ubuntu et ça marche parfaitement là - Savez-vous s'il y a une bibliothèque à ceci est une manière plus indépendante de la plate-forme?


Les pythons fournis par Apple n'utilisent pas la bibliothèque GNU Readline; Ils utilisent la bibliothèque d'édition dérivée BSD à la place. Les installateurs Python pour OS X de Python.org utilisent GNU Readline, de même que les pythons récents installés avec Macports.



2
votes

Un excellent exemple de l'achèvement de l'onglet en coopération avec Readline < / a> est fourni dans la bibliothèque standard comme le module RLCompleter - Vous ne pouvez pas Utilisez-le comme étant (il se termine sur la base des noms actuellement définis dans la principale et intégrée de Python), mais cela montre comment effectuer la tâche générale et comment le connecter jusqu'à readline . .


0 commentaires

1
votes

Vous devriez presque certainement utiliser le module cmd , qui implémente déjà l'achèvement de l'onglet Et ainsi de suite, et probablement d'autres parties de ce que vous essayez de faire, à l'aide du module LIVELINE, etc. Il n'y a aucun point de réinventer la roue.


0 commentaires