From b708f85e7d17d8109bef70ea3f595cea0ae40c46 Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Wed, 8 Jul 2026 22:31:09 +0300 Subject: fix: match shifted indexed number keybinds refs #1184 --- src/config/keybinds.rs | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) (limited to 'src/config') diff --git a/src/config/keybinds.rs b/src/config/keybinds.rs index 2a1cfc49..838481ed 100644 --- a/src/config/keybinds.rs +++ b/src/config/keybinds.rs @@ -255,11 +255,21 @@ pub struct IndexedKeybind { impl IndexedKeybind { pub fn matched_index(&self, key: TerminalKey) -> Option { - let KeyCode::Char(c @ '1'..='9') = key.code else { - return None; + let key_number = match key.code { + KeyCode::Char(c @ '1'..='9') => c, + KeyCode::Char(c) => { + let number = shifted_number_symbol(c)?; + if !indexed_shifted_number_matches(key, self.trigger.combo(), number) { + return None; + } + number + } + _ => return None, }; - if terminal_key_matches_combo(key, self.trigger.combo()) { - Some((c as usize) - ('1' as usize)) + let legacy_shifted_number = + matches!(key.code, KeyCode::Char(c) if shifted_number_symbol(c) == Some(key_number)); + if terminal_key_matches_combo(key, self.trigger.combo()) || legacy_shifted_number { + Some((key_number as usize) - ('1' as usize)) } else { None } @@ -1355,6 +1365,31 @@ fn legacy_shifted_ascii_letter_matches( && actual_modifiers | KeyModifiers::SHIFT == expected_modifiers } +const SHIFTED_NUMBER_SYMBOLS: [(char, char); 9] = [ + ('1', '!'), + ('2', '@'), + ('3', '#'), + ('4', '$'), + ('5', '%'), + ('6', '^'), + ('7', '&'), + ('8', '*'), + ('9', '('), +]; + +fn shifted_number_symbol(ch: char) -> Option { + SHIFTED_NUMBER_SYMBOLS + .iter() + .find_map(|(number, symbol)| (*symbol == ch).then_some(*number)) +} + +fn indexed_shifted_number_matches(key: TerminalKey, combo: KeyCombo, number: char) -> bool { + let (expected_code, expected_modifiers) = normalize_key_combo(combo); + matches!(expected_code, KeyCode::Char(expected) if expected == number) + && expected_modifiers.contains(KeyModifiers::SHIFT) + && key.modifiers == expected_modifiers.difference(KeyModifiers::SHIFT) +} + fn shifted_char_matches_expected( actual_code: KeyCode, shifted_codepoint: Option, -- cgit v1.2.3