A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/edi/st.rs')
| -rw-r--r-- | src/edi/st.rs | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/src/edi/st.rs b/src/edi/st.rs index 8eac701..adf0486 100644 --- a/src/edi/st.rs +++ b/src/edi/st.rs @@ -11,7 +11,7 @@ use crate::lsp::{AQErr, RequestError, Rq, RqS}; use crate::sym::{Symbols, SymbolsType}; use crate::text::TextArea; use crate::{ - BoolRequest, CLICKING, InputRequest, act, ctrl, handle, shift, + BoolRequest, CLICKING, InputRequest, act, alt, ctrl, handle, shift, }; impl Default for State { @@ -19,6 +19,16 @@ impl Default for State { Self::Default } } +#[derive(Debug, Copy, Clone)] +pub enum Direction { + Above, + Below, +} +#[derive(Debug, Copy, Clone)] +pub enum LR { + Left, + Right, +} rust_fsm::state_machine! { #[derive(Debug)] pub(crate) State => #[derive(Debug)] pub(crate) Action => #[derive(Debug)] pub(crate) Do @@ -37,17 +47,21 @@ Default => { K(Key::Character(x) if x == "." && ctrl()) => _ [CodeAction], K(Key::Character(x) if x == "0" && ctrl()) => _ [MatchingBrace], K(Key::Character(x) if x == "`" && ctrl()) => _ [SpawnTerminal], - K(Key::Character(y) if y == "/" && ctrl()) => Default [Comment(Range<usize> => 0..0)], + K(Key::Character(y) if y == "/" && ctrl()) => Default [Comment], K(Key::Named(F1)) => Procure((default(), InputRequest::RenameSymbol)), - K(Key::Named(ArrowUp | ArrowLeft | ArrowDown | ArrowRight | Home | End) if shift()) => Selection(Range<usize> => 0..0) [StartSelection], - M(MouseButton::Left if shift()) => Selection(Range<usize> => 0..0) [StartSelection], + K(Key::Named(k @ (ArrowUp | ArrowDown)) if alt()) => _ [InsertCursor(Direction => { + if k == ArrowUp {Direction::Above} else { Direction::Below } + })], + K(Key::Named(ArrowUp | ArrowLeft | ArrowDown | ArrowRight | Home | End) if shift()) => Selection [StartSelection], + M(MouseButton::Left if shift()) => Selection [StartSelection], + M(MouseButton::Left if alt()) => _ [InsertCursorAtMouse], M(MouseButton::Left if ctrl()) => _ [GoToDefinition], M(MouseButton::Left) => _ [MoveCursor], M(MouseButton::Back) => _ [NavBack], M(MouseButton::Forward) => _ [NavForward], - C(((usize, usize)) => .. if unsafe { CLICKING }) => Selection(0..0) [StartSelection], + C(((usize, usize)) => .. if unsafe { CLICKING }) => Selection [StartSelection], Changed => RequestBoolean(BoolRequest => BoolRequest::ReloadFile), - K(Key::Named(Escape)) => _ [MaybeRemoveSigHelp], + K(Key::Named(Escape)) => _ [Escape], C(_) => _ [Hover], K(_) => _ [Edit], M(_) => _, @@ -79,22 +93,22 @@ CodeAction(RqS<act::CodeActions, lsp_request!("textDocument/codeAction")> => rq) M(_) => _, K(_) => _, }, -Selection(x if shift()) => { - K(Key::Named(ArrowUp | ArrowLeft | ArrowDown | ArrowRight | Home | End)) => Selection(x) [UpdateSelection], - M(MouseButton => MouseButton::Left) => Selection(x) [ExtendSelectionToMouse], +Selection => { + K(Key::Named(ArrowUp | ArrowLeft | ArrowDown | ArrowRight | Home | End) if shift()) => Selection [UpdateSelection], + M(MouseButton::Left if shift()) => Selection [ExtendSelectionToMouse], }, // note: it does in fact fall through. this syntax is not an arm, merely shorthand. -Selection(x) => { +Selection => { C(_ if unsafe { CLICKING }) => _ [ExtendSelectionToMouse], - C(_) => Selection(x), + C(_) => _, M(MouseButton => MouseButton::Left) => Default [MoveCursor], - K(Key::Named(Backspace)) => Default [Delete(Range<usize> => x)], - K(Key::Character(y) if y == "x" && ctrl()) => Default [Cut(Range<usize> => x)], - K(Key::Character(y) if y == "c" && ctrl()) => Default [Copy(Range<usize> => x)], - K(Key::Character(y) if y == "/" && ctrl()) => Default [Comment(Range<usize> => x)], + K(Key::Named(Backspace)) => Default [Delete], + K(Key::Character(y) if y == "x" && ctrl()) => Default [Cut], + K(Key::Character(y) if y == "c" && ctrl()) => Default [Copy], + K(Key::Character(y) if y == "/" && ctrl()) => Default [Comment], - K(Key::Character(y) if !ctrl()) => Default [Insert((Range<usize>, SmolStr) => (x, y))], - K(Key::Named(ArrowLeft)) => Default [SetCursor(usize => x.start)], - K(Key::Named(ArrowRight)) => Default [SetCursor(usize => x.end)], + K(Key::Character(y) if !ctrl()) => Default [Insert(SmolStr => y)], + K(Key::Named(ArrowLeft)) => Default [SetCursor(LR => LR::Left)], + K(Key::Named(ArrowRight)) => Default [SetCursor(LR::Right)], K(_) => Default [Edit], }, Save => { |