Unnamed repository; edit this file 'description' to name the repository.
feat(config): add `[workspace-]diagnostics` fields to statusline (#13288)
| -rw-r--r-- | book/src/editor.md | 4 | ||||
| -rw-r--r-- | helix-term/src/ui/statusline.rs | 162 | ||||
| -rw-r--r-- | helix-view/src/editor.rs | 4 |
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], } } } |