use crossterm::event::{KeyCode, KeyModifiers};
use crate::{
edit_mode::keybindings::{
add_common_control_bindings, add_common_edit_bindings, add_common_navigation_bindings,
add_common_selection_bindings, edit_bind, Keybindings,
},
Direction, EditCommand, MotionTarget, WordEdge, WordKind,
};
pub fn default_helix_normal_keybindings() -> Keybindings {
let mut kb = Keybindings::new();
add_common_control_bindings(&mut kb);
add_common_navigation_bindings(&mut kb);
add_common_selection_bindings(&mut kb);
kb.add_binding(
KeyModifiers::NONE,
KeyCode::Backspace,
edit_bind(EditCommand::MoveLeft { select: false }),
);
kb.add_binding(
KeyModifiers::NONE,
KeyCode::Delete,
edit_bind(EditCommand::Delete),
);
kb.add_binding(
KeyModifiers::ALT,
KeyCode::Char('d'),
edit_bind(EditCommand::EraseSelection),
);
kb.add_binding(
KeyModifiers::ALT,
KeyCode::Char('`'),
edit_bind(EditCommand::UppercaseSelection),
);
kb
}
pub fn default_helix_select_keybindings() -> Keybindings {
use Direction as D;
use KeyCode as KC;
use KeyModifiers as KM;
use MotionTarget as MT;
let mut kb = default_helix_normal_keybindings();
let extend = |target: MT| edit_bind(EditCommand::Extend(target));
let word = |direction: D| MT::Word {
kind: WordKind::Word,
edge: WordEdge::Start,
direction,
};
kb.add_binding(KM::NONE, KC::Left, extend(MT::Grapheme(D::Backward)));
kb.add_binding(KM::NONE, KC::Right, extend(MT::Grapheme(D::Forward)));
kb.add_binding(
KM::NONE,
KC::Up,
edit_bind(EditCommand::MoveLineUp { select: true }),
);
kb.add_binding(
KM::NONE,
KC::Down,
edit_bind(EditCommand::MoveLineDown { select: true }),
);
kb.add_binding(
KM::CONTROL,
KC::Char('p'),
edit_bind(EditCommand::MoveLineUp { select: true }),
);
kb.add_binding(
KM::CONTROL,
KC::Char('n'),
edit_bind(EditCommand::MoveLineDown { select: true }),
);
kb.add_binding(KM::CONTROL, KC::Left, extend(word(D::Backward)));
kb.add_binding(KM::CONTROL, KC::Right, extend(word(D::Forward)));
kb.add_binding(KM::NONE, KC::Home, extend(MT::LineEdge(D::Backward)));
kb.add_binding(KM::NONE, KC::End, extend(MT::LineEdge(D::Forward)));
kb.add_binding(
KM::CONTROL,
KC::Char('a'),
extend(MT::LineEdge(D::Backward)),
);
kb.add_binding(KM::CONTROL, KC::Char('e'), extend(MT::LineEdge(D::Forward)));
kb.add_binding(KM::CONTROL, KC::Home, extend(MT::BufferEdge(D::Backward)));
kb.add_binding(KM::CONTROL, KC::End, extend(MT::BufferEdge(D::Forward)));
kb.add_binding(KM::ALT, KC::Char('<'), extend(MT::BufferEdge(D::Backward)));
kb.add_binding(KM::ALT, KC::Char('>'), extend(MT::BufferEdge(D::Forward)));
kb.add_binding(
KM::SHIFT | KM::ALT,
KC::Char(','),
extend(MT::BufferEdge(D::Backward)),
);
kb.add_binding(
KM::SHIFT | KM::ALT,
KC::Char('.'),
extend(MT::BufferEdge(D::Forward)),
);
kb.add_binding(KM::NONE, KC::Backspace, extend(MT::Grapheme(D::Backward)));
kb
}
pub fn default_helix_insert_keybindings() -> Keybindings {
let mut kb = Keybindings::new();
add_common_control_bindings(&mut kb);
add_common_navigation_bindings(&mut kb);
add_common_edit_bindings(&mut kb);
add_common_selection_bindings(&mut kb);
kb
}