mirror of
https://github.com/nushell/nushell
synced 2025-01-14 14:14:13 +00:00
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:
parent
a948ec6c2c
commit
151767a5e3
1 changed files with 21 additions and 20 deletions
|
@ -761,29 +761,30 @@ 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 or NONE".to_string(),
|
expected: "CONTROL, SHIFT, ALT, SUPER, HYPER, META 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(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let keycode = match keybinding
|
let keycode = match keybinding
|
||||||
|
|
Loading…
Reference in a new issue