yazi_core/input/commands/
forward.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use yazi_shared::{CharKind, event::CmdCow};

use crate::input::{Input, op::InputOp};

struct Opt {
	far:         bool,
	end_of_word: bool,
}

impl From<CmdCow> for Opt {
	fn from(c: CmdCow) -> Self { Self { far: c.bool("far"), end_of_word: c.bool("end-of-word") } }
}

impl Input {
	#[yazi_codegen::command]
	pub fn forward(&mut self, opt: Opt) {
		let snap = self.snap();

		let mut it = snap.value.chars().skip(snap.cursor).enumerate();
		let Some(mut prev) = it.next().map(|(_, c)| CharKind::new(c)) else {
			return self.move_(0);
		};

		for (i, c) in it {
			let k = CharKind::new(c);
			let b = if opt.end_of_word {
				prev != CharKind::Space && prev.vary(k, opt.far) && i != 1
			} else {
				k != CharKind::Space && k.vary(prev, opt.far)
			};
			if b && !matches!(snap.op, InputOp::None | InputOp::Select(_)) {
				return self.move_(i as isize);
			} else if b {
				return self.move_(if opt.end_of_word { i - 1 } else { i } as isize);
			}
			prev = k;
		}

		self.move_(snap.len() as isize)
	}
}