Tab Completamento in Python Command Line Interface - come catturare eventi Tab
-
20-09-2019 - |
Domanda
Sto scrivendo un po 'CLI in Python (come estensione di Mercurial) e vorrei sostenere scheda di completamento. In particolare, vorrei schede di cattura nel prompt e mostrare un elenco di opzioni corrispondenti (come bash).
Esempio: Inserire il nome della sezione:
ext*TAB*
extensions
extras
Il problema è che non sono sicuro di come catturare gli eventi Tab. Sto utilizzando l'API ui.prompt()
di Mercurial, che è solo chiamando raw_input()
sotto il cofano.
Per quanto ne so, raw_input()
restituisce solo su 'entrare' e se un utente inserisce una scheda, la stringa restituita semplicemente include un "\t"
.
Soluzione
Per utilizzare il readline
modulo.
codice più semplice che posso pensare:
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 di utilizzo:
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 a completamento, readline
vi dà:
- editing Linea
- combinazione di tasti di configurazione (emacs e vi modi inclusi)
- Storia (freccia in su per richiamare valori precedenti)
- La storia di ricerca, salvare e caricare
Altri suggerimenti
Un ottimo esempio di come fare scheda di completamento in collaborazione con readline viene fornito nella libreria standard come il rlcompleter modulo - non si può usarlo come-si (si completa l'basa sui nomi attualmente definiti nel Python del principale e built-in), ma mostra come fare il compito generale e come collegare fino a readline
.
Si dovrebbe quasi certamente utilizzare il cmd modulo , che implementa già il completamento scheda e così via, e probabilmente altre parti di quello che stai cercando di fare, utilizzando il modulo readline e così via. Non ha senso reinventare la ruota.