mirror of https://github.com/helix-editor/helix
Passing extra formatting options to LSPs (#2635)
* allows passing extra formatting options to LSPs - adds optional field 'format' to [[language]] sections in 'languages.toml' - passes specified options the LSPs via FormattingOptions * cleaner conversion of formatting properties * move formatting options inside lsp::Client * cleans up formatting properties mergepull/2681/head
parent
b2bd87df81
commit
f92a25a856
|
@ -14,6 +14,18 @@ name = "rust"
|
||||||
auto-format = false
|
auto-format = false
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## LSP formatting options
|
||||||
|
|
||||||
|
Use `format` field to pass extra formatting options to [Document Formatting Requests](https://github.com/microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-16.md#document-formatting-request--leftwards_arrow_with_hook).
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[[language]]
|
||||||
|
name = "typescript"
|
||||||
|
auto-format = true
|
||||||
|
# pass format options according to https://github.com/typescript-language-server/typescript-language-server#workspacedidchangeconfiguration omitting the "[language].format." prefix.
|
||||||
|
config = { format = { "semicolons" = "insert", "insertSpaceBeforeFunctionParenthesis" = true } }
|
||||||
|
```
|
||||||
|
|
||||||
## Tree-sitter grammars
|
## Tree-sitter grammars
|
||||||
|
|
||||||
Tree-sitter grammars can also be configured in `languages.toml`:
|
Tree-sitter grammars can also be configured in `languages.toml`:
|
||||||
|
|
|
@ -78,6 +78,7 @@ pub struct LanguageConfiguration {
|
||||||
|
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub auto_format: bool,
|
pub auto_format: bool,
|
||||||
|
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub diagnostic_severity: Severity,
|
pub diagnostic_severity: Severity,
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,9 @@ use anyhow::anyhow;
|
||||||
use helix_core::{find_root, ChangeSet, Rope};
|
use helix_core::{find_root, ChangeSet, Rope};
|
||||||
use jsonrpc_core as jsonrpc;
|
use jsonrpc_core as jsonrpc;
|
||||||
use lsp_types as lsp;
|
use lsp_types as lsp;
|
||||||
|
use serde::Deserialize;
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
use std::collections::HashMap;
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
use std::process::Stdio;
|
use std::process::Stdio;
|
||||||
use std::sync::{
|
use std::sync::{
|
||||||
|
@ -693,6 +695,24 @@ impl Client {
|
||||||
};
|
};
|
||||||
// TODO: return err::unavailable so we can fall back to tree sitter formatting
|
// TODO: return err::unavailable so we can fall back to tree sitter formatting
|
||||||
|
|
||||||
|
// merge FormattingOptions with 'config.format'
|
||||||
|
let config_format = self
|
||||||
|
.config
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|cfg| cfg.get("format"))
|
||||||
|
.and_then(|fmt| HashMap::<String, lsp::FormattingProperty>::deserialize(fmt).ok());
|
||||||
|
|
||||||
|
let options = if let Some(mut properties) = config_format {
|
||||||
|
// passed in options take precedence over 'config.format'
|
||||||
|
properties.extend(options.properties);
|
||||||
|
lsp::FormattingOptions {
|
||||||
|
properties,
|
||||||
|
..options
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
options
|
||||||
|
};
|
||||||
|
|
||||||
let params = lsp::DocumentFormattingParams {
|
let params = lsp::DocumentFormattingParams {
|
||||||
text_document,
|
text_document,
|
||||||
options,
|
options,
|
||||||
|
|
|
@ -410,6 +410,7 @@ impl Document {
|
||||||
let language_server = self.language_server()?;
|
let language_server = self.language_server()?;
|
||||||
let text = self.text.clone();
|
let text = self.text.clone();
|
||||||
let offset_encoding = language_server.offset_encoding();
|
let offset_encoding = language_server.offset_encoding();
|
||||||
|
|
||||||
let request = language_server.text_document_formatting(
|
let request = language_server.text_document_formatting(
|
||||||
self.identifier(),
|
self.identifier(),
|
||||||
lsp::FormattingOptions {
|
lsp::FormattingOptions {
|
||||||
|
|
Loading…
Reference in New Issue