#键码 #字节 #终端 #Unicode #不同 #转换字节 #窗口管理器

terminal-keycode

将终端中的字节转换为键码

3 个稳定版本

1.1.1 2022年3月22日
1.0.0 2022年3月21日

#480GUI


chatd 中使用

BSD-2-Clause

29KB
411

terminal-keycode

将终端中的字节转换为键码 (参考 vt102-ug 附录C)

这些代码在 xterm 中使用 104 键美国 Windows 键盘进行了实验性测量。其他终端可能会给出不同的结果。例如,我的 Linux 笔记本上的 tty 登录终端即使按住 shift 或 ctrl,也只会显示基本键码。

不同的终端和窗口管理器会捕获不同的键组合,所以您的程序可能无法捕获所有内容。

此库期望 Unicode 输入,并将根据设置的高位数量前瞻相应数量的字节,用具有 Unicode 标量值的 KeyCode::Char(char) 填充。如果非解释序列不是有效的 Unicode 标量值,您将得到一系列 KeyCode::Byte(u8)

示例

use std::io::Read;
use raw_tty::IntoRawMode;
use terminal_keycode::{Decoder,KeyCode};

fn main() {
  let mut stdin = std::io::stdin().into_raw_mode().unwrap();
  let mut buf = vec![0];
  let mut decoder = Decoder::new();
  loop {
    stdin.read_exact(&mut buf).unwrap();
    for keycode in decoder.write(buf[0]) {
      print!["code={:?} bytes={:?} printable={:?}\r\n",
        keycode, keycode.bytes(), keycode.printable()
      ];
      if keycode == KeyCode::CtrlC { return }
    }
  }
}

xterm 中各种按键的输出

$ cargo run -q --example keys
code=Char('a') bytes=[97] printable=Some('a')
code=Char('b') bytes=[98] printable=Some('b')
code=Char('c') bytes=[99] printable=Some('c')
code=PageUp bytes=[27, 91, 53, 126] printable=None
code=PageDown bytes=[27, 91, 54, 126] printable=None
code=Char('é') bytes=[195, 169] printable=Some('é')
code=Char('') bytes=[226, 152, 131] printable=Some('')
code=Tab bytes=[9] printable=Some('\t')
code=Space bytes=[32] printable=Some(' ')
code=Backspace bytes=[127] printable=None
code=ArrowUp bytes=[27, 91, 65] printable=None
code=F9 bytes=[27, 91, 50, 48, 126] printable=None
code=F3 bytes=[27, 79, 82] printable=None
code=CtrlF1 bytes=[27, 91, 49, 59, 53, 80] printable=None
code=CtrlShiftF2 bytes=[27, 91, 49, 59, 54, 81] printable=None
code=ShiftF3 bytes=[27, 91, 49, 59, 50, 82] printable=None
code=CtrlArrowUp bytes=[27, 91, 49, 59, 53, 65] printable=None
code=CtrlShiftArrowLeft bytes=[27, 91, 49, 59, 54, 68] printable=None
code=CtrlA bytes=[1] printable=None
code=CtrlB bytes=[2] printable=None
code=CtrlC bytes=[3] printable=None

如果您只需要不同键码的字节序列,您可以这样做

use terminal_keycode::KeyCode;

fn main() {
  println!["{:?}", KeyCode::ArrowLeft.bytes()]; // [27, 91, 68]
  println!["{:?}", KeyCode::CtrlShiftF1.bytes()]; // [27, 91, 49, 59, 54, 80]
  println!["{:?}", KeyCode::Char('F').bytes()]; // [70]
  println!["{:?}", KeyCode::Home.bytes()]; // [27, 91, 72]
}

无运行时依赖