web-dev-qa-db-fra.com

Comment coder la complétion automatique en python?

Je voudrais coder l'auto-complétion dans un terminal Linux. Le code devrait fonctionner comme suit.

Il contient une liste de chaînes (par exemple, "bonjour," bonjour "," comment vas-tu "," au revoir "," génial ", ...).

Dans le terminal, l’utilisateur commence à taper et, s’il ya une possibilité de correspondance, il obtient l’indice des chaînes possibles dans lesquelles il peut choisir (de la même manière que dans vim editor ou recherche incrémentale google ).

par exemple. il commence à taper "h" et il obtient l'allusion

bonjour"

_ "je"

_ "vous êtes"

Et mieux encore, cela permettrait de compléter les mots non seulement du début, mais d'une partie arbitraire de la chaîne.

Merci pour le conseil.

31
xralf

(Consommation à la carte non résolue comme bonjour, à moi) Se il faut absolument que tout se passe comme prévu.TAB(viens usato in molte Shell), il est possible d’obtenir rapidement et de manière amusante son utilisation readline .

Voir les réponses plus rapidement en bref écrit par Doug Hellmann par readline .

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

Cliquez ici pour comprendre le comportement (<TAB> il y a un onglet souvenir du goût premuto):

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

Nell'ultima riga (HOTABinserito), esiste una sola corrispondenza possibile e interprete frase "come stai" viene completata automaticamente.

Contrôler les points de vue collatéraux des données sur readlinename__.


"E ancora meglob sarebbe se completasse le Parole non solo dal'inizio ... completamento da parte arbitraria della stringa."

Vous êtes le premier à en avoir une nouvelle modification dans les critères de sélection de la qualité de la vie privée, complète. un partire dal:

self.matches = [s for s in self.options 
                   if s and s.startswith(text)]

un qualcosa di simile:

self.matches = [s for s in self.options 
                   if text in s]

Vous êtes le premier à connaître un comportement:

Input: <TAB><TAB>
goodbye      great        hello        hi           how are you

Input: o<TAB><TAB>
goodbye      hello        how are you

Aggiornamenti: utilisation du tampon della cronologia (venez menzionato nei commenti)

Un modèle de menu créé par un pseudo-menu de lecture/écriture est disponible dans les mémoires tampons mémoire. Fais-toi remarquer dans les étapes de la recherche de l'information sur les boissons savoureuses sur le mondeCtrl+Rper eseguire una ricerca inversa.

Par province, déterminez le changement suivant:

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

Quando esegui lo script, devenez un digitareCtrl+rseguito daa. Ciò restituirà la prima corrispondenza che contiene "a". accedereCtrl+rdi nuovo per la prossima partita. Par sélections sont unes voeux, premereENTER.

Cliquez sur le bouton droit de la souris pour afficher le texte intégral.

45
Shawn Chin

Je suppose que l'utilisateur devra appuyer sur une touche.

Vous pouvez y arriver (sans appuyer sur Entrée) avec une méthode comme celle-ci:

import termios, os, sys

def getkey():
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    new = termios.tcgetattr(fd)
    new[3] = new[3] & ~termios.ICANON & ~termios.ECHO
    new[6][termios.VMIN] = 1
    new[6][termios.VTIME] = 0
    termios.tcsetattr(fd, termios.TCSANOW, new)
    c = None
    try:
        c = os.read(fd, 1)
    finally:
        termios.tcsetattr(fd, termios.TCSAFLUSH, old)
    return c

Ensuite, si cette clé est une touche de tabulation (par exemple, vous devez l'implémenter), affichez toutes les possibilités pour l'utilisateur. Si c'est une autre clé, imprimez-la sur stdout.

Oh, bien sûr, vous aurez besoin d'avoir getkey () en boucle dans un moment, tant que l'utilisateur clique sur Entrée. Vous pouvez également obtenir une méthode telle que raw_input, qui permet d’obtenir le mot entier, signe par signe, ou d’afficher toutes les possibilités lorsque vous appuyez sur un onglet.

Au moins c'est le point, vous pouvez commencer. Si vous rencontrez des problèmes, écrivez à leur sujet.

EDIT 1:

La méthode get_Word peut ressembler à ceci:

def get_Word():
    s = ""
    while True:
        a = getkey()
        if a == "\n":
            break
        Elif a == "\t":
            print "all possibilities"
        else:
            s += a

    return s

Word = get_Word()
print Word

Le problème que je suis en train de parler est la façon d’afficher un signe, vous venez d’entrer sans entrée ni espace, ce que print a et print a, font tous les deux.

6
Gandi

Pour activer la complétion automatique dans un shell Python, tapez ceci:

import rlcompleter, readline
readline.parse_and_bind('tab:complete')

(merci à http://blog.e-Shell.org/221 )

4
Nicolas S

Pas:

  1. Créez un fichier .pythonrc dans le répertoire personnel à l'aide de la commande suivante: vi .pythonrc

  2. Entrez ce contenu: 

    import rlcompleter, readline  
    readline.parse_and_bind('tab:complete') 
    
  3. Fermer le fichier

  4. Maintenant courir 

    echo "export PYTHONSTARTUP=~/.pythonrc" >> ~/.bashrc

  5. Redémarrez le terminal

2
AMAN JAIN

Pour ceux (comme moi) qui finissent ici par chercher l'auto-complétion dans l'interprète:

https://web.archive.org/web/20140214003802/http://conjurecode.com/enable-auto-complete-in-python-interpreter/

Cela implique la création d'un fichier .pythonrc, la modification de .bashrc et un import sys que vous devez importer à chaque lancement de l'interpréteur Python.

Je me demande si ce dernier peut être automatisé pour gagner encore plus.

1
Mark Jeronimus