diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-08-03 00:08:47 +0200 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-08-03 00:08:47 +0200 |
| commit | eafde55afcdf9dc4c17c6c97c1db472fc9ff9957 (patch) | |
| tree | 838cab985495ead6dc005bd934f9e87c896e4ddd /src/config/keymap/event_from_string.rs | |
| parent | bb9944d086332ed0b8d6064316225e901c456bd7 (diff) | |
add keymap for view and global
Diffstat (limited to 'src/config/keymap/event_from_string.rs')
| -rw-r--r-- | src/config/keymap/event_from_string.rs | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/config/keymap/event_from_string.rs b/src/config/keymap/event_from_string.rs new file mode 100644 index 0000000..00179c5 --- /dev/null +++ b/src/config/keymap/event_from_string.rs @@ -0,0 +1,78 @@ +use ratatui::crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; + +fn parse_key_names(s: &str) -> Option<KeyCode> { + if s.chars().count() == 1 { + return Some(KeyCode::Char(s.chars().next().unwrap())); + } + + match s { + "esc" => Some(KeyCode::Esc), + "up" => Some(KeyCode::Up), + "down" => Some(KeyCode::Down), + "left" => Some(KeyCode::Left), + "right" => Some(KeyCode::Right), + "backspace" => Some(KeyCode::Backspace), + "enter" => Some(KeyCode::Enter), + "home" => Some(KeyCode::Home), + "end" => Some(KeyCode::End), + "pageup" => Some(KeyCode::PageUp), + "pagedown" => Some(KeyCode::PageDown), + "tab" => Some(KeyCode::Tab), + "delete" => Some(KeyCode::Delete), + "insert" => Some(KeyCode::Insert), + "f1" => Some(KeyCode::F(1)), + "f2" => Some(KeyCode::F(2)), + "f3" => Some(KeyCode::F(3)), + "f4" => Some(KeyCode::F(4)), + "f5" => Some(KeyCode::F(5)), + "f6" => Some(KeyCode::F(6)), + "f7" => Some(KeyCode::F(7)), + "f8" => Some(KeyCode::F(8)), + "f9" => Some(KeyCode::F(9)), + "f10" => Some(KeyCode::F(10)), + "f11" => Some(KeyCode::F(11)), + "f12" => Some(KeyCode::F(12)), + "capslock" => Some(KeyCode::CapsLock), + "scrolllock" => Some(KeyCode::ScrollLock), + "numlock" => Some(KeyCode::NumLock), + "printscreen" => Some(KeyCode::PrintScreen), + "pause" => Some(KeyCode::Pause), + "menu" => Some(KeyCode::Menu), + "keypadbegin" => Some(KeyCode::KeypadBegin), + _ => None + } +} + +pub fn event_from_string(s: String) -> Result<KeyEvent, String> { + let mut modifiers = KeyModifiers::NONE; + let s = s.to_lowercase(); + + let code = if s.chars().count() == 1 { + KeyCode::Char(s.chars().next().unwrap()) + } else if s.starts_with('<') && s.ends_with('>') { + let mut inner = &s[1..s.len() - 1]; + + loop { + if inner.starts_with("c-") { + inner = &inner[2..]; + modifiers |= KeyModifiers::CONTROL; + } else if inner.starts_with("a-") { + inner = &inner[2..]; + modifiers |= KeyModifiers::ALT; + } else { + break; + } + } + + match parse_key_names(inner) { + Some(keycode) => keycode, + None => return Err(format!("{:?} is not a valid keyname", inner)) + } + } else { + return Err(format!("{:?} is not a valid keyname", s)); + }; + + println!("{:?}", KeyEvent::new(code, modifiers)); + + Ok(KeyEvent::new(code, modifiers)) +} |