2011-02-01 12 views
7

Posiadam rodzaj klasy zakończenia z funkcją autouzupełniania. Prosta wersja:Jak dopasować wyświetlanie autouzupełniania Pythona?

class Completer: 
    def __init__(self): 
     self.words = ["mkdir","mktbl", "help"] 
     self.prefix = None 

    def complete(self, prefix, index): 
     if prefix != self.prefix: 
      self.matching_words = [w for w in self.words if w.startswith(prefix)] 
      self.prefix = prefix 
     else: 
      pass     
     try: 
      return self.matching_words[index] 
     except IndexError: 
      return None 

i wykonać coś takiego dostać autouzupełnianie z readline:

import readline 
readline.parse_and_bind("tab: complete") 

completer = Completer() 
readline.set_completer(completer.complete) 
user_input =raw_input("> ") 

Tak, istnieją 3 wyrazy do automatycznego uzupełniania [ "pomocy", "mkdir "," mktbl "] w przykładzie.

jeśli użytkownik wykonuje:
> he<tab>
użytkownik otrzymuje:
> help

ale jeśli użytkownik wykonuje
> mk<tab>
nic się nie dzieje, ponieważ nie są pojedynczy mecz (mkdir i mktbl)

Jak wyświetlić opcje w przypadku kilku dopasowań? Podobnie jak Bash z autouzupełnianiem nazw plików?

Zatem użytkownik whold uzyskać coś takiego:
> mk<tab>
mktbl mkdir
> mk<cursor>


PS: Próbowałem umieścić
_readline.insert_text (...) _
i
druku ...
do funkcji Completer ale hamulce wprowadzenie, więc użytkownik dostaje coś takiego:
> mk<tab>
> mkmktbl mkdir <cursor>

PPS Potrzebuję rozwiązania linuxowego.

+1

To nie jest kompletna odpowiedź i może to być przesada dla czegoś tak prostego, ale użycie 'curses' jest dobrym (choć złożonym) sposobem na zrobienie tego rodzaju rzeczy: http://docs.python.org /library/curses.html Obejrzyj samouczek: http://docs.python.org/howto/curses.html#curses-howto –

+0

Może być! Dziękuję Ci! Ale jesteśmy absolutnie zadowoleni z funkcjonalności readline. A jedyne, czego potrzebujemy, to wyświetlanie opcji w autouzupełnianiu. Przyjrzeliśmy się klątwom, ale jest to zbyt skomplikowane, jeśli chodzi o tylko jedną drobną rzecz. – MajesticRa

+0

Interesujące pytanie, miałem pomysły na podobną rzecz. – Skurmedel

Odpowiedz

6

ustawić opcję readline

set show-all-if-ambiguous on 

jeśli chcesz uzupełnienia po pierwszym <tab>. W przeciwnym razie naciśnij dwukrotnie: <tab>.

referencyjny: http://caliban.org/bash/ sekcja readline Porady

PS. Testowałem twój kod na OS X i Linuksie, działa dobrze (na moich maszynach;)

+0

Dziękujemy! Twoja odpowiedź rozwiązała problemy na Linuksie. To nie działa w systemie Windows. Ale Windows ma perwersyjną wersję readline i cmd, więc jest niestety w porządku. – MajesticRa

2

Zaproponowano mi rozwiązanie, które uzupełni odpowiedź. Pozwala zorganizować wyjście z opcji autouzupełniania.

Dla readline linux istnieje funkcja readline .set_completion_display_matches_hook
http://docs.python.org/library/readline.html?highlight=readline#readline.set_completion_display_matches_hook

Tak więc, na przykład wymienione powyżej tego kodu

def print_suggestions(self, substitution, matches, longest_match_length) : 
    print "useless text to be displayed" 
    print substitution 
    print " ".join[match for match in matches] 
    print longest_match_length 

readline.set_completion_display_matches_hook(print_suggestions) 

będzie produse:
> mk<tab>

useless text to be displayed 
mk 
mkdir mktbl 
5 

> mk<cursor>

dla Windows readl Odpowiedź jest wyświetlana przy przepełnieniu stosu:
How do I make IPython organize tab completion possibilities by class?

Nie wiem, jak to działa w systemie Mac.

Powiązane problemy