aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--helix-view/src/input.rs27
1 files changed, 26 insertions, 1 deletions
diff --git a/helix-view/src/input.rs b/helix-view/src/input.rs
index 0f4ffaac..5f5067ea 100644
--- a/helix-view/src/input.rs
+++ b/helix-view/src/input.rs
@@ -325,7 +325,7 @@ impl std::str::FromStr for KeyEvent {
fn from_str(s: &str) -> Result<Self, Self::Err> {
let mut tokens: Vec<_> = s.split('-').collect();
- let code = match tokens.pop().ok_or_else(|| anyhow!("Missing key code"))? {
+ let mut code = match tokens.pop().ok_or_else(|| anyhow!("Missing key code"))? {
keys::BACKSPACE => KeyCode::Backspace,
keys::ENTER => KeyCode::Enter,
keys::LEFT => KeyCode::Left,
@@ -405,6 +405,18 @@ impl std::str::FromStr for KeyEvent {
modifiers.insert(flag);
}
+ // Normalize character keys so that characters like C-S-r and C-R
+ // are represented by equal KeyEvents.
+ match code {
+ KeyCode::Char(ch)
+ if ch.is_ascii_lowercase() && modifiers.contains(KeyModifiers::SHIFT) =>
+ {
+ code = KeyCode::Char(ch.to_ascii_uppercase());
+ modifiers.remove(KeyModifiers::SHIFT);
+ }
+ _ => (),
+ }
+
Ok(KeyEvent { code, modifiers })
}
}
@@ -684,6 +696,19 @@ mod test {
modifiers: KeyModifiers::ALT | KeyModifiers::CONTROL
}
);
+
+ assert_eq!(
+ str::parse::<KeyEvent>("C-S-r").unwrap(),
+ str::parse::<KeyEvent>("C-R").unwrap(),
+ );
+
+ assert_eq!(
+ str::parse::<KeyEvent>("S-w").unwrap(),
+ KeyEvent {
+ code: KeyCode::Char('W'),
+ modifiers: KeyModifiers::NONE
+ }
+ );
}
#[test]