A simple CPU rendered GUI IDE experience.
| -rw-r--r-- | src/edi/input_handlers/click.rs | 19 | ||||
| -rw-r--r-- | src/edi/input_handlers/cursor.rs | 17 | ||||
| -rw-r--r-- | src/edi/input_handlers/keyboard.rs | 2 | ||||
| -rw-r--r-- | src/edi/st.rs | 9 | ||||
| -rw-r--r-- | src/hov.rs | 15 |
5 files changed, 50 insertions, 12 deletions
diff --git a/src/edi/input_handlers/click.rs b/src/edi/input_handlers/click.rs index 2357376..93245c6 100644 --- a/src/edi/input_handlers/click.rs +++ b/src/edi/input_handlers/click.rs @@ -53,8 +53,23 @@ impl Editor { text.cursor.first_mut().extend_selection_to(p, &text.rope); self.hist.lc = text.cursor.clone(); } - Some(Do::GoToDefinition) => { - if let Some(x) = self.requests.def.result.clone() + Some(Do::GoToDefinition(tdpp)) => { + dbg!(&tdpp); + if let Some(x) = self.requests.def.result.clone().or_else(|| { + tdpp.zip(lsp!(self)).and_then(|(tdpp, lsp)| { + lsp.request_immediate::<lsp_request!("textDocument/definition")>( + &GotoDefinitionParams { + text_document_position_params: tdpp, + work_done_progress_params: default(), + partial_result_params: default(), + }, + ).ok() + }).flatten().and_then(|x| match &x { + GotoDefinitionResponse::Link([x, ..]) => Some(x.clone()), + _ => None, + }) + + }) && let Err(e) = self.go(&x, w.clone()) { log::error!("gtd: {e}"); diff --git a/src/edi/input_handlers/cursor.rs b/src/edi/input_handlers/cursor.rs index 166de8b..e0fc1b5 100644 --- a/src/edi/input_handlers/cursor.rs +++ b/src/edi/input_handlers/cursor.rs @@ -107,7 +107,7 @@ impl Editor { let (lsp, o) = lsp!(self + p).unwrap(); let text = self.text.clone(); let mut rang = None; - let z = match hover { + let tdpp = match hover { Mapping::Char(_, _, i) => TextDocumentPositionParams { position: text.to_l_position(i).unwrap(), text_document: o.tid(), @@ -152,7 +152,7 @@ impl Editor { let handle = lsp.runtime.spawn( lsp.request::<lsp_request!("textDocument/definition")>( &GotoDefinitionParams { - text_document_position_params: z.clone(), + text_document_position_params: tdpp.clone(), work_done_progress_params: default(), partial_result_params: default(), }, @@ -178,6 +178,12 @@ impl Editor { Set::Reset }; + match x { + Set::To((x, y)) => + self.requests.def.request = Some((DropH::new(x), y)), + Set::Reset => self.requests.def.result = None, + Set::Ignore => {} + } // match self.state.consume(cursor_position) {} // if let Some((_, c)) = hov.request // && c == cursor_position @@ -187,11 +193,12 @@ impl Editor { // if !running.insert(hover) {return} let (rx, _) = lsp .request::<HoverRequest>(&HoverParams { - text_document_position_params: z, + text_document_position_params: tdpp.clone(), work_done_progress_params: default(), }) .unwrap(); // println!("rq hov of {hover:?} (cur {})", requests.hovering.request.is_some()); + let tdp = tdpp.clone(); let handle: tokio::task::JoinHandle<Result<Option<Hovr>, _>> = lsp.runtime.spawn(async move { let Some(x) = rx.await? else { @@ -253,6 +260,7 @@ impl Editor { Ok(Some( hov::Hovr { span, + tdpp: tdp, item: CellBuffer { c: w, vo: 0, @@ -264,8 +272,9 @@ impl Editor { .into(), )) }); + self.state - .consume(Action::SetHovering(handle, cursor_position)) + .consume(Action::SetHovering(handle, (cursor_position, tdpp))) .unwrap(); // self.requests.hovering.request = // (DropH::new(handle), cursor_position).into(); diff --git a/src/edi/input_handlers/keyboard.rs b/src/edi/input_handlers/keyboard.rs index 1fc1f00..9a22457 100644 --- a/src/edi/input_handlers/keyboard.rs +++ b/src/edi/input_handlers/keyboard.rs @@ -321,7 +321,7 @@ impl Editor { Some(Do::NavForward) => self.nav_forward(), Some( Do::Reinsert - | Do::GoToDefinition + | Do::GoToDefinition(_) | Do::MoveCursor | Do::ExtendSelectionToMouse | Do::Hover diff --git a/src/edi/st.rs b/src/edi/st.rs index 17da088..3d0f282 100644 --- a/src/edi/st.rs +++ b/src/edi/st.rs @@ -65,7 +65,7 @@ Default => { 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 if ctrl()) => _ [GoToDefinition(Option<TextDocumentPositionParams> => None)], M(MouseButton::Left) => _ [MoveCursor], K(Key::Character("=") if ctrl()) => _ [NavForward], K(Key::Character("-") if ctrl()) => _ [NavBack], @@ -79,20 +79,21 @@ Default => { M(_) => _, }, Hovered => { - HOnSomething(((usize, usize)) => pos) => Hovering(Rq<Hovr, Option<Hovr>, (usize, usize), RequestError<HoverRequest>> => default()) [SetHovering], + HOnSomething(((usize, usize)) => pos) => Hovering(Rq<Hovr, Option<Hovr>, ((usize, usize), TextDocumentPositionParams), RequestError<HoverRequest>> => default()) [SetHovering], HOnNothing => Default, }, Hovering(x) => { // now hovering over something else, cancel existing hover - HOnSomething(pos if let Some((_, c)) = x.request && dbg!(c != pos)) => _ [SetHovering], + HOnSomething(pos if let Some((_, (c, _))) = x.request && (c != pos)) => _ [SetHovering], HOnSomething(_) => _ [SetHovering], HOnNothing => Default, SetHovering((tokio::task::JoinHandle< Result<Option<Hovr>, RequestError<HoverRequest>>, - >, (usize, usize)) => (h, d)) => Hovering({ let mut x = x; x.request_d(h, d); x }), + >, ((usize, usize), TextDocumentPositionParams)) => (h, d)) => Hovering({ let mut x = x; x.request_d(h, d); x }), C(_) => _ [Hover], MovedOut => Default, K(_) => _, + M(MouseButton::Left if ctrl()) => Default [GoToDefinition(x.request.map(|x| x.1.1).or(x.result.map(|x| x.tdpp)))], M(_) => _ [ClickedHover], }, Command(_) => K(Key::Named(Escape)) => Default, @@ -1,13 +1,17 @@ use std::iter::{empty, once, repeat_n}; use std::pin::pin; +use std::str::FromStr; use std::vec::Vec; +use Default::default; use dsb::Cell; use dsb::cell::Style; use itertools::Itertools; +use lsp_types::{TextDocumentIdentifier, TextDocumentPositionParams}; use markdown::mdast::{self, Node}; use ropey::Rope; use serde_derive::{Deserialize, Serialize}; +use url::Url; const D: Cell = Cell { letter: None, style: Style::new(FG, BG) }; use crate::{FG, text}; @@ -308,6 +312,15 @@ pub struct Hovr { pub(crate) item: crate::rnd::CellBuffer, #[serde(skip)] pub(crate) range: Option<lsp_types::Range>, + #[serde(skip, default = "tdp")] + pub(crate) tdpp: TextDocumentPositionParams, +} +fn tdp() -> TextDocumentPositionParams { + TextDocumentPositionParams { + text_document: TextDocumentIdentifier { + uri: Url::from_str("/home/").unwrap(), + }, + position: default(), + } } - pub type VisualX = usize; |