yazi_widgets/input/commands/
forward.rs

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