2011-02-01 4 views
7

Ho una sorta di classe di completamento con una funzione di completamento automatico. Versione semplice:Come rendere le corrispondenze di visualizzazione del completamento automatico di Python?

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 

ed eseguire qualcosa di simile a questo per ottenere il completamento automatico con readline:

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

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

Quindi, ci sono 3 parole per il completamento automatico [ "aiuto", "mkdir "," mktbl "] nell'esempio.

se un utente esegue:
> he<tab>
l'utente ottiene:
> help

ma se l'utente esegue
> mk<tab>
non sta succedendo niente perché non ci sono una singola partita (mkdir e mktbl)

Come visualizzare le opzioni in caso ci siano più partite? Come il Bash fare con un completamento automatico dei nomi di file?

Così utente whold ottenere qualcosa di simile:
> mk<tab>
mktbl mkdir
> mk<cursor>


P.S. Ho cercato di mettere
_readline.insert_text (...) _
e
stampa ...
in funzione di completamento, ma i freni l'inserimento, in modo che un utente ottiene qualcosa di simile:
> mk<tab>
> mkmktbl mkdir <cursor>

PPS Ho bisogno di una soluzione Linux.

+1

Questa non è una risposta completa, e potrebbe essere eccessivo per qualcosa di così semplice, ma usare 'curses' è un buon (anche se complesso) modo di fare questo genere di cose: http://docs.python.org /library/curses.html Dai un'occhiata al tutorial qui: http://docs.python.org/howto/curses.html#curses-howto –

+0

Potrebbe essere! Grazie! Ma siamo assolutamente soddisfatti della funzionalità fornita da readline. E l'unica cosa di cui abbiamo bisogno è mostrare queste opzioni al completamento automatico. Abbiamo esaminato le maledizioni, ma è davvero troppo complesso solo per una piccola cosa come questa. – MajesticRa

+0

Interessante domanda, ho avuto idee su una cosa simile. – Skurmedel

risposta

6

Impostare l'opzione readline

set show-all-if-ambiguous on 

se si vuole completamenti dopo la prima <tab>. Altrimenti, premi semplicemente <tab> due volte.

Riferimento: http://caliban.org/bash/, Sezione Tips and Tricks readline

PS. Testato il tuo codice su OS X e Linux, funziona bene (sulle mie macchine;)

+0

Grazie! La tua risposta ha risolto i problemi su linux. Non funziona su Windows. Ma Windows ha una versione perversa di readline e cmd quindi è purtroppo ok. – MajesticRa

2

Mi è stata suggerita una soluzione che completa la risposta. Permette di organizzare l'output di completamento delle opzioni di autocompletamento.

Per readline linux ci sono la funzione readline.set_completion_display_matches_hook
http://docs.python.org/library/readline.html?highlight=readline#readline.set_completion_display_matches_hook

Così, per l'esempio di cui sopra questo codice

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) 

questo si produse:
> mk<tab>

useless text to be displayed 
mk 
mkdir mktbl 
5 

> mk<cursor>

Per le finestre readl c'è una risposta allo stack overflow:
How do I make IPython organize tab completion possibilities by class?

Non so come funziona per mac.