use*_*202 6 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没有针对readline构建时,IPython用户经历了相同的行为.但是,据我所知,这与我们的案例无关.
我们正在开发一个基于C++ Tcl的控制台应用程序,它使用cin和cout与用户进行通信并获取输入.当我们尝试访问先前输入的命令的历史记录时,我们遇到箭头键问题.这对我们来说是一个主要问题,因为99%的人都希望箭头角色能够正常工作.
关于我们如何克服这一点的任何想法都将非常感激.
您必须将终端设置为原始模式才能获取扫描码并处理它们(即:禁用 ICANON,您需要非规范模式)。您可能还想禁用 ECHO(这样它就不会在终端上打印您的输入)。
这就是readline或linenoise正在做的事情。请参阅此处获取一些代码。特别是。参见函数linenoiseEnableRawMode
。其他一些简单的示例 Python 代码在这里,我编写了一个简单的控制台媒体播放器,它检查左侧按键(“\x1b[D”)和右侧按键(“\x1b[C”)。
相关的调用是tcgetattr
(获取当前的终端状态并修改该状态结构以进入原始模式并启用一些其他有用的行为)和tcsetattr
(设置状态)。
readline、libedit 或 linenoise 是一些可以为您完成所有工作并为您提供历史记录、自动完成等功能的库。
最后,您必须恢复旧状态,否则您将得到您在 shell 中描述的行为。