1pub mod editor;
2
3use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum Action {
7 InsertChar(char),
8 InsertNewline,
9 DeleteBack,
10 DeleteForward,
11 MoveCursorLeft,
12 MoveCursorRight,
13 MoveCursorHome,
14 MoveCursorEnd,
15 MoveCursorWordLeft,
16 MoveCursorWordRight,
17 ScrollUp,
18 ScrollDown,
19 SwitchPanel,
20 SwitchEngine,
21 ToggleCaseInsensitive,
22 ToggleMultiLine,
23 ToggleDotAll,
24 ToggleUnicode,
25 ToggleExtended,
26 ShowHelp,
27 Undo,
28 Redo,
29 HistoryPrev,
30 HistoryNext,
31 CopyMatch,
32 ToggleWhitespace,
33 OutputAndQuit,
34 SaveWorkspace,
35 Quit,
36 None,
37}
38
39pub fn key_to_action(key: KeyEvent) -> Action {
40 match key.code {
41 KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Quit,
42 KeyCode::Char('q') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Quit,
43 KeyCode::Esc => Action::Quit,
44 KeyCode::Tab => Action::SwitchPanel,
45 KeyCode::Char('e') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::SwitchEngine,
46 KeyCode::Char('z') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Undo,
47 KeyCode::Char('Z')
48 if key
49 .modifiers
50 .contains(KeyModifiers::CONTROL | KeyModifiers::SHIFT) =>
51 {
52 Action::Redo
53 }
54 KeyCode::Char('y') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::CopyMatch,
55 KeyCode::Char('w') if key.modifiers.contains(KeyModifiers::CONTROL) => {
56 Action::ToggleWhitespace
57 }
58 KeyCode::Char('o') if key.modifiers.contains(KeyModifiers::CONTROL) => {
59 Action::OutputAndQuit
60 }
61 KeyCode::Char('s') if key.modifiers.contains(KeyModifiers::CONTROL) => {
62 Action::SaveWorkspace
63 }
64 KeyCode::Char('i') if key.modifiers.contains(KeyModifiers::ALT) => {
65 Action::ToggleCaseInsensitive
66 }
67 KeyCode::Char('m') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleMultiLine,
68 KeyCode::Char('s') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleDotAll,
69 KeyCode::Char('u') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleUnicode,
70 KeyCode::Char('x') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleExtended,
71 KeyCode::Up if key.modifiers.contains(KeyModifiers::ALT) => Action::HistoryPrev,
72 KeyCode::Down if key.modifiers.contains(KeyModifiers::ALT) => Action::HistoryNext,
73 KeyCode::F(1) => Action::ShowHelp,
74 KeyCode::Char(c) => Action::InsertChar(c),
75 KeyCode::Enter => Action::InsertNewline,
76 KeyCode::Backspace => Action::DeleteBack,
77 KeyCode::Delete => Action::DeleteForward,
78 KeyCode::Left if key.modifiers.contains(KeyModifiers::CONTROL) => {
79 Action::MoveCursorWordLeft
80 }
81 KeyCode::Right if key.modifiers.contains(KeyModifiers::CONTROL) => {
82 Action::MoveCursorWordRight
83 }
84 KeyCode::Left => Action::MoveCursorLeft,
85 KeyCode::Right => Action::MoveCursorRight,
86 KeyCode::Up => Action::ScrollUp,
87 KeyCode::Down => Action::ScrollDown,
88 KeyCode::Home => Action::MoveCursorHome,
89 KeyCode::End => Action::MoveCursorEnd,
90 _ => Action::None,
91 }
92}