2008-10-16 6 views
6

Python, grâce à ses liaisons readline, permet une auto-complétion en ligne de commande (comme décrit dans here). Mais, l'achèvement semble seulement fonctionner au début des chaînes. Si vous voulez 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 d'une liste de chaînes disponibles.Comment faire une autocomplétion de ligne de commande python, mais PAS seulement au début d'une chaîne

  • Un bon exemple du type d'auto-complétion que je voudrais avoir est le type qui se produit dans GMail lorsque vous tapez dans le champ À. Si vous tapez un nom de famille de vos contacts, cela apparaîtra aussi bien que si vous avez tapé 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 appariées peut être nécessaire (et non nécessaire dans le cas de readline) et c'est très 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.

L'utilisation d'émulateurs de terminal comme des curseurs serait bien. Il doit seulement fonctionner sur Linux, pas sur Mac ou Windows.

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

['Paul Eden <[email protected]>', 
'Eden Jones <[email protected]>', 
'Somebody Else <[email protected]>'] 

Je voudrais un code qui saisie semi-automatique les deux premiers éléments dans la liste après type I « Eden » et permettez-moi de choisir l'un d'entre eux (tout au long de la ligne de commande en utilisant le clavier).

Répondre

10

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 exécuter, puis contrôler-r pour rechercher le backword 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 complétée et lier la clé appropriée à celle-ci. Cette version utilise la mise en cache dans le cas où votre liste de correspondance est énorme:

#!/usr/bin/env python 

import readline 

values = ['Paul Eden <[email protected]>', 
      'Eden Jones <[email protected]>', 
      'Somebody Else <[email protected]>'] 
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 
+0

Oui, je voudrais être en mesure de rechercher dans le milieu ou la fin de chaînes et pas seulement au début. –

+0

L'exemple ci-dessus fonctionne de cette façon. Si j'appuie sur "control-r o", cela sélectionne "foo". –

+0

Nouvelle idée. Y a-t-il un moyen de faire automatiquement (c'est-à-dire sans appuyer sur control-r en premier)? –

Questions connexes