ncurses- KEY_ENTER 失败

问题描述 投票:0回答:4

我一直在尝试自学 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;
      }
    }
}
    
ncurses terminfo
4个回答
17
投票

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

KEY_ENTER
指的是数字键盘。

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

部分按键可能与常用控制键相同, 例如,

KEY_ENTER
与对照/M,
KEY_BACKSPACE
与对照/M 控制/H.一些诅咒的实现可能会有所不同,具体取决于它们是否特殊对待这些控制键 (并忽略 terminfo),或使用 terminfo 定义。 Ncurses 使用 terminfo 定义。如果它说
KEY_ENTER
是控制/M,getch 将返回
KEY_ENTER
当您按下 Control/M 时。

一般来说,

KEY_ENTER
表示由 数字键盘上的Enter键:

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

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

  • 根据是否呼叫了

    nl
    nonl
    ,按 常规键盘上的“Enter”可能会返回 回车或换行,最后

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

顺便说一句,换行符是 10。但在 C 语言中,它通常显示为

'\n'
(回车符为
'\r'
)。


10
投票

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


3
投票

来自 PDCurses 文档

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

尝试在

nonl()
之后致电
raw()

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


2
投票

我最近遇到了同样的

KEY_ENTER
问题,我通过将
KEY_ENTER
替换为 10 或 来修复它 ,这是 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.