From d38603414f8ddce0c7ae0c6b5a6adcf43fbe9821 Mon Sep 17 00:00:00 2001
From: Marut K
Date: Mon, 1 Jun 2026 19:00:30 +0700
Subject: [PATCH] docs(examples): consistent terminal output with print_config,
add reload example
- Add print_config helper that displays colored key symbols and help text
- Fix terminal output to clear previous key press on both crossterm and termion backends
- Add print_config calls to all examples showing available shortcuts
- Add reload example demonstrating runtime config rotation via 'r' key
- Update examples/README.md with capturing and reload entries
- Add reload.tape
---
Cargo.toml | 1 +
README.md | 24 +++++++++++-
examples/README.md | 9 +++++
examples/action.rs | 15 ++++----
examples/backend/crossterm.rs | 16 +++++++-
examples/backend/mod.rs | 35 ++++++++++++-----
examples/backend/termion.rs | 14 ++++++-
examples/capturing.rs | 6 +--
examples/config.rs | 3 +-
examples/derive.rs | 3 +-
examples/derived_config.rs | 3 +-
examples/modes.rs | 8 +++-
examples/reload.gif | Bin 0 -> 96716 bytes
examples/reload.rs | 69 ++++++++++++++++++++++++++++++++++
examples/reload.tape | 29 ++++++++++++++
examples/sequences.rs | 6 ++-
examples/simple.rs | 1 +
examples/wasm/src/main.rs | 6 +--
18 files changed, 212 insertions(+), 36 deletions(-)
create mode 100644 examples/reload.gif
create mode 100644 examples/reload.rs
create mode 100644 examples/reload.tape
diff --git a/Cargo.toml b/Cargo.toml
index cefc039..3355dd8 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -7,6 +7,7 @@ documentation.workspace = true
repository.workspace = true
license.workspace = true
edition.workspace = true
+exclude = ["examples/*"]
[lib]
doctest = false
diff --git a/README.md b/README.md
index 235bbaa..cd4bfe9 100644
--- a/README.md
+++ b/README.md
@@ -58,6 +58,23 @@ See `keymap-rs` in action with the [WASM example](https://rezigned.com/keymap-rs
+
+
+
+
+ | Runtime Reload (Rebind keys at runtime) |
+
+
+
+
+
+
+ |
+
+
+
+
+
---
## 📦 Installation
@@ -120,8 +137,11 @@ let config = Action::keymap_config();
match config.get(&key) {
Some(action) => match action {
Action::Quit => break,
- Action::Jump => println!("Jump! Symbol: {:?}, Help: {:?}",
- action.keymap_item().symbol, action.keymap_item().help),
+ Action::Jump => println!(
+ "Jump! Symbol: {:?}, Help: {:?}",
+ action.keymap_item().symbol,
+ action.keymap_item().help)
+ ),
_ => println!("Action: {action:?} - {}", action.keymap_item().description),
}
_ => {}
diff --git a/examples/README.md b/examples/README.md
index d93428b..50d46ea 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -32,6 +32,10 @@ Shows how to load key mappings exclusively from external configuration files, ig
Explores combining derive macro defaults with external configuration overrides, covering configuration precedence and key group patterns like `@digit`.
+### [`capturing.rs`](./capturing.rs)
+**Key group capturing using `.get_bound()`**
+
+Demonstrates dynamic key capture with key group patterns like `@any`, `@digit`, `@alpha`, etc. The `Shoot(char)` variant captures the actual pressed character at runtime via `.get_bound()`.
### [`modes.rs`](./modes.rs)
**Multi-mode application with different key mappings**
@@ -43,6 +47,11 @@ Illustrates building applications with multiple modes (like `vim`), where differ
Explains how to handle multi-key sequences (like `j j` for double-tap actions), including sequence detection, timing-based handling, and sequence timeout management.
+### [`reload.rs`](./reload.rs)
+**Runtime keymap reload**
+
+Demonstrates swapping key bindings at runtime by re-deserializing a `DerivedConfig` from inline TOML configs. Press `r` to rotate between predefined configuration sets.
+
---
## WebAssembly Example
diff --git a/examples/action.rs b/examples/action.rs
index 4be3481..1dbd152 100644
--- a/examples/action.rs
+++ b/examples/action.rs
@@ -3,32 +3,31 @@
#[derive(Debug, keymap::KeyMap, Hash, PartialEq, Eq, Clone)]
pub(crate) enum Action {
/// Jump over obstacles
- #[key("space", "@digit")]
+ #[key("space", "@digit", symbol = "␣", help = "jump")]
Jump,
/// Climb or move up
- #[key("up")]
+ #[key("up", symbol = "↑", help = "move up")]
Up,
/// Drop or crouch down
- #[key("down")]
+ #[key("down", symbol = "↓", help = "move down")]
Down,
/// Move leftward
- #[key("left")]
+ #[key("left", symbol = "←", help = "move left")]
Left,
/// Move rightward
- #[key("right")]
+ #[key("right", symbol = "→", help = "move right")]
Right,
/// Exit or pause game
- #[key("q", "esc")]
+ #[key("q", "esc", symbol = "esc", help = "quit")]
Quit,
/// Key Group Capturing action (e.g. tracking which character was pressed).
- /// `char` will be captured from any matched key group macro (like `@any` or `@digit`) at runtime.
- #[key("@any")]
+ #[key("@any", help = "shoot")]
Shoot(char),
}
diff --git a/examples/backend/crossterm.rs b/examples/backend/crossterm.rs
index 5d196f7..b386f6d 100644
--- a/examples/backend/crossterm.rs
+++ b/examples/backend/crossterm.rs
@@ -1,9 +1,12 @@
use std::io;
use crossterm::{
+ cursor,
event::{read, Event, KeyEvent},
- terminal::{disable_raw_mode, enable_raw_mode},
+ execute,
+ terminal::{disable_raw_mode, enable_raw_mode, Clear, ClearType},
};
+use std::io::{stdout, Write};
#[allow(dead_code)]
pub(crate) fn run(mut f: F) -> io::Result<()>
@@ -11,10 +14,21 @@ where
F: FnMut(KeyEvent) -> bool,
{
enable_raw_mode()?;
+ stdout().flush()?;
+
+ let (_, row) = cursor::position()?;
loop {
if let Event::Key(key) = read()? {
+ execute!(
+ stdout(),
+ cursor::MoveTo(0, row),
+ Clear(ClearType::FromCursorDown),
+ )?;
+
let quit = f(key);
+ stdout().flush()?;
+
if quit {
break;
}
diff --git a/examples/backend/mod.rs b/examples/backend/mod.rs
index 932f061..a69d350 100644
--- a/examples/backend/mod.rs
+++ b/examples/backend/mod.rs
@@ -1,3 +1,5 @@
+use std::io::Write;
+
use keymap::Item;
#[cfg(feature = "crossterm")]
@@ -32,28 +34,41 @@ pub(crate) use mock::{run, Key};
#[allow(dead_code)]
pub(crate) fn print(s: &str) -> bool {
- println!("{s}\r");
+ print!("\r{s}");
+ std::io::stdout().flush().ok();
false
}
#[allow(dead_code)]
pub(crate) fn quit(s: &str) -> bool {
println!("{s}\r");
+ std::io::stdout().flush().ok();
true
}
+// ANSI colors
+const RESET: &str = "\x1b[0m";
+const COLOR_DIM: &str = "\x1b[38;2;68;72;85m";
+const COLOR_KEY: &str = "\x1b[38;2;148;226;213m";
+const COLOR_TEXT: &str = "\x1b[38;2;166;173;200m";
+
#[allow(dead_code)]
pub(crate) fn print_config(items: &[(T, Item)]) {
- println!("--- keymap ---");
+ let keys = items
+ .iter()
+ .map(|(_, v)| {
+ format!(
+ "{COLOR_KEY}{}{RESET} {COLOR_TEXT}{}{RESET}",
+ v.symbol.clone().unwrap_or_default(),
+ v.help.clone().unwrap_or(v.description.clone())
+ )
+ })
+ .collect::>()
+ .join(&format!(" {COLOR_DIM}|{RESET} "));
- items.iter().for_each(|(action, v)| {
- println!(
- "{action:?} = keys: {:?}, description: {}",
- v.keys, v.description
- )
- });
-
- println!("--------------");
+ println!("\r{keys}");
+ std::io::stdout().flush().ok();
}
+
#[allow(unused)]
fn main() {}
diff --git a/examples/backend/termion.rs b/examples/backend/termion.rs
index b041e87..ccc5337 100644
--- a/examples/backend/termion.rs
+++ b/examples/backend/termion.rs
@@ -12,13 +12,23 @@ where
let stdin = stdin();
let mut stdout = stdout().into_raw_mode()?;
+ write!(stdout, "{}", termion::cursor::Save)?;
+ stdout.flush()?;
+
for key in stdin.keys() {
+ write!(
+ stdout,
+ "{}{}",
+ termion::cursor::Restore,
+ termion::clear::AfterCursor,
+ )?;
+
let quit = f(key.unwrap());
+ stdout.flush()?;
+
if quit {
break;
}
-
- stdout.flush().unwrap();
}
write!(stdout, "{}", termion::cursor::Show)
diff --git a/examples/capturing.rs b/examples/capturing.rs
index a82dc09..db9e437 100644
--- a/examples/capturing.rs
+++ b/examples/capturing.rs
@@ -4,7 +4,7 @@ mod backend;
#[path = "./action.rs"]
mod action;
-use crate::backend::{print, quit, run};
+use crate::backend::{print, print_config, quit, run};
use action::Action;
use keymap::{DerivedConfig, KeyMapConfig};
@@ -16,11 +16,9 @@ Jump = { keys = ["j"], description = "Jump!" }
fn main() -> std::io::Result<()> {
println!("# Example: Key Group Capturing using .get_bound()");
- println!("- Press any key to see it captured by Action::Shoot(char)");
- println!("- Press 'j' to see Action::Jump (unit variant)");
- println!("- Press 'q' or 'esc' to quit");
let config: DerivedConfig = toml::from_str(CONFIG).unwrap();
+ print_config(&config.items);
run(|key| match config.get_bound(&key) {
Some(action) => match action {
diff --git a/examples/config.rs b/examples/config.rs
index c9014b1..066f2d6 100644
--- a/examples/config.rs
+++ b/examples/config.rs
@@ -4,7 +4,7 @@ mod backend;
#[path = "./action.rs"]
mod action;
-use crate::backend::{print, quit, run};
+use crate::backend::{print, print_config, quit, run};
use action::Action;
use keymap::{Config, KeyMapConfig};
@@ -18,6 +18,7 @@ fn main() -> std::io::Result<()> {
println!("# Example: External configuration with Config");
let config: Config = toml::from_str(CONFIG).unwrap();
+ print_config(&config.items);
// Use .get() for high-performance reference lookup of the "default" variant.
// To capture the actual key pressed (e.g. the 'a' in @any), use .get_bound()
diff --git a/examples/derive.rs b/examples/derive.rs
index 1ee26f2..1dd0aad 100644
--- a/examples/derive.rs
+++ b/examples/derive.rs
@@ -4,13 +4,14 @@ mod backend;
#[path = "./action.rs"]
mod action;
-use crate::backend::{print, quit, run};
+use crate::backend::{print, print_config, quit, run};
use action::Action;
use keymap::KeyMapConfig;
fn main() -> std::io::Result<()> {
println!("# Example: Using the KeyMap derive macro");
let config = Action::keymap_config();
+ print_config(&config.items);
// Use .get() for high-performance reference lookup of the "default" variant.
// To capture the actual key pressed (e.g. the 'a' in @any), use .get_bound()
diff --git a/examples/derived_config.rs b/examples/derived_config.rs
index 38e9f3b..77e87d4 100644
--- a/examples/derived_config.rs
+++ b/examples/derived_config.rs
@@ -4,7 +4,7 @@ mod backend;
#[path = "./action.rs"]
mod action;
-use crate::backend::{print, quit, run};
+use crate::backend::{print, print_config, quit, run};
use action::Action;
use keymap::{DerivedConfig, KeyMapConfig};
@@ -19,6 +19,7 @@ fn main() -> std::io::Result<()> {
println!("# Example: Merging derive macros with external config using DerivedConfig");
let config: DerivedConfig = toml::from_str(CONFIG).unwrap();
+ print_config(&config.items);
// Use .get() for high-performance reference lookup of the "default" variant.
// To capture the actual key pressed (e.g. the 'a' in @any), use .get_bound()
diff --git a/examples/modes.rs b/examples/modes.rs
index 8aa5c0d..9005c95 100644
--- a/examples/modes.rs
+++ b/examples/modes.rs
@@ -3,7 +3,7 @@ use std::collections::HashMap;
#[path = "./backend/mod.rs"]
mod backend;
-use crate::backend::{print, quit, run};
+use crate::backend::{print, print_config, quit, run};
use keymap::DerivedConfig;
use serde::Deserialize;
@@ -45,7 +45,11 @@ fn main() -> std::io::Result<()> {
let mut mode = "home";
println!("# Example: Multi-mode application with different key mappings");
- println!("mode: {mode}\r");
+
+ if let Some(Actions::Home(config)) = modes.get("home") {
+ print_config(&config.items);
+ }
+ println!("\rmode: {mode}");
run(move |key| match modes.get(mode).unwrap() {
Actions::Home(config) => match config.get(&key) {
diff --git a/examples/reload.gif b/examples/reload.gif
new file mode 100644
index 0000000000000000000000000000000000000000..4b0afc927cb917bc8e3ba0287a1b746debe22a8d
GIT binary patch
literal 96716
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