@@ -271,6 +271,53 @@ impl Editor {
274+ /// Refreshes the language server for a given document
275+ pub fn refresh_language_server(&mut self, doc_id: DocumentId) -> Option<()> {
276+ let doc = self.documents.get_mut(&doc_id)?;
277+ doc.detect_language(Some(&self.theme), &self.syn_loader);
278+ Self::launch_language_server(&mut self.language_servers, doc)
281+ /// Launch a language server for a given document
282+ fn launch_language_server(ls: &mut helix_lsp::Registry, doc: &mut Document) -> Option<()> {
283+ // try to find a language server based on the language name
284+ let language_server = doc.language.as_ref().and_then(|language| {
288+ "Failed to initialize the LSP for `{}` {{ {} }}",
295+ if let Some(language_server) = language_server {
296+ // only spawn a new lang server if the servers aren't the same
297+ if Some(language_server.id()) != doc.language_server().map(|server| server.id()) {
298+ if let Some(language_server) = doc.language_server() {
299+ tokio::spawn(language_server.text_document_did_close(doc.identifier()));
301+ let language_id = doc
303+ .and_then(|s| s.split('.').last()) // source.rust
304+ .map(ToOwned::to_owned)
305+ .unwrap_or_default();
307+ // TODO: this now races with on_init code if the init happens too quickly
308+ tokio::spawn(language_server.text_document_did_open(
315+ doc.set_language_server(Some(language_server));
274 fn _refresh(&mut self) {
321 fn _refresh(&mut self) {
275 for (view, _) in self.tree.views_mut() {
322 for (view, _) in self.tree.views_mut() {
276 let doc = &self.documents[&view.doc];
323 let doc = &self.documents[&view.doc];
@@ -401,37 +448,7 @@ impl Editor {
402 let mut doc = Document::open(&path, None, Some(&self.theme), Some(&self.syn_loader))?;
449 let mut doc = Document::open(&path, None, Some(&self.theme), Some(&self.syn_loader))?;
404− // try to find a language server based on the language name
405− let language_server = doc.language.as_ref().and_then(|language| {
406− self.language_servers
451+ let _ = Self::launch_language_server(&mut self.language_servers, &mut doc);
410− "Failed to initialize the LSP for `{}` {{ {} }}",
418− if let Some(language_server) = language_server {
419− let language_id = doc
421− .and_then(|s| s.split('.').last()) // source.rust
422− .map(ToOwned::to_owned)
423− .unwrap_or_default();
425− // TODO: this now races with on_init code if the init happens too quickly
426− tokio::spawn(language_server.text_document_did_open(
433− doc.set_language_server(Some(language_server));
436 self.new_document(doc)
453 self.new_document(doc)