3

我在我的 C 代码中使用它:

system("stty -echo -icanon");

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

我们正在实现一个 shell,我们已经得到了一堆代码来开始。该代码不使用 ncurses(如果可以的话,我会使用它)并且更改它需要重写大量提供的代码。

当我按我的HOMEorEND键时,我得到一个大写 O(在 Open 中是一个 o),然后是HOMEandEND键。我是getchar()用来获取角色的。

似乎只有这两个键可以做到这一点,但我不确定。stdout如果提供的系统函数调用是唯一不同的东西(我们也设置为非阻塞,但这不重要),我不是 100% 。

我真的很困惑,我想实现 END 和 HOME 键,因为我经常使用它们。

如果这不是很多信息,我很抱歉。我不太了解,system无法真正理解 -echo 和 -icanon 对 stty 的影响。我已经查看了手册页,但我仍然无法弄清楚。

编辑

从亚历克斯布朗的回答中,我确认我得到了转义字符。我有类似以下的内容(在错误的伪代码中):

while (TRUE) 
    ch = getchar()
    switch (ch)
        case HOME:
        case END:
            don't print anything...
            break

        default:
            printf(ch);
            break

所以它从转义序列中打印出 O ,而不是 [ (我有0x48forHOME0x46for END)。仍然为如何获得真正的密钥代码感到困惑......

4

2 回答 2

4

对于控制台应用程序,诸如Home和之类的键End通常作为转义序列传输。确切的顺序取决于您使用的终端程序及其配置方式。该信息传统上存储在 termcap/terminfo 中,ncurses 根据您的终端类型从那里查找它。

Gnome 终端发送:

  • ESC O H( 0x1b 0x4f 0x48) 为Home
  • ESC O F( 0x1b 0x4f 0x46) 为End.

KDE Konsole 和 xterm 发送:

  • ESC [ H( 0x1b 0x5b 0x48) 为Home
  • ESC [ F( 0x1b 0x5b 0x46) 为End.

如果您读取一个ESC字符后跟[O,您将需要读取一个附加字符以确定按下了哪个键。

于 2012-08-30T07:13:33.997 回答
1

终端(以及您的应用程序)接收许多元字符(例如箭头键、功能键和 home、end 等),作为转义字符 - 转义码后跟一个或多个字节值。由于每个字节都是由单独的 get char 调用接收的,这很可能是您正在经历的。我不知道您为什么将转义字符视为“O”。

于 2012-08-30T05:16:31.247 回答