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 次
25KB
597 行
keymap-rs
keymap-rs
是一个库,用于从配置中解析终端输入事件并将其映射到终端库的事件。(例如 crossterm 或 termion)
简介
直接使用终端库的输入事件有时并不理想。让我们以匹配 ctrl-z
事件为例
match read() {
// `ctrl-z`
Event::Key(KeyEvent {
modifiers: KeyModifiers::CONTROL,
KeyCode::Char('z'),
..
}) => {}
}
此代码运行正常。但如果我们想让最终用户将键映射自定义为不同的键(例如 ctrl-x
、shift-c
等),我们该如何实现呢?答案是 keymap
。
keymap
通过允许开发者以纯文本形式定义输入事件,从而提供灵活性,这些纯文本可以被用于任何配置格式(例如 yaml
、toml
等)并将它们转换为终端的事件。
[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)。您可以使用任何反序列化器(例如 toml
、json
等)将配置中的键反序列化到终端库的事件(例如 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