diff options
| author | akbash <akbash@herdr.dev> | 2026-07-07 15:54:03 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-07 15:54:03 +0300 |
| commit | 39ba6b7a0242768b7d3684e8163d13a0609fcaa3 (patch) | |
| tree | d7fa5e94977850462d465d25a7bbabdd7b7d6d98 /src/input | |
| parent | b425260f9d86bb7e0bbea1d1e557ee75ba22443e (diff) | |
fix: preserve alt-shift letters (#1102)
refs #1088
Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Diffstat (limited to 'src/input')
| -rw-r--r-- | src/input/parse.rs | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/input/parse.rs b/src/input/parse.rs index bf377e88..77c630ba 100644 --- a/src/input/parse.rs +++ b/src/input/parse.rs @@ -73,7 +73,11 @@ fn parse_legacy_key_sequence(data: &str) -> Option<TerminalKey> { let rest = data.strip_prefix('\x1b')?; if rest.chars().count() == 1 { let ch = rest.chars().next()?; - Some(TerminalKey::new(KeyCode::Char(ch), KeyModifiers::ALT)) + let mut modifiers = KeyModifiers::ALT; + if ch.is_ascii_uppercase() { + modifiers |= KeyModifiers::SHIFT; + } + Some(TerminalKey::new(KeyCode::Char(ch), modifiers)) } else { None } @@ -518,6 +522,19 @@ mod tests { } #[test] + fn parse_legacy_alt_shift_letter_preserves_shift() { + let key = parse_terminal_key_sequence("\x1bA").expect("alt-shift letter should parse"); + assert_terminal_key_eq( + key, + KeyCode::Char('A'), + KeyModifiers::ALT | KeyModifiers::SHIFT, + crossterm::event::KeyEventKind::Press, + None, + ); + assert_eq!(encode_terminal_key(key, KeyboardProtocol::Legacy), b"\x1bA"); + } + + #[test] fn unknown_legacy_ss3_sequence_remains_unsupported() { assert!(parse_terminal_key_sequence("\x1bOz").is_none()); } |
