2010-01-12 12 views
5

Sto scrivendo una piccola CLI in Python (come estensione a Mercurial) e vorrei supportare il tab-completion. In particolare, mi piacerebbe prendere le schede nel prompt e mostrare un elenco di opzioni di corrispondenza (proprio come bash).Completamento scheda nell'interfaccia della riga di comando Python - come catturare gli eventi di tabulazione

Esempio: Inserire il nome della sezione:

ext*TAB* 
extensions 
extras 

Il problema è che non sono sicuro di come catturare gli eventi Tab. Sto usando l'API ui.prompt() di Mercurial, che sta chiamando lo raw_input() sotto il cofano.

Per quanto ne so, raw_input() restituisce solo su "invio" e se un utente immette una scheda, la stringa restituita include semplicemente un "\t".

risposta

15

Per questo si utilizza il modulo readline.

più semplice codice mi viene in mente: l'utilizzo

import readline 
COMMANDS = ['extra', 'extension', 'stuff', 'errors', 
      'email', 'foobar', 'foo'] 

def complete(text, state): 
    for cmd in COMMANDS: 
     if cmd.startswith(text): 
      if not state: 
       return cmd 
      else: 
       state -= 1 

readline.parse_and_bind("tab: complete") 
readline.set_completer(complete) 
raw_input('Enter section name: ') 

Esempio:

Enter section name: <tab> 
email  errors  extension extra  foo  foobar stuff 
Enter section name: e<tab> 
email  errors  extension extra  
Enter section name: ext<tab> 
extension extra  

Oltre completamento, readline vi dà:

  • editing Linea
  • configurazione scorciatoie (emacs e le modalità vi incluse)
  • Storia (freccia in alto per richiamare valori precedenti)
  • Storia di ricerca, salvataggio e caricamento
+0

Grazie, questo è esattamente quello che speravo! C'è solo un problema: non riesco a farlo funzionare sul mio sistema principale. Sono su OSX 10.6 con Python 2.6 e inserisce semplicemente un \ 't' normale. Così ho avviato Ubuntu e funziona perfettamente lì - sai se c'è una libreria per questo è un modo più indipendente dalla piattaforma? – Paulitex

+6

I Python forniti da Apple non usano la libreria GNU readline; usano invece la libreria editline derivata da BSD. I programmi di installazione di Python per OS X di python.org usano GNU readline, così come i recenti Python installati con MacPorts. –

2

Un ottimo esempio di come fare scheda di completamento in collaborazione con readline viene fornito nella libreria standard come il Modulo rlcompleter - non è possibile utilizzarlo così com'è (si completa in base ai nomi attualmente definiti in Python principale e incorporato), ma mostra come eseguire l'attività generale e come collegarlo a readline.

1

Si dovrebbe quasi certamente usare cmd module, che già implementa il completamento della scheda e così via, e probabilmente altre parti di ciò che si sta tentando di fare, utilizzando il modulo readline e così via. Non ha senso reinventare la ruota.