我一直在努力教自己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);
}
答案 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字符处理,用于回车和换行,
取决于是否调用了
nl
或nonl
,请按 常规键盘上的“Enter”可以返回a 回车或换行,最后- “输入或发送”是此标准说明 键。
换行是10.但是在C中,它通常显示为'\n'
(并且回车为'\r'
)。
答案 2 :(得分:1)
#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;
}