yazi_widgets/input/commands/
type.rs

1use anyhow::Result;
2use yazi_config::keymap::Key;
3use yazi_macro::{act, render, succ};
4use yazi_shared::{data::Data, replace_cow};
5
6use crate::input::{Input, InputMode};
7
8impl Input {
9	pub fn r#type(&mut self, key: &Key) -> Result<bool> {
10		let Some(c) = key.plain() else { return Ok(false) };
11
12		if self.mode() == InputMode::Insert {
13			self.type_str(c.encode_utf8(&mut [0; 4]))?;
14			return Ok(true);
15		} else if self.mode() == InputMode::Replace {
16			self.replace_str(c.encode_utf8(&mut [0; 4]))?;
17			return Ok(true);
18		}
19
20		Ok(false)
21	}
22
23	pub fn type_str(&mut self, s: &str) -> Result<Data> {
24		let s = replace_cow(replace_cow(s, "\r", " "), "\n", " ");
25
26		let snap = self.snap_mut();
27		if snap.cursor < 1 {
28			snap.value.insert_str(0, &s);
29		} else {
30			snap.value.insert_str(snap.idx(snap.cursor).unwrap(), &s);
31		}
32
33		act!(r#move, self, s.chars().count() as isize)?;
34		self.flush_value();
35		succ!(render!());
36	}
37}