Unnamed repository; edit this file 'description' to name the repository.
feat(config): add `[workspace-]diagnostics` fields to statusline (#13288)
RoloEdits 11 months ago
parent 34aa4d4 · commit d24e4fc
-rw-r--r--book/src/editor.md4
-rw-r--r--helix-term/src/ui/statusline.rs162
-rw-r--r--helix-view/src/editor.rs4
3 files changed, 110 insertions, 60 deletions
diff --git a/book/src/editor.md b/book/src/editor.md
index 1e5c2a50..b7979205 100644
--- a/book/src/editor.md
+++ b/book/src/editor.md
@@ -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:
diff --git a/helix-term/src/ui/statusline.rs b/helix-term/src/ui/statusline.rs
index 7437cbd0..adf01bda 100644
--- a/helix-term/src/ui/statusline.rs
+++ b/helix-term/src/ui/statusline.rs
@@ -226,36 +226,58 @@ fn render_diagnostics<F>(context: &mut RenderContext, write: F)
where
F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
{
- let (warnings, errors) = context
- .doc
- .diagnostics()
- .iter()
- .fold((0, 0), |mut counts, diag| {
- use helix_core::diagnostic::Severity;
- match diag.severity {
- Some(Severity::Warning) => counts.0 += 1,
- Some(Severity::Error) | None => counts.1 += 1,
- _ => {}
- }
- counts
- });
-
- if warnings > 0 {
- write(
- context,
- "●".to_string(),
- Some(context.editor.theme.get("warning")),
- );
- write(context, format!(" {} ", warnings), None);
- }
+ use helix_core::diagnostic::Severity;
+ let (hints, info, warnings, errors) =
+ context
+ .doc
+ .diagnostics()
+ .iter()
+ .fold((0, 0, 0, 0), |mut counts, diag| {
+ match diag.severity {
+ 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 errors > 0 {
- write(
- context,
- "●".to_string(),
- Some(context.editor.theme.get("error")),
- );
- write(context, format!(" {} ", errors), None);
+ 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(),
+ Some(context.editor.theme.get("warning")),
+ );
+ write(context, format!(" {} ", warnings), None);
+ }
+ Severity::Error if errors > 0 => {
+ write(
+ context,
+ "●".to_string(),
+ Some(context.editor.theme.get("error")),
+ );
+ write(context, format!(" {} ", errors), None);
+ }
+ _ => {}
+ }
}
}
@@ -263,41 +285,61 @@ 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, _)| {
- match diag.severity {
- Some(DiagnosticSeverity::WARNING) => counts.0 += 1,
- Some(DiagnosticSeverity::ERROR) | None => counts.1 += 1,
- _ => {}
- }
- counts
- });
+ 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::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 {
- write(
- context,
- "●".to_string(),
- Some(context.editor.theme.get("warning")),
- );
- write(context, format!(" {} ", warnings), None);
- }
-
- if errors > 0 {
- write(
- context,
- "●".to_string(),
- Some(context.editor.theme.get("error")),
- );
- write(context, format!(" {} ", errors), None);
+ 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(),
+ Some(context.editor.theme.get("warning")),
+ );
+ write(context, format!(" {} ", warnings), None);
+ }
+ Severity::Error if errors > 0 => {
+ write(
+ context,
+ "●".to_string(),
+ Some(context.editor.theme.get("error")),
+ );
+ write(context, format!(" {} ", errors), None);
+ }
+ _ => {}
+ }
}
}
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index be221899..eab291e4 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -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],
}
}
}