【问题标题】:Can both esc key and escape sequences be separtely detected on Unix systems?可以在 Unix 系统上单独检测 esc 键和转义序列吗?
【发布时间】:2018-02-05 17:00:11
【问题描述】:

我有一个 Linux 发行版,我希望能够检测到各种键,但我不知道如何区分按下 Escape 键和检测为按键的键。

如果我使用这个:

require 'io/console'
puts STDIN.raw { STDIN.getc }

然后按下Arrow up,解释器将立即返回\e,然后在随后的getc 调用中,无需按任何键,它将返回转义序列的剩余字符([ 和@ 987654326@).

问题是,在第一次调用getc 之后,我不知道用户是否真的按下了Esc,或者另一个生成转义序列的键。

是否可以在没有多次getc 调用的情况下区分这两种情况?

【问题讨论】:

    标签: ruby input terminal escaping


    【解决方案1】:

    我不这么认为,因为字符输入是在比物理键盘更高的级别上完成的。也就是说,设计,getc 读取的 ESC 字符是 ESC 字符,无论它是如何在键盘上输入的(或者根本不在键盘上输入,因为例如,通过重定向)。

    我认为开箱即用的 Ruby 没有办法检测键盘按下等硬件事件。有IOCTL 用于较低级别的设备访问,但我不知道如何将其用于您的目的。但即使可以,您将如何处理备用键盘布局?您期望的 ESC 键可能会映射到不同的字符。

    $stdin 上有一个 read_nonblock 方法,您可以在读取 ESC 键后立即使用该方法查看缓冲区中是否还有其他字符。如果是这样,很可能是按下了ESC 以外的特殊字符。如果没有,很可能是按下了ESC 键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      相关资源
      最近更新 更多