(Je suis conscient que ce n'est pas exactement ce que vous demandez, mais) Si vous êtes satisfait de l'auto-complétion/suggestions qui apparaissent sur TAB (tel qu'il est utilisé dans de nombreux shells), vous pouvez alors être rapidement opérationnel en utilisant la commande ligne de lecture module.
Voici un exemple rapide basé sur L'article de Doug Hellmann sur readline dans PyMOTW .
import readline
class MyCompleter(object): # Custom completer
def __init__(self, options):
self.options = sorted(options)
def complete(self, text, state):
if state == 0: # on first trigger, build possible matches
if text: # cache matches (entries that start with entered text)
self.matches = [s for s in self.options
if s and s.startswith(text)]
else: # no text entered, all matches possible
self.matches = self.options[:]
# return match indexed by state
try:
return self.matches[state]
except IndexError:
return None
completer = MyCompleter(["hello", "hi", "how are you", "goodbye", "great"])
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')
input = raw_input("Input: ")
print "You entered", input
Il en résulte le comportement suivant ( <TAB>
représentant une pression sur la touche de tabulation) :
Input: <TAB><TAB>
goodbye great hello hi how are you
Input: h<TAB><TAB>
hello hi how are you
Input: ho<TAB>ow are you
Dans la dernière ligne ( HOTAB ), il n'y a qu'une seule correspondance possible et la phrase entière "how are you" est complétée automatiquement.
Consultez les articles en lien pour plus d'informations sur readline
.
"Et mieux encore, il pourrait compléter les mots non seulement à partir du début... mais aussi à partir de n'importe quelle partie de la chaîne de caractères.
Pour ce faire, il suffit de modifier les critères de correspondance dans la fonction d'achèvement, c'est-à-dire de :
self.matches = [s for s in self.options
if s and s.startswith(text)]
à quelque chose comme :
self.matches = [s for s in self.options
if text in s]
Vous obtiendrez le comportement suivant :
Input: <TAB><TAB>
goodbye great hello hi how are you
Input: o<TAB><TAB>
goodbye hello how are you
Mises à jour : utilisation du tampon d'historique (comme mentionné dans les commentaires)
Un moyen simple de créer un pseudo-menu pour le défilement/la recherche consiste à charger les mots-clés dans la mémoire tampon de l'historique. Vous pourrez alors faire défiler les entrées à l'aide des touches fléchées haut/bas et utiliser la fonction Ctrl + R pour effectuer une recherche inversée.
Pour l'essayer, procédez aux modifications suivantes :
keywords = ["hello", "hi", "how are you", "goodbye", "great"]
completer = MyCompleter(keywords)
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')
for kw in keywords:
readline.add_history(kw)
input = raw_input("Input: ")
print "You entered", input
Lorsque vous exécutez le script, essayez de taper Ctrl + r suivi de a . Cela renverra la première correspondance qui contient "a". Entrer Ctrl + r pour le match suivant. Pour sélectionner une entrée, appuyez sur ENTER .
Essayez également d'utiliser les touches UP/DOWN pour faire défiler les mots-clés.