6

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

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

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

bash$ ping www.google.com

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

我们已经在 CentO、Ubuntu、Mac 甚至不同的 shell(bash、sh、zsh)上对其进行了测试,并且到处都发生了同样的情况。我还使用kbd_mode尝试了不同的键盘模式,我们使用 RAW 和 XLATE 模式进行了测试。

在搜索答案时我能看到的最接近的事情是,当IPython 不是针对 readline 构建时,IPython 用户经历了相同的行为。但是,据我所知,这与我们的案例无关。

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

任何关于我们如何克服这个问题的想法都将不胜感激。

4

1 回答 1

1

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

这就是readlinelinenoise正在做的事情。请参阅此处获取一些代码。特别是。见功能linenoiseEnableRawMode。其他一些简单的 Python 代码示例在这里,我编写了一个简单的控制台媒体播放器,它检查左键(“\x1b[D”)和右键(“\x1b[C”)。

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

readline、libedit 或 linenoise 是一些为您完成所有工作并为您提供历史记录、自动完成等的库。

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

于 2013-10-16T10:44:51.920 回答