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    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}