Skip to main content

rgx/input/
mod.rs

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}