diff --git a/config/src/keymap/key.rs b/config/src/keymap/key.rs index aabbf4857..aab73b26b 100644 --- a/config/src/keymap/key.rs +++ b/config/src/keymap/key.rs @@ -32,13 +32,27 @@ impl Default for Key { impl From for Key { fn from(value: KeyEvent) -> Self { - let shift = matches!(value.code, KeyCode::Char(c) if c.is_ascii_uppercase()); + // For alphabet: + // Unix : => Char("A") + SHIFT + // Windows : => Char("A") + SHIFT + // + // For non-alphabet: + // Unix : => Char("~") + NULL + // Windows : => Char("~") + SHIFT + // + // So we detect `Char("~") + SHIFT`, and change it to `Char("~") + NULL` + // for consistent behavior between OSs. + + let shift = match (value.code, value.modifiers) { + (KeyCode::Char(c), _) => c.is_ascii_uppercase(), + (_, m) => m.contains(KeyModifiers::SHIFT), + }; Self { - code: value.code, - shift: shift || value.modifiers.contains(KeyModifiers::SHIFT), - ctrl: value.modifiers.contains(KeyModifiers::CONTROL), - alt: value.modifiers.contains(KeyModifiers::ALT), + code: value.code, + shift, + ctrl: value.modifiers.contains(KeyModifiers::CONTROL), + alt: value.modifiers.contains(KeyModifiers::ALT), } } }