Try nonl:
The nl
and nonl
例程控制是否底层显示设备
在输入时将返回键转换为换行符,以及是否在输出时将换行符转换为返回和换行(在任何一种情况下,call addch('\n')
相当于回车和换行
虚拟屏幕)。最初,这些翻译确实发生了。如果您使用 nonl 禁用它们,curses 将能够更好地利用
换行功能,导致光标移动更快。还有咒骂
然后就能够检测到返回键。
延伸阅读:注释部分 of the getch
手册页:
通常,KEY_ENTER 表示按 Enter 键发送的字符
数字键盘:
这解决了有关换行符/回车符翻译的问题。后续评论是提醒您指出手册页在以下内容中提供了基本建议初始化部分:
为了获得一次字符输入而不回显(最具交互性,
面向屏幕的程序需要这个),以下顺序应该是
用过的:
initscr(); cbreak(); noecho();
并且OP的示例程序没有使用cbreak
(or raw
)。的手册页cbreak says
通常,tty 驱动程序会缓冲键入的字符,直到出现换行符或
键入回车。这cbreak
例程禁用行缓冲
并擦除/终止字符处理(中断和流程控制字符不受影响),使用户立即键入字符
可供程序使用。这nocbreak
例程将终端返回到
正常(煮熟)模式。
最初,终端可能处于也可能不处于 cbreak 模式,因为该模式是
遗传;因此,程序应该调用cbreak
or nocbreak
明确地。大多数使用curses的交互程序都会设置cbreak模式。
注意cbreak
覆盖raw
. (See curs_getch(3x)进行讨论
这些例程如何与echo
and noecho
.)
另外,在curs_getch你可以读
If keypad为 TRUE,并且按下了功能键,该功能的标记
返回功能键而不是原始字符:
- 预定义的功能键列于
<curses.h>
作为宏
值超出 8 位字符范围。他们的名字开头为KEY_
.
也就是说,诅咒只会回归KEY_ENTER
如果程序调用keypad
:
keypad(stdscr, TRUE);
为了方便讨论,下面是一个修复示例程序截至 5 月 17 日的一些问题的示例:
#include <stdio.h>
#include <ncurses.h>
#define ctrl(x) ((x) & 0x1f)
int
main(void)
{
int c;
initscr();
keypad(stdscr, TRUE);
cbreak();
noecho();
nonl();
c = getch();
switch (c) {
case KEY_ENTER:
printw("\nkey_enter: %d", c);
break;
case ctrl('j'):
printw("\nkey: ctrl j");
break;
default:
printw("\nkeyname: %d = %s\n", c, keyname(c));
break;
}
printw("\nnow press a key to end");
getch();
endwin();
return 0;
}
也就是说,你必须调用keypad
before getch
,以及返回的值KEY_ENTER
不是一个字符(它不能用%c
).
Running on the Linux console with the usual terminal description, you will see only carriage return for the numeric keypad Enter, because that description does not use application mode. Linux console does support application mode, and a corresponding description could be written. As a quick check (there are differences...) you could set TERM=vt100
to see the KEY_ENTER
.