我一直在尝试自学 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;
}
}
}
可能的问题是用户混淆常规键盘上的 Enter 键与数字键盘上的 Enter 键。那些可以都发送控制/M(13),但不一定。端子说明和
KEY_ENTER
指的是数字键盘。
getch
的ncurses手册页解释了注释中的行为:
部分按键可能与常用控制键相同, 例如,
与对照/M,KEY_ENTER
与对照/M 控制/H.一些诅咒的实现可能会有所不同,具体取决于它们是否特殊对待这些控制键 (并忽略 terminfo),或使用 terminfo 定义。 Ncurses 使用 terminfo 定义。如果它说KEY_BACKSPACE
是控制/M,getch 将返回KEY_ENTER
当您按下 Control/M 时。KEY_ENTER
一般来说,
表示由 数字键盘上的Enter键:KEY_ENTER
终端描述列出了最有用的按键,
常规键盘上的Enter键已由标准ASCII字符处理回车和换行,
根据是否呼叫了
或
nl
,按 常规键盘上的“Enter”可能会返回 回车或换行,最后nonl
- “输入或发送”是对此的标准描述 关键。
顺便说一句,换行符是 10。但在 C 语言中,它通常显示为
'\n'
(回车符为 '\r'
)。
尝试 10 作为 ASCII 值...在 ncurses 上为我工作。另外请更新实际代码,因为您输入的这段代码在语法上是错误的。
来自 PDCurses 文档:
#define KEY_ENTER 0x157 /* enter or send (unreliable) */
尝试在
nonl()
之后致电 raw()
。
nl 和 nonl 例程控制底层显示设备是否在输入时将返回键转换为换行符,以及是否在输出时将换行符转换为返回和换行(在任何一种情况下,调用 addch(' ') 相当于虚拟屏幕上的回车和换行)。最初,这些翻译确实发生了。如果使用 nonl 禁用它们,curses 将能够更好地利用换行功能,从而加快光标移动速度。此外,curses 将能够检测到返回键。
我最近遇到了同样的
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;
}