我在我的C代码中使用这个:
system("stty -echo -icanon");
这是家庭作业的一部分,但这个特定的部分是我正在做的工作超出了任务的要求。
我们正在实现一个shell,我们已经给了一堆代码来开始。 该代码不使用ncurses(如果可以的话,我会使用),并改变这将需要重写很多提供的代码。
当我按HOME或END键时,我得到一个大写字母O(在Open中是o),然后是HOME和END键。 我使用getchar()
来获取angular色。
看来这是唯一的两把钥匙,但我不确定。 我不是100%,如果提供的系统函数调用是唯一不同的(我们也设置stdout
为非阻塞,但这不应该)。
我真的很困惑,我想实现END和HOME键,因为我用它们很多。
对不起,如果这不是很多的信息。 我对system
知之甚less,不能真正了解-echo和-icanon对stty的影响。 我已经看了手册页,但我仍然无法弄清楚。
编辑
从Alex Brown的回答中,我证实我正在逃脱人物。 我有类似以下内容(在伪代码中):
while (TRUE) ch = getchar() switch (ch) case HOME: case END: don't print anything... break default: printf(ch); break
所以它从转义序列中打印出O,但不是[(我有HOME为0x48
, END为0x46
)。 仍然难倒如何获得真正的键码…
对于控制台应用程序, Home和End等键通常作为转义序列进行传输。 确切的顺序取决于您正在使用的终端程序以及如何配置。 这些信息传统上存储在termcap / terminfo中,而ncurses则根据您的终端类型从那里查找信息。
侏儒终端发送:
0x1b 0x4f 0x48
)用于Home和 0x1b 0x4f 0x46
)为结束 。 KDE Konsole和xterm发送:
0x1b 0x5b 0x48
)为Home和 0x1b 0x5b 0x46
)为结束 。 如果您读取一个ESC字符后跟[或O ,您将需要读取一个额外的字符,以确定哪个键被按下。
许多元字符(例如箭头键,功能键和home,end等)被终端(也就是你的应用程序)接收为转义字符 – 转义码后跟一个或多个字节值。 由于每个字节都由一个单独的get char调用接收,所以这可能是您正在经历的。 我不知道你为什么看到转义字符为'O'。