按住home或结束时从getchar获取资本O.

我在我的C代码中使用这个:

system("stty -echo -icanon"); 

这是家庭作业的一部分,但这个特定的部分是我正在做的工作超出了任务的要求。

我们正在实现一个shell,我们已经给了一堆代码来开始。 该代码不使用ncurses(如果可以的话,我会使用),并改变这将需要重写很多提供的代码。

当我按HOMEEND键时,我得到一个大写字母O(在Open中是o),然后是HOMEEND键。 我使用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,但不是[(我有HOME0x48END0x46 )。 仍然难倒如何获得真正的键码…

对于控制台应用程序, HomeEnd等键通常作为转义序列进行传输。 确切的顺序取决于您正在使用的终端程序以及如何配置。 这些信息传统上存储在termcap / terminfo中,而ncurses则根据您的终端类型从那里查找信息。

侏儒终端发送:

  • ESC O H0x1b 0x4f 0x48 )用于Home
  • ESC O F0x1b 0x4f 0x46 )为结束

KDE Konsole和xterm发送:

  • ESC [ H0x1b 0x5b 0x48 )为Home
  • ESC [ F0x1b 0x5b 0x46 )为结束

如果您读取一个ESC字符后跟[O ,您将需要读取一个额外的字符,以确定哪个键被按下。

许多元字符(例如箭头键,功能键和home,end等)被终端(也就是你的应用程序)接收为转义字符 – 转义码后跟一个或多个字节值。 由于每个字节都由一个单独的get char调用接收,所以这可能是您正在经历的。 我不知道你为什么看到转义字符为'O'。