Support kitty key modifiers in keybindings (#13906)

# Description
hi hi, this makes the parsing of modifier key combos in config more
general, and adds support for additional kitty keyboard protocol
modifiers. It seems that support for [kitty
keys](https://sw.kovidgoyal.net/kitty/keyboard-protocol) had already
been added to nushell in https://github.com/nushell/nushell/pull/10540,
and this was the only missing piece to making them available in
keybindings.

# User-Facing Changes
- keybindings in config can include the super, hyper and meta modifiers
(e.g. `modifier: super`, `modifier: shift_super`, etc.), and these
modifiers will work in supporting terminals (kitty, foot, wezterm,
alacritty...)
- all permutations of snake_cased modifier combinations now behave
equivalently for the purpose of describing keybindings in config (e.g.
`control_alt_shift` was previously supported where `shift_control_alt`
was a config error — now they're the same)

# Tests
None of this looks to be tested at the moment. I only found a smoke test
under the nu-cli crate, and I couldn't break tests elsewhere by stuffing
around with modifier handling. Works on my machine, though! 🌈
This commit is contained in:
replcat 2024-09-24 23:37:04 +10:00 committed by GitHub
parent a948ec6c2c
commit 151767a5e3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -761,28 +761,29 @@ fn add_parsed_keybinding(
keybinding: &ParsedKeybinding, keybinding: &ParsedKeybinding,
config: &Config, config: &Config,
) -> Result<(), ShellError> { ) -> Result<(), ShellError> {
let modifier = match keybinding let modifier_string = keybinding
.modifier .modifier
.to_expanded_string("", config) .to_expanded_string("", config)
.to_ascii_lowercase() .to_ascii_lowercase();
.as_str()
{ let mut modifier = KeyModifiers::NONE;
"control" => KeyModifiers::CONTROL, if modifier_string != "none" {
"shift" => KeyModifiers::SHIFT, for part in modifier_string.split('_') {
"alt" => KeyModifiers::ALT, match part {
"none" => KeyModifiers::NONE, "control" => modifier |= KeyModifiers::CONTROL,
"shift_alt" | "alt_shift" => KeyModifiers::SHIFT | KeyModifiers::ALT, "shift" => modifier |= KeyModifiers::SHIFT,
"control_shift" | "shift_control" => KeyModifiers::CONTROL | KeyModifiers::SHIFT, "alt" => modifier |= KeyModifiers::ALT,
"control_alt" | "alt_control" => KeyModifiers::CONTROL | KeyModifiers::ALT, "super" => modifier |= KeyModifiers::SUPER,
"control_alt_shift" | "control_shift_alt" => { "hyper" => modifier |= KeyModifiers::HYPER,
KeyModifiers::CONTROL | KeyModifiers::ALT | KeyModifiers::SHIFT "meta" => modifier |= KeyModifiers::META,
} _ => {
_ => { return Err(ShellError::UnsupportedConfigValue {
return Err(ShellError::UnsupportedConfigValue { expected: "CONTROL, SHIFT, ALT, SUPER, HYPER, META or NONE".to_string(),
expected: "CONTROL, SHIFT, ALT or NONE".to_string(), value: keybinding.modifier.to_abbreviated_string(config),
value: keybinding.modifier.to_abbreviated_string(config), span: keybinding.modifier.span(),
span: keybinding.modifier.span(), })
}) }
}
} }
}; };