2009-10-07 19 views
6

Estoy tratando de determinar cómo el sistema imprime caracteres a la entrada estándar, es decir, cómo se imprimen caracteres que el usuario puede eliminar y que se consideran de entrada si el usuario pulsa "Enter".¿Cómo se implementaría la finalización de pestañas tipo bash?

Estoy usando C, pero me sorprendería mucho si la solución dependiera del idioma.

¡Gracias por cualquier idea! : D

+0

¿Cuál es el propósito aquí? La biblioteca GNU Readline contiene soporte de finalización, y por supuesto está GPL. – Cascabel

+0

Tengo mucha curiosidad más que nada. No me queda claro cómo Bash logra esto y me gustaría saber que parece ser algo que podría usar bien en scripts/utilidades. Gracias por indicarme en la Biblioteca GNU Readline, no estaba familiarizado con ella. Estoy seguro de que recurriré a eso si alguna vez necesito implementar esta funcionalidad. Ahora supongo que tengo que averiguar cómo lo hace la Biblioteca Readline. – zslayton

+0

Zack: Creo que mi respuesta se dirige al bit "cómo lo hace la biblioteca Readline". –

Respuesta

4

Varias personas han señalado que bash usa readline, lo cual es cierto, pero creo que lo que haces lo que realmente pregunto es cómo puede ver lo que ha tipeado antes de presionar enter.

La respuesta es que ttys (es decir, terminales) se puede cambiar al "modo sin procesar", donde el procesamiento de entrada del terminal está desactivado, y luego verá cada carácter como viene. Esto también desactiva el eco automático de caracteres escritos

Consulte esta guía en Reading a single character from a file or a terminal para obtener más información.

+0

¿Es el "modo en bruto" de ttys lo que permite que un programa escriba la sugerencia en la pantalla de tal forma que cuando se presiona "enter" se incluya como si el usuario lo hubiera tipeado él o ella? Si es así, ¿cómo se accede a un tty para leer y escribir? ¿Es un simple tipo de llamada abierta ('/ dev/tty')? – zslayton

+0

En modo raw, el programa ve las teclas incluso antes de que el usuario presione enter. Cuando escribe una clave imprimible (p. Ej., Letra, símbolo numérico), el programa la repite.Cuando presiona enter, ya ha estado haciendo un seguimiento de lo que escribió, y simplemente "acepta" el búfer en respuesta a la tecla Intro. –

+0

En "modo cocido", el terminal hará eco de todo lo que escriba, pero no envía lo que escribió al programa hasta que presione enter. bash cambia el tty al modo cocido justo antes de ejecutar otros programas. Puede hacerse una idea de cómo el modo cocido se comporta de forma diferente al modo sin procesar al ejecutar "sleep 300" y luego escribir mientras se ejecuta el comando sleep. Tenga en cuenta que puede escribir líneas e incluso tiene * muy * funciones de edición básicas (por ejemplo, retroceso). Una vez que presionas Enter, la línea se confirmará y cuando se complete el comando sleep, bash intentará ejecutar esas líneas (¡así que ten cuidado!). –

1

Utiliza la biblioteca readline para manejar la entrada y readline proporciona el historial y la finalización.

Para realmente implementar la finalización, se necesita acceso al manejo de la entrada del teclado. La finalización debe poder modificar el búfer utilizado por él. Después de eso, solo se trata de mirar la entrada actual y verificar qué terminaciones se encuentran. La lógica de finalización real puede funcionar de muchas maneras.

5

Como dice iny, bash usa readline para su entrada. La fuente está disponible here, y hay un archivo llamado complete.c.

Para responder a su pregunta, no creo que estén impresos en la entrada estándar. Readline contiene algún tipo de búfer para los contenidos de la línea que el usuario está editando, y la finalización imprime en este. Cuando el usuario presiona enter, el contenido del búfer se envía a cualquier programa que quiera leer una línea y, en el caso de bash, se transfiere a la entrada estándar. (Readline no hace esto - otros programas que usan readline pueden simplemente almacenar el valor en una cadena para su uso posterior.)

+0

¡Gracias, eso tiene sentido! Gracias también a iny. – zslayton

Cuestiones relacionadas