Skip to main content

yazi_widgets/input/actor/
replace.rs

1use anyhow::Result;
2use yazi_macro::{render, succ};
3use yazi_shared::{data::Data, replace_cow};
4
5use crate::input::{Input, InputMode, op::InputOp};
6
7impl Input {
8	pub fn replace(&mut self, _: ()) -> Result<Data> {
9		let snap = self.snap_mut();
10		if snap.mode == InputMode::Normal {
11			snap.op = InputOp::None;
12			snap.mode = InputMode::Replace;
13			render!();
14		}
15		succ!();
16	}
17
18	pub fn replace_str(&mut self, s: &str) -> Result<Data> {
19		let s = replace_cow(replace_cow(s, "\r", " "), "\n", " ");
20
21		let snap = self.snap_mut();
22		snap.mode = InputMode::Normal;
23
24		let start = snap.idx(snap.cursor).unwrap();
25		let mut it = snap.value[start..].char_indices();
26		match (it.next(), it.next()) {
27			(None, _) => {}
28			(Some(_), None) => snap.value.replace_range(start..snap.len(), &s),
29			(Some(_), Some((len, _))) => snap.value.replace_range(start..start + len, &s),
30		}
31
32		self.snaps.tag(self.limit).then(|| self.flush_type());
33		succ!(render!());
34	}
35}