Linux键盘扫描码问题:例如,向上箭头给^ [[A.

时间:2013-10-16 09:50:40

标签: c++ linux bash shell scancodes

我们一直在努力了解Linux中的键盘扫描码行为。

当我们打开一个普通的bash shell时,箭头键按预期工作: UP 显示历史记录中的上一个项目等。但是当你产生一个进程时,箭头不再按预期工作了。例如, UP 打印 ^ [[A 而不是上一个命令。

为了证明这一点,请执行以下操作:

  

bash $ ping www.google.com

现在,按 UP DOWN 等,您将在进程运行时看到错误映射的密钥代码。但是,当您终止该过程时,箭头键将再次起作用。

我们已经在CentOs,Ubuntu,Mac甚至是不同的shell(bash,sh,zsh)上测试过它,并且在任何地方都会发生同样的情况。我还使用kbd_mode尝试了不同的键盘模式,我们使用RAW和XLATE模式进行了测试。

在搜索答案时我能看到的最接近的事情是IPython用户在IPython was not build against readline时遇到了相同的行为。但是,据我所知,这与我们的案例无关。

我们正在开发一个基于C ++ Tcl的控制台应用程序,它使用cin和cout与用户进行通信并获取输入。当我们尝试访问先前输入的命令的历史记录时,我们遇到箭头键问题。这对我们来说是一个主要问题,因为99%的人都希望箭头字符能够正常工作。

我们非常感谢有关如何克服这一点的任何想法。

1 个答案:

答案 0 :(得分:1)

您必须将终端设置为原始模式以获取扫描码并处理它们(即:禁用ICANON,您需要非规范模式)。您可能还想禁用ECHO(以便它不会在终端上打印您的输入)。

这就是readlinelinenoise正在做的事情。有关一些代码,请参阅here。 ESP。看到函数linenoiseEnableRawMode。其他一些简单的示例Python代码是here,我在其中编写了一个简单的控制台媒体播放器,用于检查左侧的按键(“\ x1b [D”)和右侧(“\ x1b [C”)。

相关调用是tcgetattr(获取当前终端状态并修改该状态结构以进入原始模式并启用其他一些有用的行为)和tcsetattr(设置状态)

readline,libedit或linenoise是一些库,它们可以为您完成所有工作并为您提供历史记录,自动完成功能等。

最后,您必须恢复旧状态,否则您将获得您在shell中描述的行为。