From d8e82eed499ac040586ec6ccbde92699f1a96890 Mon Sep 17 00:00:00 2001 From: Stephen Broadley Date: Wed, 13 Nov 2024 01:27:31 +0000 Subject: [PATCH] added configuration for diagnostic icons This is to aid accessibility. Some themes are not gread for colourblind people. With this configuration, they can easily change the icons that appear around the editor (gutter, statusbar) to make them easier to distinguish! --- helix-term/src/ui/statusline.rs | 6 ++++-- helix-view/src/annotations/diagnostics.rs | 21 +++++++++++++++++++++ helix-view/src/editor.rs | 4 +++- helix-view/src/gutter.rs | 20 ++++++++++++-------- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/helix-term/src/ui/statusline.rs b/helix-term/src/ui/statusline.rs index 7437cbd07..cc4522d54 100644 --- a/helix-term/src/ui/statusline.rs +++ b/helix-term/src/ui/statusline.rs @@ -240,10 +240,12 @@ where counts }); + let icons = context.editor.config().diagnostic_icons; + if warnings > 0 { write( context, - "●".to_string(), + icons.warning.to_string(), Some(context.editor.theme.get("warning")), ); write(context, format!(" {} ", warnings), None); @@ -252,7 +254,7 @@ where if errors > 0 { write( context, - "●".to_string(), + icons.error.to_string(), Some(context.editor.theme.get("error")), ); write(context, format!(" {} ", errors), None); diff --git a/helix-view/src/annotations/diagnostics.rs b/helix-view/src/annotations/diagnostics.rs index 09085d3fe..9f432d945 100644 --- a/helix-view/src/annotations/diagnostics.rs +++ b/helix-view/src/annotations/diagnostics.rs @@ -13,6 +13,27 @@ pub enum DiagnosticFilter { Enable(Severity), } +/// The icon (character) to use for each [`Diagnostic`] level. +#[derive(Debug, Serialize, Deserialize, Copy, Clone, Eq, PartialEq, PartialOrd, Ord)] +#[serde(default, deny_unknown_fields)] +pub struct DiagnosticIcons { + pub error: char, + pub warning: char, + pub info: char, + pub hint: char, +} + +impl Default for DiagnosticIcons { + fn default() -> Self { + Self { + error: '●', + warning: '●', + info: '●', + hint: '●', + } + } +} + impl<'de> Deserialize<'de> for DiagnosticFilter { fn deserialize(deserializer: D) -> Result where diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 26dea3a21..973c90ec8 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -1,5 +1,5 @@ use crate::{ - annotations::diagnostics::{DiagnosticFilter, InlineDiagnosticsConfig}, + annotations::diagnostics::{DiagnosticFilter, DiagnosticIcons, InlineDiagnosticsConfig}, document::{ DocumentOpenError, DocumentSavedEventFuture, DocumentSavedEventResult, Mode, SavePoint, }, @@ -345,6 +345,7 @@ pub struct Config { /// Display diagnostic below the line they occur. pub inline_diagnostics: InlineDiagnosticsConfig, pub end_of_line_diagnostics: DiagnosticFilter, + pub diagnostic_icons: DiagnosticIcons, } #[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Eq, PartialOrd, Ord)] @@ -982,6 +983,7 @@ impl Default for Config { jump_label_alphabet: ('a'..='z').collect(), inline_diagnostics: InlineDiagnosticsConfig::default(), end_of_line_diagnostics: DiagnosticFilter::Disable, + diagnostic_icons: DiagnosticIcons::default(), } } } diff --git a/helix-view/src/gutter.rs b/helix-view/src/gutter.rs index 36f719f79..946e8fae7 100644 --- a/helix-view/src/gutter.rs +++ b/helix-view/src/gutter.rs @@ -46,16 +46,19 @@ impl GutterType { } pub fn diagnostic<'doc>( - _editor: &'doc Editor, + editor: &'doc Editor, doc: &'doc Document, _view: &View, theme: &Theme, _is_focused: bool, ) -> GutterFn<'doc> { - let warning = theme.get("warning"); - let error = theme.get("error"); - let info = theme.get("info"); - let hint = theme.get("hint"); + let icons = &editor.config().diagnostic_icons; + + let warning = (theme.get("warning"), icons.warning); + let error = (theme.get("error"), icons.error); + let info = (theme.get("info"), icons.info); + let hint = (theme.get("hint"), icons.hint); + let diagnostics = &doc.diagnostics; Box::new( @@ -74,13 +77,14 @@ pub fn diagnostic<'doc>( .any(|ls| ls.id() == d.provider) }); diagnostics_on_line.max_by_key(|d| d.severity).map(|d| { - write!(out, "●").ok(); - match d.severity { + let (style, indicator) = match d.severity { Some(Severity::Error) => error, Some(Severity::Warning) | None => warning, Some(Severity::Info) => info, Some(Severity::Hint) => hint, - } + }; + write!(out, "{}", indicator).ok(); + style }) }, )