Skip to main content

yazi_widgets/input/actor/
backward.rs

1use anyhow::Result;
2use yazi_macro::{act, succ};
3use yazi_shared::{CharKind, data::Data};
4
5use crate::input::{Input, parser::BackwardOpt};
6
7impl Input {
8	pub fn backward(&mut self, opt: BackwardOpt) -> Result<Data> {
9		let snap = self.snap();
10		if snap.cursor == 0 {
11			return act!(r#move, self);
12		}
13
14		let idx = snap.idx(snap.cursor).unwrap_or(snap.len());
15		let mut it = snap.value[..idx].chars().rev().enumerate();
16		let mut prev = CharKind::new(it.next().unwrap().1);
17		for (i, c) in it {
18			let k = CharKind::new(c);
19			if prev != CharKind::Space && prev.vary(k, opt.far) {
20				return act!(r#move, self, -(i as isize));
21			}
22			prev = k;
23		}
24
25		if prev != CharKind::Space {
26			act!(r#move, self, -(snap.len() as isize))?;
27		}
28		succ!();
29	}
30}