ncurses- KEY_ENTER 失败了

15
我一直在尝试自学ncurses,到目前为止我非常喜欢它。然而,我正在尝试编写一个类似pico或nano的小型文本编辑器。到目前为止,我已经设置得相当不错了。我创建了一个函数来映射按键。无论我做什么,我都无法从KEY_ENTER获得响应。每当我按下它时,它只会跳到我当前所在行的开头。我尝试使用raw();和使用13代替KEY_ENTER,但没有成功。其他所有按键都按预期响应。我会感激任何建议。我一直盯着这个问题,试图让它工作,但一直没有成功。谢谢!
#include <stdlib.h>
#include <ncurses.h>

// gcc keymaps.c -lncurses -o keymaps
int main(){
    int ch;

    initscr();
    cbreak();
    noecho();

    keypad(stdscr,TRUE);

    while (ch = getch()) {
      switch(ch){
         case KEY_UP:
              addstr("Up\n");
              break;
          case KEY_LEFT:
              addstr("Left\n");
              break;
          case KEY_RIGHT:
              addstr("Right\n");
              break;
          case KEY_BACKSPACE:
              addstr("Backspace\n");
              break;
          case KEY_ENTER:
              addstr("You pressed Enter\n");
          default:
            printw ("%u\n", ch);
            break;
      }
    }
}
    
4个回答

17
可能的问题是用户混淆了常规键盘上的 Enter 键和数字键盘上的 Enter 键。这两个键都可以发送一个 control/M (13),但不一定相同。终端描述和 KEY_ENTER 指的是数字键盘。 getch 的 ncurses 手册页面在 NOTES 中解释了它的行为:
一些键可能与常用的控制键相同,例如 KEY_ENTER 相对于 control/M,KEY_BACKSPACE 相对于 control/H。某些 curses 实现可能会根据它们是否特别处理这些控制键(并忽略 terminfo),或者使用 terminfo 定义而有所不同。Ncurses 使用 terminfo 定义。如果它说 KEY_ENTER 是 control/M,则 getch 在按下 control/M 时将返回 KEY_ENTER
通常情况下,KEY_ENTER 表示由数字键盘上的 Enter 键发送的字符:
  • 终端描述列出了最有用的按键,
  • 常规键盘上的 Enter 键已经由回车符和换行符的标准 ASCII 字符处理了,
  • 根据是否调用了 nlnonl,按下常规键盘上的 "Enter" 可能会返回回车符或换行符,最后
  • "Enter or send" 是这个按键的标准描述。
顺带提一下,换行符被表示为10。但在C语言中,通常显示为'\n'(回车符则为'\r')。


10

尝试将ASCII值设置为10......在ncurses上对我起了作用。另外,请更新实际代码,因为您放置的代码语法错误。


3

PDCurses文档中:

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

尝试在使用raw()后调用nonl()

nl和nonl例程控制底层显示设备是否将回车键转换为输入中的换行符,以及是否将换行符转换为回车和换行符进行输出(在任一情况下,调用addch('\n')等效于在虚拟屏幕上进行回车和换行)。最初,这些转换确实会发生。如果您使用nonl禁用它们,curses将能够更好地利用换行符功能,从而实现更快的光标移动。此外,curses将能够检测到回车键。


1
嗯...看起来应该可以工作,但实际上没有。我会继续尝试。谢谢你的帮助。 - Jaron Bradley

2
我最近遇到了相同的 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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接