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