¿es posible tener una forma multiplataforma para manejar las teclas de retroceso y flechas dentro de un programa C o OCaml?Reconociendo las teclas de flecha con stdin
En realidad, una solución OCaml sería apreciada, pero muchas funciones estándar de Unix se envuelven directamente a las correspondientes llamadas API, por lo que no debería haber ningún problema para portar una solución C.
Lo que voy a lograr es atrapar las teclas de flecha para anular su comportamiento dentro del caparazón (reproduciendo la última línea u operaciones como estas). Creo que esta cosa cae antes del programa real y no es manejada por el código en sí, así que no sé si es posible.
El programa se compila bien en Linux, OS X y Windows (en cygwin) así que me gustaría hacerlo para todas las plataformas ..
Casi logré hacer que esto funcione, pero ¿cómo debo gestionar el eco manual del personaje? Pregunto esto porque el stdin se reenvía a un analizador que analiza línea por línea y lo interpreta. Debo colocar en el medio e imprimir cada char? Pero luego, cuando el usuario presione la tecla up, debería reemplazar el carácter ya impreso por algo diferente. – Jack
Al volver a leer sus preguntas, creo que usar readline/ledit es probablemente su mejor opción. Pero si quiere hacer las cosas manualmente, entonces tendrá que controlar manualmente el stdin de su analizador sintáctico. Lee de stdin, comprueba si hay una secuencia de escape en la parte superior de la pantalla, directamente al stdin del analizador. Estoy haciendo algo similar aquí: https://github.com/aplusbi/reflow/blob/master/reflow.ml en la función 'main', donde estoy leyendo stdin en una cadena y luego escribiéndola en un archivo_descr . Probablemente termines haciendo lo mismo, pero primero verificando las secuencias de escape. –
esos caracteres de flecha son en realidad de ECMA 48 standartd aquí http://man7.org/linux/man-pages/man4/console_codes.4.html se puede ver qué caracteres de control de ECMA 48 admite Linux: parece que mover el cursor a la izquierda 5 caracteres que puede hacer \ 027 [5D – aeroson