#输入事件 #终端 #事件 #键绑定 #配置 #键映射

keymap

一个用于从配置中解析终端输入事件的库

4 个版本 (重大更新)

0.4.0 2023年10月11日
0.3.0 2023年9月24日
0.2.0 2023年8月1日
0.1.0 2023年7月30日

命令行界面 中排名第 506

每月下载量 36

MIT 许可证

25KB
597

keymap-rs

crates.io Rust License: MIT

keymap-rs 是一个库,用于从配置中解析终端输入事件并将其映射到终端库的事件。(例如 crosstermtermion

简介

直接使用终端库的输入事件有时并不理想。让我们以匹配 ctrl-z 事件为例

match read() {
    // `ctrl-z`
    Event::Key(KeyEvent {
        modifiers: KeyModifiers::CONTROL,
        KeyCode::Char('z'),
        ..
    }) => {}
}

此代码运行正常。但如果我们想让最终用户将键映射自定义为不同的键(例如 ctrl-xshift-c 等),我们该如何实现呢?答案是 keymap

keymap 通过允许开发者以纯文本形式定义输入事件,从而提供灵活性,这些纯文本可以被用于任何配置格式(例如 yamltoml 等)并将它们转换为终端的事件。

[keys]
ctrl-z = "..."

上面的 ctrl-z 将在第一个示例中转换为 KeyEvent { ... }

入门

请查看 示例目录 以获取完整示例。

点击显示 Cargo.toml
[dependencies]
keymap = "0.1"

让我们先定义一个简单的结构来将输入键映射到 String

use keymap::KeyMap;
use serde::Deserialize;

#[derive(Deserialize)]
struct Config(pub HashMap<KeyMap, String>)

const CONFIG: &str = r#"
up     = "Up"
down   = "Down"
ctrl-c = "Quit"
"#;

然后在您选择的终端库中(我们将使用 crossterm)。您可以使用任何反序列化器(例如 tomljson 等)将配置中的键反序列化到终端库的事件(例如 crossterm::event::KeyEvent)。

let config: Config = toml::from_str(CONFIG).unwrap();

// Read input event
match read()? {
    Event::Key(key) => {
        // `KeyMap::from` will convert `crossterm::event::KeyEvent` to `keymap::KeyMap`
        if let Some(action) = config.0.get(&Key::from(key)) {
            match action {
                "Up" => println!("Move up!"),
                "Down" => println!("Move down!"),
                // ...
                "Quit" => break,
            }
        }
    }
}

支持的终端库

依赖项

~2–14MB
~119K SLoC