ncurses- KEY_ENTER失败

时间:2012-06-16 23:23:38

标签: ncurses

我一直在努力教自己ncurses,到目前为止我很喜欢它。但是,我正在尝试编写一个像pico或nano这样的小文本编辑器。到目前为止,我已经把它设置得相当好。我创建了一个映射键的函数。无论我做什么,我都无法得到KEY_ENTER的回复。每当我按下它时,它就会到达我所在的当前行的开头。我尝试过使用raw();并使用13而不是“KEY_ENTER”没有运气。所有其他键都按预期响应。我很感激任何建议。我一直盯着这个试图让它永远有效。谢谢!

    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);
}

4 个答案:

答案 0 :(得分:5)

尝试使用10作为ASCII值...在ncurses上为我工作。另请更新实际代码,因为您输入的代码是错误的语法。

答案 1 :(得分:5)

可能的问题是常规键盘上的 Enter 键与数字键盘上的 Enter 键之间的用户混淆。那些可能都发送一个控件/ M(13),但不一定。终端说明和KEY_ENTER指的是数字键盘。

getch的ncurses手册页解释了NOTES中的行为:

  

某些键可能与常用的控制键相同,   例如, KEY_ENTER 与control / M,KEY_BACKSPACE对比   控制/ H。一些curses实现可能会根据它们是否特别处理这些控制键而有所不同   (并忽略terminfo),或使用terminfo定义。 Ncurses使用terminfo定义。如果它说    KEY_ENTER 是control / M,getch将返回 KEY_ENTER   当你按下control / M时。

     

通常, KEY_ENTER 表示由...发送的字符   数字小键盘上输入键:

     
      
  • 终端说明列出了最有用的密钥

  •   
  • 常规键盘上的 Enter 键已由标准ASCII字符处理,用于回车和换行,

  •   
  • 取决于是否调用了nlnonl,请按   常规键盘上的“Enter”可以返回a   回车或换行,最后

  •   
  • “输入或发送”是此标准说明   键。
  •   
顺便说一下,

换行是10.但是在C中,它通常显示为'\n'(并且回车为'\r')。

答案 2 :(得分:1)

来自PDCurses documentation

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

nonl()之后尝试拨打raw()

  

nl和nonl例程控制底层显示设备是否将返回键转换为输入换行符,以及是否将换行符转换为return和换行输出(在任何一种情况下,调用addch('\ n')在虚拟屏幕上相当于返回和换行)。最初,这些翻译确实发生了。如果使用nonl禁用它们,curses将能够更好地利用换行功能,从而加快光标移动速度。此外,curses将能够检测返回键。

答案 3 :(得分:0)

我最近遇到了同样的KEY_ENTER问题,我通过将KEY_ENTER替换为10或 \ n 来修复它,这是ASCII新行。

#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;
}