mirror of https://github.com/helix-editor/helix
feat(config): add `[workspace-]diagnostics` fields to statusline (#13288)
parent
34aa4d41c6
commit
d24e4fcf0f
|
@ -104,6 +104,8 @@ separator = "│"
|
|||
mode.normal = "NORMAL"
|
||||
mode.insert = "INSERT"
|
||||
mode.select = "SELECT"
|
||||
diagnostics = ["warning", "error"]
|
||||
workspace-diagnostics = ["warning", "error"]
|
||||
```
|
||||
The `[editor.statusline]` key takes the following sub-keys:
|
||||
|
||||
|
@ -116,6 +118,8 @@ The `[editor.statusline]` key takes the following sub-keys:
|
|||
| `mode.normal` | The text shown in the `mode` element for normal mode | `"NOR"` |
|
||||
| `mode.insert` | The text shown in the `mode` element for insert mode | `"INS"` |
|
||||
| `mode.select` | The text shown in the `mode` element for select mode | `"SEL"` |
|
||||
| `diagnostics` | A list of severities which are displayed for the current buffer | `["warning", "error"]` |
|
||||
| `workspace-diagnostics` | A list of severities which are displayed for the workspace | `["warning", "error"]` |
|
||||
|
||||
The following statusline elements can be configured:
|
||||
|
||||
|
|
|
@ -226,21 +226,41 @@ fn render_diagnostics<F>(context: &mut RenderContext, write: F)
|
|||
where
|
||||
F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
|
||||
{
|
||||
let (warnings, errors) = context
|
||||
use helix_core::diagnostic::Severity;
|
||||
let (hints, info, warnings, errors) =
|
||||
context
|
||||
.doc
|
||||
.diagnostics()
|
||||
.iter()
|
||||
.fold((0, 0), |mut counts, diag| {
|
||||
use helix_core::diagnostic::Severity;
|
||||
.fold((0, 0, 0, 0), |mut counts, diag| {
|
||||
match diag.severity {
|
||||
Some(Severity::Warning) => counts.0 += 1,
|
||||
Some(Severity::Error) | None => counts.1 += 1,
|
||||
_ => {}
|
||||
Some(Severity::Hint) | None => counts.0 += 1,
|
||||
Some(Severity::Info) => counts.1 += 1,
|
||||
Some(Severity::Warning) => counts.2 += 1,
|
||||
Some(Severity::Error) => counts.3 += 1,
|
||||
}
|
||||
counts
|
||||
});
|
||||
|
||||
if warnings > 0 {
|
||||
for sev in &context.editor.config().statusline.diagnostics {
|
||||
match sev {
|
||||
Severity::Hint if hints > 0 => {
|
||||
write(
|
||||
context,
|
||||
"●".to_string(),
|
||||
Some(context.editor.theme.get("hint")),
|
||||
);
|
||||
write(context, format!(" {} ", hints), None);
|
||||
}
|
||||
Severity::Info if info > 0 => {
|
||||
write(
|
||||
context,
|
||||
"●".to_string(),
|
||||
Some(context.editor.theme.get("info")),
|
||||
);
|
||||
write(context, format!(" {} ", info), None);
|
||||
}
|
||||
Severity::Warning if warnings > 0 => {
|
||||
write(
|
||||
context,
|
||||
"●".to_string(),
|
||||
|
@ -248,8 +268,7 @@ where
|
|||
);
|
||||
write(context, format!(" {} ", warnings), None);
|
||||
}
|
||||
|
||||
if errors > 0 {
|
||||
Severity::Error if errors > 0 => {
|
||||
write(
|
||||
context,
|
||||
"●".to_string(),
|
||||
|
@ -257,32 +276,53 @@ where
|
|||
);
|
||||
write(context, format!(" {} ", errors), None);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn render_workspace_diagnostics<F>(context: &mut RenderContext, write: F)
|
||||
where
|
||||
F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
|
||||
{
|
||||
let (warnings, errors) =
|
||||
context
|
||||
.editor
|
||||
.diagnostics
|
||||
.values()
|
||||
.flatten()
|
||||
.fold((0, 0), |mut counts, (diag, _)| {
|
||||
use helix_core::diagnostic::Severity;
|
||||
let (hints, info, warnings, errors) = context.editor.diagnostics.values().flatten().fold(
|
||||
(0, 0, 0, 0),
|
||||
|mut counts, (diag, _)| {
|
||||
match diag.severity {
|
||||
Some(DiagnosticSeverity::WARNING) => counts.0 += 1,
|
||||
Some(DiagnosticSeverity::ERROR) | None => counts.1 += 1,
|
||||
Some(DiagnosticSeverity::HINT) | None => counts.0 += 1,
|
||||
Some(DiagnosticSeverity::INFORMATION) => counts.1 += 1,
|
||||
Some(DiagnosticSeverity::WARNING) => counts.2 += 1,
|
||||
Some(DiagnosticSeverity::ERROR) => counts.3 += 1,
|
||||
_ => {}
|
||||
}
|
||||
counts
|
||||
});
|
||||
},
|
||||
);
|
||||
|
||||
if warnings > 0 || errors > 0 {
|
||||
if hints > 0 || info > 0 || warnings > 0 || errors > 0 {
|
||||
write(context, " W ".into(), None);
|
||||
}
|
||||
|
||||
if warnings > 0 {
|
||||
for sev in &context.editor.config().statusline.workspace_diagnostics {
|
||||
match sev {
|
||||
Severity::Hint if hints > 0 => {
|
||||
write(
|
||||
context,
|
||||
"●".to_string(),
|
||||
Some(context.editor.theme.get("hint")),
|
||||
);
|
||||
write(context, format!(" {} ", hints), None);
|
||||
}
|
||||
Severity::Info if info > 0 => {
|
||||
write(
|
||||
context,
|
||||
"●".to_string(),
|
||||
Some(context.editor.theme.get("info")),
|
||||
);
|
||||
write(context, format!(" {} ", info), None);
|
||||
}
|
||||
Severity::Warning if warnings > 0 => {
|
||||
write(
|
||||
context,
|
||||
"●".to_string(),
|
||||
|
@ -290,8 +330,7 @@ where
|
|||
);
|
||||
write(context, format!(" {} ", warnings), None);
|
||||
}
|
||||
|
||||
if errors > 0 {
|
||||
Severity::Error if errors > 0 => {
|
||||
write(
|
||||
context,
|
||||
"●".to_string(),
|
||||
|
@ -299,6 +338,9 @@ where
|
|||
);
|
||||
write(context, format!(" {} ", errors), None);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn render_selections<F>(context: &mut RenderContext, write: F)
|
||||
|
|
|
@ -497,6 +497,8 @@ pub struct StatusLineConfig {
|
|||
pub right: Vec<StatusLineElement>,
|
||||
pub separator: String,
|
||||
pub mode: ModeConfig,
|
||||
pub diagnostics: Vec<Severity>,
|
||||
pub workspace_diagnostics: Vec<Severity>,
|
||||
}
|
||||
|
||||
impl Default for StatusLineConfig {
|
||||
|
@ -521,6 +523,8 @@ impl Default for StatusLineConfig {
|
|||
],
|
||||
separator: String::from("│"),
|
||||
mode: ModeConfig::default(),
|
||||
diagnostics: vec![Severity::Warning, Severity::Error],
|
||||
workspace_diagnostics: vec![Severity::Warning, Severity::Error],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue