duat_utils/modes/
regular.rs

1use duat_core::{
2    data::Pass,
3    file::File,
4    mode::{self, KeyCode, KeyEvent, KeyMod, key},
5    prelude::Handle,
6    ui::Ui,
7};
8
9use super::{IncSearch, RunCommands, SearchFwd, SearchRev};
10
11/// The regular, bogstandard mode, a.k.a., supposed to be like VSCode
12#[derive(Clone)]
13pub struct Regular;
14
15impl<U: Ui> mode::Mode<U> for Regular {
16    type Widget = File<U>;
17
18    fn send_key(&mut self, pa: &mut Pass, key: KeyEvent, handle: Handle<Self::Widget, U>) {
19        match key {
20            // Characters
21            key!(KeyCode::Char(char)) => handle.edit_all(pa, |mut e| {
22                e.insert(char);
23                e.move_hor(1);
24            }),
25            key!(KeyCode::Enter) => handle.edit_all(pa, |mut e| {
26                e.insert('\n');
27                e.move_hor(1);
28            }),
29
30            // Text Removal
31            key!(KeyCode::Backspace) => handle.edit_all(pa, |mut e| {
32                if e.anchor().is_some() {
33                    e.replace("");
34                    e.unset_anchor();
35                } else {
36                    e.move_hor(-1);
37                    e.replace("");
38                }
39            }),
40            key!(KeyCode::Delete) => handle.edit_all(pa, |mut e| {
41                e.replace("");
42                e.unset_anchor();
43            }),
44
45            // Movement
46            key!(KeyCode::Left, KeyMod::SHIFT) => handle.edit_all(pa, |mut e| {
47                e.set_anchor_if_needed();
48                e.move_hor(-1);
49            }),
50            key!(KeyCode::Right, KeyMod::SHIFT) => handle.edit_all(pa, |mut e| {
51                e.set_anchor_if_needed();
52                e.move_hor(1);
53            }),
54            key!(KeyCode::Up, KeyMod::SHIFT) => handle.edit_all(pa, |mut e| {
55                e.set_anchor_if_needed();
56                e.move_ver(-1);
57            }),
58            key!(KeyCode::Down, KeyMod::SHIFT) => handle.edit_all(pa, |mut e| {
59                e.set_anchor_if_needed();
60                e.move_ver(1);
61            }),
62            key!(KeyCode::Left, KeyMod::NONE) => handle.edit_all(pa, |mut e| {
63                e.unset_anchor();
64                e.move_hor(-1);
65            }),
66            key!(KeyCode::Right, KeyMod::NONE) => handle.edit_all(pa, |mut e| {
67                e.unset_anchor();
68                e.move_hor(1);
69            }),
70            key!(KeyCode::Up, KeyMod::NONE) => handle.edit_all(pa, |mut e| {
71                e.unset_anchor();
72                e.move_ver(-1);
73            }),
74            key!(KeyCode::Down, KeyMod::NONE) => handle.edit_all(pa, |mut e| {
75                e.unset_anchor();
76                e.move_ver(1);
77            }),
78
79            // Control
80            key!(KeyCode::Char('p'), KeyMod::CONTROL) => mode::set::<U>(RunCommands::new()),
81            key!(KeyCode::Char('f'), KeyMod::CONTROL) => mode::set::<U>(IncSearch::new(SearchFwd)),
82            key!(KeyCode::Char('F'), KeyMod::CONTROL) => mode::set::<U>(IncSearch::new(SearchRev)),
83
84            _ => {}
85        }
86    }
87}