use hjkl_vim_types::{Mode, Operator, RangeKind};
use super::*;
use crate::vim_state::{vim, vim_mut};
use hjkl_engine::Editor;
use hjkl_engine::buf_helpers::{buf_line_chars, buf_set_cursor_rc};
pub fn delete_range_bridge<H: hjkl_engine::types::Host>(
ed: &mut Editor<hjkl_buffer::View, H>,
start: (usize, usize),
end: (usize, usize),
kind: RangeKind,
register: char,
) {
vim_mut(ed).pending_register = Some(register);
run_operator_over_range(ed, Operator::Delete, start, end, kind);
}
pub fn yank_range_bridge<H: hjkl_engine::types::Host>(
ed: &mut Editor<hjkl_buffer::View, H>,
start: (usize, usize),
end: (usize, usize),
kind: RangeKind,
register: char,
) {
vim_mut(ed).pending_register = Some(register);
run_operator_over_range(ed, Operator::Yank, start, end, kind);
}
pub fn change_range_bridge<H: hjkl_engine::types::Host>(
ed: &mut Editor<hjkl_buffer::View, H>,
start: (usize, usize),
end: (usize, usize),
kind: RangeKind,
register: char,
) {
vim_mut(ed).pending_register = Some(register);
run_operator_over_range(ed, Operator::Change, start, end, kind);
}
pub fn indent_range_bridge<H: hjkl_engine::types::Host>(
ed: &mut Editor<hjkl_buffer::View, H>,
start: (usize, usize),
end: (usize, usize),
count: i32,
shiftwidth: u32,
) {
if count == 0 {
return;
}
let (top_row, bot_row) = if start.0 <= end.0 {
(start.0, end.0)
} else {
(end.0, start.0)
};
let original_sw = ed.settings().shiftwidth;
if shiftwidth > 0 {
ed.settings_mut().shiftwidth = shiftwidth as usize;
}
ed.push_undo();
let abs_count = count.unsigned_abs() as usize;
if count > 0 {
indent_rows(ed, top_row, bot_row, abs_count);
} else {
outdent_rows(ed, top_row, bot_row, abs_count);
}
if shiftwidth > 0 {
ed.settings_mut().shiftwidth = original_sw;
}
vim_mut(ed).mode = Mode::Normal;
}
pub fn case_range_bridge<H: hjkl_engine::types::Host>(
ed: &mut Editor<hjkl_buffer::View, H>,
start: (usize, usize),
end: (usize, usize),
kind: RangeKind,
op: Operator,
) {
match op {
Operator::Uppercase | Operator::Lowercase | Operator::ToggleCase | Operator::Rot13 => {}
_ => return,
}
let (top, bot) = order(start, end);
apply_case_op_to_selection(ed, op, top, bot, kind);
}
pub fn delete_block_bridge<H: hjkl_engine::types::Host>(
ed: &mut Editor<hjkl_buffer::View, H>,
top_row: usize,
bot_row: usize,
left_col: usize,
right_col: usize,
register: char,
) {
vim_mut(ed).pending_register = Some(register);
let saved_anchor = vim(ed).block_anchor;
let saved_vcol = vim(ed).block_vcol;
vim_mut(ed).block_anchor = (top_row, left_col);
vim_mut(ed).block_vcol = right_col;
let clamped = right_col.min(buf_line_chars(ed.buffer(), bot_row).saturating_sub(1));
buf_set_cursor_rc(ed.buffer_mut(), bot_row, clamped);
apply_block_operator(ed, Operator::Delete, 1);
vim_mut(ed).block_anchor = saved_anchor;
vim_mut(ed).block_vcol = saved_vcol;
}
pub fn yank_block_bridge<H: hjkl_engine::types::Host>(
ed: &mut Editor<hjkl_buffer::View, H>,
top_row: usize,
bot_row: usize,
left_col: usize,
right_col: usize,
register: char,
) {
vim_mut(ed).pending_register = Some(register);
let saved_anchor = vim(ed).block_anchor;
let saved_vcol = vim(ed).block_vcol;
vim_mut(ed).block_anchor = (top_row, left_col);
vim_mut(ed).block_vcol = right_col;
let clamped = right_col.min(buf_line_chars(ed.buffer(), bot_row).saturating_sub(1));
buf_set_cursor_rc(ed.buffer_mut(), bot_row, clamped);
apply_block_operator(ed, Operator::Yank, 1);
vim_mut(ed).block_anchor = saved_anchor;
vim_mut(ed).block_vcol = saved_vcol;
}
pub fn change_block_bridge<H: hjkl_engine::types::Host>(
ed: &mut Editor<hjkl_buffer::View, H>,
top_row: usize,
bot_row: usize,
left_col: usize,
right_col: usize,
register: char,
) {
vim_mut(ed).pending_register = Some(register);
let saved_anchor = vim(ed).block_anchor;
let saved_vcol = vim(ed).block_vcol;
vim_mut(ed).block_anchor = (top_row, left_col);
vim_mut(ed).block_vcol = right_col;
let clamped = right_col.min(buf_line_chars(ed.buffer(), bot_row).saturating_sub(1));
buf_set_cursor_rc(ed.buffer_mut(), bot_row, clamped);
apply_block_operator(ed, Operator::Change, 1);
vim_mut(ed).block_anchor = saved_anchor;
vim_mut(ed).block_vcol = saved_vcol;
}
pub fn indent_block_bridge<H: hjkl_engine::types::Host>(
ed: &mut Editor<hjkl_buffer::View, H>,
top_row: usize,
bot_row: usize,
count: i32,
) {
if count == 0 {
return;
}
ed.push_undo();
let abs = count.unsigned_abs() as usize;
if count > 0 {
indent_rows(ed, top_row, bot_row, abs);
} else {
outdent_rows(ed, top_row, bot_row, abs);
}
vim_mut(ed).mode = Mode::Normal;
}
pub fn auto_indent_range_bridge<H: hjkl_engine::types::Host>(
ed: &mut Editor<hjkl_buffer::View, H>,
start: (usize, usize),
end: (usize, usize),
) {
let (top_row, bot_row) = if start.0 <= end.0 {
(start.0, end.0)
} else {
(end.0, start.0)
};
ed.push_undo();
auto_indent_rows(ed, top_row, bot_row);
vim_mut(ed).mode = Mode::Normal;
}
pub fn text_object_inner_word_bridge<H: hjkl_engine::types::Host>(
ed: &Editor<hjkl_buffer::View, H>,
) -> Option<((usize, usize), (usize, usize))> {
word_text_object(ed, true, false, 1)
}
pub fn text_object_around_word_bridge<H: hjkl_engine::types::Host>(
ed: &Editor<hjkl_buffer::View, H>,
) -> Option<((usize, usize), (usize, usize))> {
word_text_object(ed, false, false, 1)
}
pub fn text_object_inner_big_word_bridge<H: hjkl_engine::types::Host>(
ed: &Editor<hjkl_buffer::View, H>,
) -> Option<((usize, usize), (usize, usize))> {
word_text_object(ed, true, true, 1)
}
pub fn text_object_around_big_word_bridge<H: hjkl_engine::types::Host>(
ed: &Editor<hjkl_buffer::View, H>,
) -> Option<((usize, usize), (usize, usize))> {
word_text_object(ed, false, true, 1)
}