2009-03-17 17 views
9

Estoy escribiendo un programa que es similar a un shell. Una vez que se inicia, aparece un mensaje y usted ingresa algunos comandos específicos de la aplicación.Inicialización de NCurses sin borrar la pantalla

Hasta ahora, esto funciona bien. Sin embargo, quiero agregar soporte para el historial de comandos, como en Bash, para que el usuario pueda presionar la flecha hacia arriba o hacia abajo y ver los comandos ingresados ​​previamente.

He incluido la biblioteca ncurses, y he hecho una prueba de hello world con getch() para asegurarme de que las flechas hacia arriba y hacia abajo se informaron correctamente.

Lo que me molesta es que parece ser un requisito al que llamo initscr() que borrará la pantalla para que pueda usar getch().

Bueno por lo que la pregunta es:

¿Alguien sabe una manera de utilizar la función ncurses getch() sin llamar initscr() en primer lugar? Si no, ¿puedo hacer que no se borre la pantalla? Básicamente, estoy buscando que getch() actúe de la misma manera que getchar(), si tiene sentido.

¡Gracias de antemano!

EDIT: Creo que el mejor ejemplo de esto es cómo se ejecuta Python en modo interactivo.

Respuesta

8

Curses desea controlar completamente la pantalla y optimizar las escrituras en la pantalla, especialmente en líneas serie lentas. Para hacer esto, necesita saber qué hay en la pantalla, y la única manera razonable de hacerlo con la mayoría de los terminales es comenzar desde una pantalla vacía y realizar un seguimiento de lo que escribe en la terminal.

Por lo tanto, sospecho que (n) curses es la herramienta incorrecta para su caparazón. Es probable que deba bajar un paso en la capa de abstracción y utilizar en su lugar las lecturas terminfo y no bloqueante del terminal (entrada estándar).

(Esto no es muy útil. Lo siento.)

5

Se podía llamar a su programa de whithin rlwrap y tienen la funcionalidad sin el dolor ...

3

Aquí es otra discussion sobre esto. Las soluciones proporcionadas son:

  1. "La función 'filter()' le permite usar las maldiciones como una sola línea."
  2. "Puede escribir algo equivalente en C, usando setupterm para obtener los datos de la terminal y tparm, tputs para formatear y generar resultados".

Por supuesto que es la tercera opción para obtener el código fuente de ncurses y modificarlo para que no se borrar la pantalla más.

+0

Ese enlace da un 404 No encontrado. :-( –

+0

Editado.Lamentablemente, Wayback Machine solo tiene una versión que ya contiene 404. Sin embargo, gracias por informarnos del vínculo inactivo. – schnaader

+0

Al buscar en la línea temática de la discusión, se encontró que la discusión se archivó en una URL más estable, editada para volver a introducir el vínculo. –

0

¿Ha considerado el simple recurso de crear una entrada terminfo o termcap personalizada sin una secuencia para borrar la pantalla y luego cambiar la configuración de su terminal a ese derecho antes de ejecutar su programa? También puede usar newterm() y set_term() en ncurses. Esto solía ser más fácil con termcap, ya que podría incluir otro terminal y anular algunas de sus capacidades.

+0

Este es un truco realmente feo y no dará como resultado una aplicación que se pueda usar en los sistemas de los usuarios finales. –

+0

Eso es una tontería. Puede configurar TERMINFO en el entorno del proceso y instalar una base de datos TERMINFO personalizada bajo una ruta alternativa con un pequeño número de entradas en el momento de la instalación. A continuación, establece la variable TERM en la entrada correspondiente . Incluso teóricamente es posible hacer esto automáticamente en tiempo de ejecución utilizando las utilidades terminfo para compilar una entrada terminfo alternativa, almacenada en una ubicación no estándar apuntada por TERMINFO. Si lo hace en tiempo de ejecución, puede incluso basar la entrada confeccionada en la terminal actual. No es bonito, pero no es tan malo como usted dice. –

8

Puede ser más simple utilizar una interfaz como readline() en lugar de recurrir a ncurses en toda regla.

+0

ncurses y readline tienen diferentes licencias. ¡Asegúrate de verificar primero! – sdgfsdh