Skip to main content

yazi_widgets/input/actor/
forward.rs

1use anyhow::Result;
2use yazi_macro::act;
3use yazi_shared::{CharKind, data::Data};
4
5use crate::input::{Input, op::InputOp, parser::ForwardOpt};
6
7impl Input {
8	pub fn forward(&mut self, opt: ForwardOpt) -> Result<Data> {
9		let snap = self.snap();
10
11		let mut it = snap.value.chars().skip(snap.cursor).enumerate();
12		let Some(mut prev) = it.next().map(|(_, c)| CharKind::new(c)) else {
13			return act!(r#move, self);
14		};
15
16		for (i, c) in it {
17			let k = CharKind::new(c);
18			let b = if opt.end_of_word {
19				prev != CharKind::Space && prev.vary(k, opt.far) && i != 1
20			} else {
21				k != CharKind::Space && k.vary(prev, opt.far)
22			};
23			if b && !matches!(snap.op, InputOp::None | InputOp::Select(_)) {
24				return act!(r#move, self, i as isize);
25			} else if b {
26				return act!(
27					r#move,
28					self,
29					if opt.end_of_word { i - snap.mode.delta() } else { i } as isize
30				);
31			}
32			prev = k;
33		}
34
35		act!(r#move, self, snap.len() as isize)
36	}
37}