1pub mod editor;
2pub mod handler;
3pub mod vim;
4
5use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum Action {
9 InsertChar(char),
10 InsertNewline,
11 DeleteBack,
12 DeleteForward,
13 DeleteCharAtCursor,
14 DeleteLine,
15 ChangeLine,
16 OpenLineBelow,
17 OpenLineAbove,
18 MoveToFirstNonBlank,
19 MoveToFirstLine,
20 MoveToLastLine,
21 MoveCursorLeft,
22 MoveCursorRight,
23 MoveCursorHome,
24 MoveCursorEnd,
25 MoveCursorWordLeft,
26 MoveCursorWordRight,
27 MoveCursorWordForwardEnd,
28 ScrollUp,
29 ScrollDown,
30 SwitchPanel,
31 SwitchPanelBack,
32 SwitchEngine,
33 ToggleCaseInsensitive,
34 ToggleMultiLine,
35 ToggleDotAll,
36 ToggleUnicode,
37 ToggleExtended,
38 ShowHelp,
39 Undo,
40 Redo,
41 HistoryPrev,
42 HistoryNext,
43 CopyMatch,
44 PasteClipboard,
45 ToggleWhitespace,
46 OutputAndQuit,
47 SaveWorkspace,
48 OpenRecipes,
49 OpenGrex,
50 Benchmark,
51 ExportRegex101,
52 GenerateCode,
53 EnterInsertMode,
54 EnterInsertModeAppend,
55 EnterInsertModeLineStart,
56 EnterInsertModeLineEnd,
57 EnterNormalMode,
58 ToggleDebugger,
59 Quit,
60 None,
61}
62
63pub fn key_to_action(key: KeyEvent) -> Action {
64 match key.code {
65 KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Quit,
66 KeyCode::Char('q') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Quit,
67 KeyCode::Esc => Action::Quit,
68 KeyCode::Tab => Action::SwitchPanel,
69 KeyCode::BackTab => Action::SwitchPanelBack,
70 KeyCode::Char('e') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::SwitchEngine,
71 KeyCode::Char('z') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Undo,
72 KeyCode::Char('Z')
73 if key
74 .modifiers
75 .contains(KeyModifiers::CONTROL | KeyModifiers::SHIFT) =>
76 {
77 Action::Redo
78 }
79 KeyCode::Char('y') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::CopyMatch,
80 KeyCode::Char('w') if key.modifiers.contains(KeyModifiers::CONTROL) => {
81 Action::ToggleWhitespace
82 }
83 KeyCode::Char('o') if key.modifiers.contains(KeyModifiers::CONTROL) => {
84 Action::OutputAndQuit
85 }
86 KeyCode::Char('s') if key.modifiers.contains(KeyModifiers::CONTROL) => {
87 Action::SaveWorkspace
88 }
89 KeyCode::Char('r') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::OpenRecipes,
90 KeyCode::Char('x') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::OpenGrex,
91 KeyCode::Char('b') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Benchmark,
92 KeyCode::Char('u') if key.modifiers.contains(KeyModifiers::CONTROL) => {
93 Action::ExportRegex101
94 }
95 KeyCode::Char('g') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::GenerateCode,
96 KeyCode::Char('d') if key.modifiers.contains(KeyModifiers::CONTROL) => {
97 Action::ToggleDebugger
98 }
99 KeyCode::Char('i') if key.modifiers.contains(KeyModifiers::ALT) => {
100 Action::ToggleCaseInsensitive
101 }
102 KeyCode::Char('m') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleMultiLine,
103 KeyCode::Char('s') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleDotAll,
104 KeyCode::Char('u') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleUnicode,
105 KeyCode::Char('x') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleExtended,
106 KeyCode::Up if key.modifiers.contains(KeyModifiers::ALT) => Action::HistoryPrev,
107 KeyCode::Down if key.modifiers.contains(KeyModifiers::ALT) => Action::HistoryNext,
108 KeyCode::F(1) => Action::ShowHelp,
109 KeyCode::Char(c) => Action::InsertChar(c),
110 KeyCode::Enter => Action::InsertNewline,
111 KeyCode::Backspace => Action::DeleteBack,
112 KeyCode::Delete => Action::DeleteForward,
113 KeyCode::Left if key.modifiers.contains(KeyModifiers::CONTROL) => {
114 Action::MoveCursorWordLeft
115 }
116 KeyCode::Right if key.modifiers.contains(KeyModifiers::CONTROL) => {
117 Action::MoveCursorWordRight
118 }
119 KeyCode::Left => Action::MoveCursorLeft,
120 KeyCode::Right => Action::MoveCursorRight,
121 KeyCode::Up => Action::ScrollUp,
122 KeyCode::Down => Action::ScrollDown,
123 KeyCode::Home => Action::MoveCursorHome,
124 KeyCode::End => Action::MoveCursorEnd,
125 _ => Action::None,
126 }
127}