diff options
Diffstat (limited to 'helix-view')
-rw-r--r-- | helix-view/src/editor.rs | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 9fb2ae36..54a098f9 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -10,6 +10,7 @@ pub struct Editor { pub focus: usize, pub should_close: bool, pub theme: Theme, // TODO: share one instance + pub language_servers: helix_lsp::Registry, } impl Default for Editor { @@ -21,28 +22,54 @@ impl Default for Editor { impl Editor { pub fn new() -> Self { let theme = Theme::default(); + let language_servers = helix_lsp::Registry::new(); Self { views: Vec::new(), focus: 0, should_close: false, theme, + language_servers, } } - pub fn open(&mut self, path: PathBuf, size: (u16, u16)) -> Result<(), Error> { + pub fn open( + &mut self, + path: PathBuf, + size: (u16, u16), + executor: &smol::Executor, + ) -> Result<(), Error> { let pos = self.views.len(); - let doc = Document::load(path, self.theme.scopes())?; + let mut doc = Document::load(path, self.theme.scopes())?; + + // try to find a language server based on the language name + let language_server = doc + .language + .as_ref() + .and_then(|language| self.language_servers.get(&language, &executor)); + + if let Some(language_server) = language_server { + // TODO: do this everywhere + doc.set_language_server(Some(language_server.clone())); + + smol::block_on(language_server.text_document_did_open( + doc.url().unwrap(), + doc.version, + doc.text(), + )) + .unwrap(); + } + self.views.push(View::new(doc, size)?); self.focus = pos; Ok(()) } - pub fn view(&self) -> Option<&View> { - self.views.get(self.focus) + pub fn view(&self) -> &View { + self.views.get(self.focus).unwrap() } - pub fn view_mut(&mut self) -> Option<&mut View> { - self.views.get_mut(self.focus) + pub fn view_mut(&mut self) -> &mut View { + self.views.get_mut(self.focus).unwrap() } } |