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 ToggleQuickref,
47 OutputAndQuit,
48 SaveWorkspace,
49 OpenRecipes,
50 OpenGrex,
51 Benchmark,
52 ExportRegex101,
53 GenerateCode,
54 EnterInsertMode,
55 EnterInsertModeAppend,
56 EnterInsertModeLineStart,
57 EnterInsertModeLineEnd,
58 EnterNormalMode,
59 ToggleDebugger,
60 Quit,
61 None,
62}
63
64pub fn key_to_action(key: KeyEvent) -> Action {
65 match key.code {
66 KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Quit,
67 KeyCode::Char('q') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Quit,
68 KeyCode::Esc => Action::Quit,
69 KeyCode::Tab => Action::SwitchPanel,
70 KeyCode::BackTab => Action::SwitchPanelBack,
71 KeyCode::Char('e') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::SwitchEngine,
72 KeyCode::Char('z') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Undo,
73 KeyCode::Char('Z')
74 if key
75 .modifiers
76 .contains(KeyModifiers::CONTROL | KeyModifiers::SHIFT) =>
77 {
78 Action::Redo
79 }
80 KeyCode::Char('y') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::CopyMatch,
81 KeyCode::Char('w') if key.modifiers.contains(KeyModifiers::CONTROL) => {
82 Action::ToggleWhitespace
83 }
84 KeyCode::Char('o') if key.modifiers.contains(KeyModifiers::CONTROL) => {
85 Action::OutputAndQuit
86 }
87 KeyCode::Char('s') if key.modifiers.contains(KeyModifiers::CONTROL) => {
88 Action::SaveWorkspace
89 }
90 KeyCode::Char('r') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::OpenRecipes,
91 KeyCode::Char('x') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::OpenGrex,
92 KeyCode::Char('b') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::Benchmark,
93 KeyCode::Char('u') if key.modifiers.contains(KeyModifiers::CONTROL) => {
94 Action::ExportRegex101
95 }
96 KeyCode::Char('g') if key.modifiers.contains(KeyModifiers::CONTROL) => Action::GenerateCode,
97 KeyCode::Char('d') if key.modifiers.contains(KeyModifiers::CONTROL) => {
98 Action::ToggleDebugger
99 }
100 KeyCode::Char('i') if key.modifiers.contains(KeyModifiers::ALT) => {
101 Action::ToggleCaseInsensitive
102 }
103 KeyCode::Char('m') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleMultiLine,
104 KeyCode::Char('s') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleDotAll,
105 KeyCode::Char('u') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleUnicode,
106 KeyCode::Char('x') if key.modifiers.contains(KeyModifiers::ALT) => Action::ToggleExtended,
107 KeyCode::Up if key.modifiers.contains(KeyModifiers::ALT) => Action::HistoryPrev,
108 KeyCode::Down if key.modifiers.contains(KeyModifiers::ALT) => Action::HistoryNext,
109 KeyCode::F(1) => Action::ShowHelp,
110 KeyCode::F(3) => Action::ToggleQuickref,
111 KeyCode::Char(c) => Action::InsertChar(c),
112 KeyCode::Enter => Action::InsertNewline,
113 KeyCode::Backspace => Action::DeleteBack,
114 KeyCode::Delete => Action::DeleteForward,
115 KeyCode::Left if key.modifiers.contains(KeyModifiers::CONTROL) => {
116 Action::MoveCursorWordLeft
117 }
118 KeyCode::Right if key.modifiers.contains(KeyModifiers::CONTROL) => {
119 Action::MoveCursorWordRight
120 }
121 KeyCode::Left => Action::MoveCursorLeft,
122 KeyCode::Right => Action::MoveCursorRight,
123 KeyCode::Up => Action::ScrollUp,
124 KeyCode::Down => Action::ScrollDown,
125 KeyCode::Home => Action::MoveCursorHome,
126 KeyCode::End => Action::MoveCursorEnd,
127 _ => Action::None,
128 }
129}