13

我一直在尝试自学 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

4 回答 4

12

可能的问题是用户混淆Enter了普通键盘上的Enter键和数字键盘上的键。它们都可以发送控制/M (13),但不一定。端子说明并KEY_ENTER参考数字键盘。

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

一些键可能与常用的控制键相同,例如,KEY_ENTER 相对于 control/M, KEY_BACKSPACE 相对于 control/H。一些 curses 实现可能会有所不同,具体取决于它们是专门处理这些控制键(并忽略 terminfo),还是使用 terminfo 定义。Ncurses 使用 terminfo 定义。如果它说 是 control/M, 那么当你按下 control/M 时KEY_ENTER getch 将返回。KEY_ENTER

通常,表示数字键盘上的EnterKEY_ENTER发送的字符 :

  • 终端描述列出了最有用的键,

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

  • 根据是否nlnonl调用,在常规键盘上按“Enter”可能会返回回车或换行,最后

  • “输入或发送”是此键的标准描述。

顺便说一句,换行符是 10。但在 C 语言中,它通常显示为'\n'(而回车符为'\r')。

于 2016-07-05T23:35:22.233 回答
10

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

于 2015-08-09T04:57:03.903 回答
2

PDCurses 文档中:

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

nonl()之后尝试调用raw()

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

于 2012-06-16T23:30:33.267 回答
1

KEY_ENTER最近遇到了同样的问题,我通过替换KEY_ENTER10 或\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;
}
于 2016-07-05T12:39:54.107 回答