linux - Linux 终端中是否有用于按键的预输入缓冲区?

标签 linux unix terminal keypress termios

Linux 是否会缓冲在终端中输入的,以便您稍后可以一次一个键读取它们?



我问这个问题是因为我想捕捉 ESC 和箭头键的按下情况,但找不到可靠地读取代码的方法。我将终端置于非规范模式,并希望程序在没有输入时阻塞,但如果有输入,我只想获取一个按键进行处理。

更新 2:箭头键只是一个示例。我需要识别按键,即使是对于我的程序具有未知转义序列的按键。

有两种相互冲突的情况:

  • read(1) 返回一个字符。对于功能键和 ESC 键,该字符均为 0x1b。要检查它是否是方向键,您需要读取(1),如果只按下单个 ESC,它将被阻止。
    解决方案:阻塞读(1)、非阻塞读(1)
    问题:如果第二次读取与任何功能键都不匹配,则可能意味着它是缓冲的 ESC 后跟一些序列,或者是未知的功能键。如何检测未知功能键的按下?

  • read(4) 最多返回 4 个字符,但如果按 ESC 四次让它缓冲,您将得到一个由四个 0x1b 组成的字符串。与上面相同的问题来确定是否有未知的功能键被按下。

任何人都可以解释如何在 Linux 终端中处理这些问题,或者至少发布一个证明 Linux 没有 key 输入缓冲区?

最佳答案

您应该阅读 VT100 escape sequences .

您发现转义按钮的字符代码(作为真实字符发送,但几乎专门用于表示转义序列的开始)是 0x1b .

To move the cursor UP:    <ESC>[{COUNT}A
To move the cursor DOWN:  <ESC>[{COUNT}B
To move the cursor RIGHT: <ESC>[{COUNT}C
To move the cursor LEFT:  <ESC>[{COUNT}D

您可以通过在终端中输入它们来自行测试这些内容。只需一个接一个地输入按键即可。我的终端无法识别 count 参数,但如果我输入 <ESC>[X 将成功工作(对于 A、B、C、D 中的 X)。

如果您的终端不处于 VT100 模式,请查找其所处模式的转义序列。您可能会意识到,过多依赖终端特定的转义代码会将您的程序限制为一种特定的终端类型。

关于linux - Linux 终端中是否有用于按键的预输入缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17838339/

相关文章:

java - Locale.getDefault() 总是返回 en

linux - 如何处理 wget 下载链接中的特殊字符?

bash - 如何让 git show --stat 仅列出更改的文件数、插入和删除?

python - 在 Python 3 中使用 ANSI 序列确定终端光标位置

linux - 是否可以在 sed 中使用匹配的字符串作为 shell date 命令的输入?

linux - 不遵守 TCP 保持事件参数

检查文件是否存在(由命令行参数给出)

linux - 如何查找多个文件之间的差异

linux - Debian 9.4(延伸)将 UART4 波特率更改为 9600

linux - Unix Bash shell 命令在另一个 grep 匹配时 grep 一些文本