fix(input): refix ctrl-j

This commit is contained in:
Aram Drevekenin 2024-11-08 11:26:09 +01:00
parent 80fcd0fb75
commit 8bd555c310

View File

@ -1,7 +1,7 @@
use std::collections::{BTreeMap, HashMap};
use super::actions::Action;
use crate::data::{InputMode, KeyWithModifier, KeybindsVec};
use crate::data::{BareKey, InputMode, KeyWithModifier, KeybindsVec};
use serde::{Deserialize, Serialize};
use std::fmt;
@ -44,8 +44,13 @@ impl Keybinds {
) -> Vec<Action> {
self.0
.get(mode)
.and_then(|normal_mode_keybindings| normal_mode_keybindings.get(key_with_modifier))
.cloned()
.and_then(|mode_keybindings| {
if raw_bytes == &[10] {
handle_ctrl_j(&mode_keybindings, &raw_bytes, key_is_kitty_protocol)
} else {
mode_keybindings.get(key_with_modifier).cloned()
}
})
.unwrap_or_else(|| {
vec![self.default_action_for_mode(
mode,
@ -107,6 +112,26 @@ impl Keybinds {
}
}
// we need to do this because [10] in standard STDIN, [10] is both Enter (without a carriage
// return) and ctrl-j - so here, if ctrl-j is bound we return its bound action, and otherwise we
// just write the raw bytes to the terminal and let whichever program is there decide what they are
fn handle_ctrl_j(
mode_keybindings: &HashMap<KeyWithModifier, Vec<Action>>,
raw_bytes: &[u8],
key_is_kitty_protocol: bool,
) -> Option<Vec<Action>> {
let ctrl_j = KeyWithModifier::new(BareKey::Char('j')).with_ctrl_modifier();
if mode_keybindings.get(&ctrl_j).is_some() {
mode_keybindings.get(&ctrl_j).cloned()
} else {
Some(vec![Action::Write(
Some(ctrl_j),
raw_bytes.to_vec().clone(),
key_is_kitty_protocol,
)])
}
}
// The unit test location.
#[cfg(test)]
#[path = "./unit/keybinds_test.rs"]