yazi_core/input/commands/
backward.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
use yazi_shared::{CharKind, event::CmdCow};

use crate::input::Input;

struct Opt {
	far: bool,
}

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

impl Input {
	#[yazi_codegen::command]
	pub fn backward(&mut self, opt: Opt) {
		let snap = self.snap();
		if snap.cursor == 0 {
			return self.move_(0);
		}

		let idx = snap.idx(snap.cursor).unwrap_or(snap.len());
		let mut it = snap.value[..idx].chars().rev().enumerate();
		let mut prev = CharKind::new(it.next().unwrap().1);
		for (i, c) in it {
			let k = CharKind::new(c);
			if prev != CharKind::Space && prev.vary(k, opt.far) {
				return self.move_(-(i as isize));
			}
			prev = k;
		}

		if prev != CharKind::Space {
			self.move_(-(snap.len() as isize));
		}
	}
}