Question

J'écris un petit CLI en Python (comme une extension de Mercurial) et souhaite soutenir l'achèvement des tabulations. Plus précisément, je voudrais les onglets de prises dans l'invite et afficher une liste d'options correspondant (comme bash).

Exemple: Entrez le nom de la section:

 ext*TAB*  
 extensions  
 extras

Le problème est que je ne suis pas sûr de savoir comment attraper les événements Tab. J'utilise l'API ui.prompt() de Mercurial, qui appelle juste raw_input() sous le capot.

Pour autant que je sache, raw_input() retourne uniquement sur « entrer » et si un utilisateur entre un onglet, la chaîne retournée comprend simplement un "\t".

Était-ce utile?

La solution

Pour que vous utilisez le module readline .

Code Simplest je peux penser:

import readline
COMMANDS = ['extra', 'extension', 'stuff', 'errors',
            'email', 'foobar', 'foo']

def complete(text, state):
    for cmd in COMMANDS:
        if cmd.startswith(text):
            if not state:
                return cmd
            else:
                state -= 1

readline.parse_and_bind("tab: complete")
readline.set_completer(complete)
raw_input('Enter section name: ')

Exemple d'utilisation:

Enter section name: <tab>
email      errors     extension  extra      foo        foobar    stuff
Enter section name: e<tab>
email      errors     extension  extra      
Enter section name: ext<tab>
extension  extra      

En plus de l'achèvement, readline vous fournit:

  • L'édition de ligne
  • configuration des raccourcis clavier (emacs et vi modes inclus)
  • Histoire (flèche haut pour rappeler les valeurs précédentes)
  • Histoire recherche, enregistrement et le chargement

Autres conseils

Un excellent exemple de la façon de faire des tabulations achèvement en collaboration avec readline est fourni dans la bibliothèque standard rlcompleter Module - vous ne pouvez pas l'utiliser comme-est (il complète basée sur les noms actuellement définis dans le principal et de Python builtin), mais il montre comment faire la tâche générale et comment le raccorder à readline.

Vous devriez certainement utiliser le Module cmd , qui implémente déjà la complétion et ainsi de suite, et probablement d'autres parties de ce que vous essayez de faire, en utilisant le module readline et ainsi de suite. Il n'y a pas de réinventer la roue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top