yazi_widgets/input/actor/
forward.rs1use 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}