use super::*;
pub fn scroll(
state: &mut Ed<'_>,
pflags: &mut PrintingFlags,
selection: Option<Sel<'_>>,
command: char,
tail: &str,
default_scroll_length: usize,
) -> Result<()> {
let sel = interpret_selection(&state, selection, state.selection)?;
let index = if command == 'z' {
sel.1
} else {
sel.0
};
let buffer = state.history.current(); buffer.verify_index(index)?;
let nr_end = tail.find( | c: char | !c.is_numeric() ).unwrap_or(tail.len());
let nr = if nr_end == 0 {
default_scroll_length
} else {
let nr = tail[.. nr_end].parse::<usize>()
.map_err(|_|EdError::ScrollNotInt(tail[..nr_end].to_owned()))
?;
if nr == 0 { return Err(EdError::NoOp); }
nr
};
let mut flags = parse_flags(&tail[nr_end ..], "pnl")?;
pflags.p = true; pflags.n = flags.remove(&'n').unwrap();
pflags.l = flags.remove(&'l').unwrap();
let new_sel = if command == 'z' {
let start = buffer.len().min(index + 1);
let end = buffer.len().min(index + nr);
(start, end)
} else {
let start = 1.max(index.saturating_sub(nr));
let end = 1.max(index.saturating_sub(1));
(start, end)
};
buffer.verify_selection(new_sel)?;
state.selection = new_sel;
Ok(())
}