Comment effectuer la saisie semi-automatique en ligne de commande python, mais PAS uniquement au début d'une chaîne

StackOverflow https://stackoverflow.com/questions/209484

Question

Python, grâce à ses liaisons readline, permet une excellente complétion automatique en ligne de commande (comme décrit dans ici ).

Mais, l'achèvement ne semble fonctionner qu'au début des chaînes. Si vous souhaitez faire correspondre le milieu ou la fin d'une chaîne, readline ne fonctionne pas.

Je souhaite compléter automatiquement les chaînes, dans un programme python en ligne de commande, en faisant correspondre ce que je tape avec l'une des chaînes de la liste des chaînes disponibles.

  • Un bon exemple du type de complétion automatique que je souhaiterais avoir est le type qui se produit dans GMail lorsque vous tapez dans le champ À. Si vous tapez le nom de famille de l'un de vos contacts, il apparaîtra aussi bien que si vous avez entré son prénom.
  • Une utilisation des flèches vers le haut et vers le bas ou une autre méthode de sélection parmi les chaînes correspondantes peut être nécessaire (et non nécessaire dans le cas de readline), ce qui est bien dans mon cas.
  • Mon cas d'utilisation particulier est un programme de ligne de commande qui envoie des courriels.
  • Des exemples de code spécifiques seraient très utiles.

Utiliser des émulateurs de terminaux comme des malédictions serait acceptable. Il ne doit fonctionner que sur Linux, pas sur Mac ou Windows.

Voici un exemple: Disons que j'ai les trois chaînes suivantes dans une liste

['Paul Eden <paul@domain.com>', 
'Eden Jones <ejones@domain.com>', 
'Somebody Else <somebody@domain.com>']

Je voudrais un code qui complétera automatiquement les deux premiers éléments de la liste après avoir tapé "Eden", puis me permettre d'en choisir un (tout au long de la ligne de commande à l'aide du clavier).

Était-ce utile?

La solution

Je ne suis pas sûr de comprendre le problème. Vous pouvez utiliser readline.clear_history et readline.add_history pour configurer les chaînes que vous souhaitez compléter, puis ctrl-r pour rechercher des mots clés dans l'historique (comme si vous étiez à l'invite du shell). Par exemple:

#!/usr/bin/env python

import readline

readline.clear_history()
readline.add_history('foo')
readline.add_history('bar')

while 1:
    print raw_input('> ')

Vous pouvez également écrire votre propre version de completer et y associer la clé appropriée. Cette version utilise la mise en cache au cas où votre liste de correspondance serait énorme:

#!/usr/bin/env python

import readline

values = ['Paul Eden <paul@domain.com>', 
          'Eden Jones <ejones@domain.com>', 
          'Somebody Else <somebody@domain.com>']
completions = {}

def completer(text, state):
    try:
        matches = completions[text]
    except KeyError:
        matches = [value for value in values
                   if text.upper() in value.upper()]
        completions[text] = matches
    try:
        return matches[state]
    except IndexError:
        return None

readline.set_completer(completer)
readline.parse_and_bind('tab: menu-complete')

while 1:
    a = raw_input('> ')
    print 'said:', a
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top