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