diff --git a/book/src/configuration.md b/book/src/configuration.md index 87585ece0..7514a3d0f 100644 --- a/book/src/configuration.md +++ b/book/src/configuration.md @@ -115,6 +115,7 @@ ### `[editor.lsp]` Section | Key | Description | Default | | --- | ----------- | ------- | +| `enable` | Enables LSP integration. Setting to false will completely disable language servers regardless of language settings.| `true` | | `display-messages` | Display LSP progress messages below statusline[^1] | `false` | | `auto-signature-help` | Enable automatic popup of signature help (parameter hints) | `true` | | `display-signature-help-docs` | Display docs under signature help popup | `true` | diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index aabf9cde6..042f5bdb4 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -369,6 +369,8 @@ pub fn get_terminal_provider() -> Option { #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(default, rename_all = "kebab-case", deny_unknown_fields)] pub struct LspConfig { + /// Enables LSP + pub enable: bool, /// Display LSP progress messages below statusline pub display_messages: bool, /// Enable automatic pop up of signature help (parameter hints) @@ -380,6 +382,7 @@ pub struct LspConfig { impl Default for LspConfig { fn default() -> Self { Self { + enable: true, display_messages: false, auto_signature_help: true, display_signature_help_docs: true, @@ -1077,18 +1080,25 @@ fn set_theme_impl(&mut self, theme: Theme, preview: ThemeAction) { /// Refreshes the language server for a given document pub fn refresh_language_server(&mut self, doc_id: DocumentId) -> Option<()> { - let doc = self.documents.get_mut(&doc_id)?; - Self::launch_language_server(&mut self.language_servers, doc) + self.launch_language_server(doc_id) } /// Launch a language server for a given document - fn launch_language_server(ls: &mut helix_lsp::Registry, doc: &mut Document) -> Option<()> { + fn launch_language_server(&mut self, doc_id: DocumentId) -> Option<()> { + if !self.config().lsp.enable { + return None; + } + // if doc doesn't have a URL it's a scratch buffer, ignore it - let doc_url = doc.url()?; + let (lang, path) = { + let doc = self.document(doc_id)?; + (doc.language.clone(), doc.path().cloned()) + }; // try to find a language server based on the language name - let language_server = doc.language.as_ref().and_then(|language| { - ls.get(language, doc.path()) + let language_server = lang.as_ref().and_then(|language| { + self.language_servers + .get(language, path.as_ref()) .map_err(|e| { log::error!( "Failed to initialize the LSP for `{}` {{ {} }}", @@ -1099,6 +1109,10 @@ fn launch_language_server(ls: &mut helix_lsp::Registry, doc: &mut Document) -> O .ok() .flatten() }); + + let doc = self.document_mut(doc_id)?; + let doc_url = doc.url()?; + if let Some(language_server) = language_server { // only spawn a new lang server if the servers aren't the same if Some(language_server.id()) != doc.language_server().map(|server| server.id()) { @@ -1288,11 +1302,14 @@ pub fn open(&mut self, path: &Path, action: Action) -> Result self.config.clone(), )?; - let _ = Self::launch_language_server(&mut self.language_servers, &mut doc); if let Some(diff_base) = self.diff_providers.get_diff_base(&path) { doc.set_diff_base(diff_base, self.redraw_handle.clone()); } - self.new_document(doc) + + let id = self.new_document(doc); + let _ = self.launch_language_server(id); + + id }; self.switch(id, action);