diff --git a/helix-core/src/indent.rs b/helix-core/src/indent.rs index 1b36db7b1..292ade4b5 100644 --- a/helix-core/src/indent.rs +++ b/helix-core/src/indent.rs @@ -262,6 +262,7 @@ where file_types: vec!["rs".to_string()], language_id: "Rust".to_string(), highlight_config: OnceCell::new(), + config: None, // roots: vec![], auto_format: false, diff --git a/helix-core/src/syntax.rs b/helix-core/src/syntax.rs index f249f5fe7..621cd0469 100644 --- a/helix-core/src/syntax.rs +++ b/helix-core/src/syntax.rs @@ -35,6 +35,7 @@ pub struct LanguageConfiguration { pub scope: String, // source.rust pub file_types: Vec, // filename ends_with? pub roots: Vec, // these indicate project roots <.git, Cargo.toml> + pub config: Option, #[serde(default)] pub auto_format: bool, diff --git a/helix-lsp/src/client.rs b/helix-lsp/src/client.rs index 7f136fe84..1c2a49b52 100644 --- a/helix-lsp/src/client.rs +++ b/helix-lsp/src/client.rs @@ -24,12 +24,14 @@ pub struct Client { request_counter: AtomicU64, capabilities: Option, offset_encoding: OffsetEncoding, + config: Option, } impl Client { pub fn start( cmd: &str, args: &[String], + config: Option, id: usize, ) -> Result<(Self, UnboundedReceiver<(usize, Call)>)> { let process = Command::new(cmd) @@ -57,6 +59,7 @@ impl Client { request_counter: AtomicU64::new(0), capabilities: None, offset_encoding: OffsetEncoding::Utf8, + config, }; // TODO: async client.initialize() @@ -214,13 +217,17 @@ impl Client { // TODO: delay any requests that are triggered prior to initialize let root = find_root(None).and_then(|root| lsp::Url::from_file_path(root).ok()); + if self.config.is_some() { + log::info!("Using custom LSP config: {}", self.config.as_ref().unwrap()); + } + #[allow(deprecated)] let params = lsp::InitializeParams { process_id: Some(std::process::id()), // root_path is obsolete, use root_uri root_path: None, root_uri: root, - initialization_options: None, + initialization_options: self.config.clone(), capabilities: lsp::ClientCapabilities { text_document: Some(lsp::TextDocumentClientCapabilities { completion: Some(lsp::CompletionClientCapabilities { diff --git a/helix-lsp/src/lib.rs b/helix-lsp/src/lib.rs index 96a45bb90..72606b709 100644 --- a/helix-lsp/src/lib.rs +++ b/helix-lsp/src/lib.rs @@ -312,7 +312,12 @@ impl Registry { Entry::Vacant(entry) => { // initialize a new client let id = self.counter.fetch_add(1, Ordering::Relaxed); - let (mut client, incoming) = Client::start(&config.command, &config.args, id)?; + let (mut client, incoming) = Client::start( + &config.command, + &config.args, + serde_json::from_str(language_config.config.as_deref().unwrap_or("")).ok(), + id, + )?; // TODO: run this async without blocking futures_executor::block_on(client.initialize())?; s_incoming.push(UnboundedReceiverStream::new(incoming)); diff --git a/languages.toml b/languages.toml index 204a59878..ee495635f 100644 --- a/languages.toml +++ b/languages.toml @@ -5,6 +5,16 @@ injection-regex = "rust" file-types = ["rs"] roots = [] auto-format = true +config = """ +{ + "cargo": { + "loadOutDirsFromCheck": true + }, + "procMacro": { + "enable": false + } +} +""" language-server = { command = "rust-analyzer" } indent = { tab-width = 4, unit = " " }