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.
(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 readline
name__.
"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
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.
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.
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 )
Pas:
Créez un fichier .pythonrc dans le répertoire personnel à l'aide de la commande suivante: vi .pythonrc
Entrez ce contenu:
import rlcompleter, readline
readline.parse_and_bind('tab:complete')
Fermer le fichier
Maintenant courir
echo "export PYTHONSTARTUP=~/.pythonrc" >> ~/.bashrc
Redémarrez le terminal
Pour ceux (comme moi) qui finissent ici par chercher l'auto-complétion dans l'interprète:
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.