Skip to main content

rgx/input/
mod.rs

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}