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".

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top