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