From 294791dffd707d0725db5eb35b5165fd1bb2c24a Mon Sep 17 00:00:00 2001 From: Jan Hrastnik Date: Sun, 28 Feb 2021 00:39:13 +0100 Subject: [PATCH] added picker for gd, but yet to test it. also need to load appropriate file when definition isnt in same file --- helix-term/src/commands.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index b2809f96..f07a3933 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -861,15 +861,42 @@ pub fn goto_definition(cx: &mut Context) { let res = smol::block_on(language_server.goto_definition(doc.identifier(), pos)).unwrap_or_default(); + /* if res.len() == 1 { let definition_pos = res.get(0).unwrap().range.start; let new_pos = helix_lsp::util::lsp_pos_to_pos(doc.text().slice(..), definition_pos); doc.set_selection(Selection::point(new_pos)); } else { // show menu picker i guess - } + }*/ doc.mode = Mode::Normal; + + match &res.as_slice() { + [location] => { + let definition_pos = location.range.start; + let new_pos = helix_lsp::util::lsp_pos_to_pos(doc.text().slice(..), definition_pos); + doc.set_selection(Selection::point(new_pos)); + } + [] => (), // maybe show user message that no definition was found? + _ => { + let snapshot = doc.state.clone(); + let mut picker = ui::Picker::new( + res, + |item| { + let file = item.uri.as_str(); + let line = item.range.start.line.to_string(); + format!("{}:{}", file, line).into() + }, + move |editor: &mut Editor, item| { + let doc = &mut editor.view_mut().doc; + + // revert state to what it was before the last update + doc.state = snapshot.clone(); + }, + ); + } + } } // NOTE: Transactions in this module get appended to history when we switch back to normal mode.