Finalización pestaña en Python Command Line Interface - cómo coger Eventos de la pestaña
-
20-09-2019 - |
Pregunta
Estoy escribiendo un poco de CLI en Python (como una extensión de Mercurial) y me gustaría apoyar para rellenar la ficha. En concreto, me gustaría lengüetas de sujeción en el símbolo y mostrar una lista de opciones de juego (al igual que bash).
Ejemplo: Introduzca nombre de sección:
ext*TAB*
extensions
extras
El problema es que no estoy seguro de cómo atrapar a los Eventos de la pestaña. Estoy usando la API de Mercurial ui.prompt()
, que simplemente está llamando raw_input()
bajo el capó.
Por lo que yo sé, raw_input()
sólo devuelve en 'entrar' y si un usuario entra en una pestaña, la cadena devuelta simplemente incluye una "\t"
.
Solución
Para que utilice el readline
módulo.
código más simple que puedo pensar en:
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: ')
Ejemplo de uso:
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
Además de la terminación, readline
te ofrece:
- edición de línea
- combinación de teclas de configuración (emacs y modos VI incluidos)
- Historia (flecha hacia arriba para recordar los valores anteriores)
- Historia búsqueda, guardar y cargar
Otros consejos
Un excelente ejemplo de cómo hacer para rellenar la ficha en cooperación con readline se suministra en la biblioteca estándar como el rlcompleter módulo - no se puede utilizarlo como-se (que completa basa en nombres definidos actualmente en el pitón de principal y orden interna), pero muestra cómo hacer la tarea general y cómo conectarlo hasta readline
.
Usted debe casi con toda seguridad a utilizar el cmd módulo , que ya implementa la implementación del tabulador y así sucesivamente, y probablemente otras partes de lo que estás tratando de hacer, utilizando el módulo readline y así sucesivamente. No tiene sentido reinventar la rueda.