pub mod cmd;
pub mod count;
pub mod insert;
pub mod motion;
pub mod normal;
pub mod operator;
pub mod pending;
pub mod search_prompt;
pub use cmd::EngineCmd;
pub use count::CountAccumulator;
pub use hjkl_engine::MotionKind;
pub use operator::OperatorKind;
pub use pending::{Key, Outcome, PendingState, step};
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
pub enum Mode {
Normal,
Insert,
Visual,
VisualLine,
VisualBlock,
OpPending,
CommandLine,
}
#[cfg(feature = "crossterm")]
pub fn handle_key<H: hjkl_engine::Host>(
editor: &mut hjkl_engine::Editor<hjkl_buffer::Buffer, H>,
key: hjkl_engine::KeyEvent,
) -> bool {
let input = hjkl_engine::crossterm_to_input(key);
if input.key == hjkl_engine::Key::Null {
return false;
}
let consumed = dispatch_input(editor, input);
editor.emit_cursor_shape_if_changed();
consumed
}
pub fn feed_input<H: hjkl_engine::Host>(
editor: &mut hjkl_engine::Editor<hjkl_buffer::Buffer, H>,
input: hjkl_engine::PlannedInput,
) -> bool {
let Some(event) = hjkl_engine::decode_planned_input(input) else {
return false;
};
let consumed = dispatch_input(editor, event);
editor.emit_cursor_shape_if_changed();
consumed
}
pub fn dispatch_input<H: hjkl_engine::Host>(
editor: &mut hjkl_engine::Editor<hjkl_buffer::Buffer, H>,
input: hjkl_engine::Input,
) -> bool {
if editor.search_prompt_state().is_some() {
return search_prompt::step_search_prompt(editor, input);
}
let bk = match editor.begin_step(input) {
Ok(bk) => bk,
Err(consumed) => return consumed,
};
let consumed = match editor.vim_mode() {
hjkl_engine::VimMode::Insert => insert::step_insert(editor, input),
_ => normal::step_normal(editor, input),
};
editor.end_step(input, bk, consumed)
}