2012-06-16 17 views
5

He estado tratando de enseñarme a mí mismo ncurses y me encanta hasta ahora. Sin embargo, estoy tratando de escribir un pequeño pequeño editor de texto como pico o nano. Lo tengo configurado bastante bien hasta ahora. Creé una función para mapear las claves. No importa lo que haga, no puedo obtener una respuesta de KEY_ENTER. Cada vez que lo presiono, va al comienzo de la línea actual en la que estoy. He intentado usar raw(); y usar 13 en lugar de "KEY_ENTER" no tuvo suerte. Todas las demás teclas responden como se espera. Apreciaría cualquier consejo. He estado mirando esto tratando de hacer que funcione para siempre. ¡Gracias!ncurses- KEY_ENTER falló

void keymaps(){ 

    int ch; 
    keypad(stdscr,TRUE); 
     case KEY_UP: 
      addstr("Up\n"); 
      break; 
     case KEY_LEFT: 
      addstr("Left\n"); 
      break; 
     case KEY_RIGHT: 
      addstr("Right\n"); 
      break; 
     case KEY_BACKSPACE: 
      delch(); 
      break; 
     case Key_Enter: 
      addstr("You pressed Enter\n"); 
     default: 
      break; 
     } 
     refresh(); 
    } while(ch != KEY_HOME); 
} 

Respuesta

1

Desde el PDCurses documentation:

#define KEY_ENTER 0x157 /* enter or send (unreliable) */ 

Intente llamar después nonl()raw().

Las rutinas nl y nonl controlar si el dispositivo de visualización subyacente traduce la tecla de retorno en línea nueva en la entrada, y si se traduce de nueva línea en retorno y de avance de línea en la salida (en cualquier caso, el addch llamada ('\ n ') hace el equivalente de retorno y avance de línea en la pantalla virtual). Inicialmente, estas traducciones ocurren. Si los inhabilita usando nonl, los malditos podrán hacer un mejor uso de la capacidad de alimentación de línea, resultando en un movimiento más rápido del cursor. Además, las maldiciones podrán detectar la tecla de retorno.

+1

hmm .... parece que debería haber funcionado, pero no fue así. Voy a seguir jugando con eso. Gracias por su ayuda –

4

Pruebe 10 como valor ASCII ... funcionó para mí en ncurses. También actualice el código actual porque este código que usted pone está equivocado por la sintaxis.

+2

'10' trabajado para mí con' libncurses5-dev' – vyom

0

que tiene el mismo problema KEY_ENTER recientemente, y me fijo mediante la sustitución de KEY_ENTER con 10 o \ n, que es ASCII nueva línea.

#include <ncurses.h> 
int main() { 
    initscr(); /* init ncurses */ 
    keypad(stdscr, TRUE); /* get keyboard input */ 
    addstr("Press enter to exit.\n"); 
    while (10 != getch()) {} /* 10 == enter */ 
    endwin(); /* end ncurses */ 
    return 0; 
} 
3

El problema es probable que la confusión entre el usuario Introduzca tecla en el teclado normal frente al Introduzca tecla en el teclado numérico. Esos podrían enviar un control/M (13), pero no necesariamente. La descripción del terminal y KEY_ENTER se refieren al teclado numérico.

La página del manual ncurses para getch explica el comportamiento en el NOTES:

Algunas teclas pueden ser las mismas teclas de control como de uso común, por ejemplo, KEY_ENTER versus control/M, KEY_BACKSPACE frente de control/H. Algunas implementaciones de curses pueden diferir según si tratan estas claves de control especialmente (e ignoran el terminfo), o usan las definiciones terminfo. Ncurses usa la definición terminfo. Si dice que KEY_ENTER es el control/M, getch volverá KEY_ENTER cuando se presiona el control/M.

En general, KEY_ENTER denota el carácter (s) enviado por el Introduzca tecla en el teclado numérico:

  • la descripción de bornas enumera las claves más útiles,

  • Escriba la clave en el teclado normal ya es manejado por los caracteres ASCII estándar para retorno de carro y de avance de línea,

  • dependiendo de si nl o nonl fue llamado, presionando "Enter" en el teclado normal puede devolver cualquiera de un retorno de carro o avance de línea, y finalmente

  • "Introducir o enviar" es la descripción estándar para esta clave .

Línea de alimentación, por cierto, es un 10. Pero en C, generalmente se muestra como '\n' (y retorno de carro como '\r').