diff --git a/helix-term/src/ui/statusline.rs b/helix-term/src/ui/statusline.rs index ea3d27bd6..9f7099329 100644 --- a/helix-term/src/ui/statusline.rs +++ b/helix-term/src/ui/statusline.rs @@ -68,6 +68,7 @@ pub fn render(context: &mut RenderContext, viewport: Rect, surface: &mut Surface for element_id in &config.statusline.left { let render = get_render_function(*element_id); (render)(context, |context, span| { + let base_style = statusline_style(context, &element_id.to_string()); append(&mut context.parts.left, span, base_style) }); } @@ -84,6 +85,7 @@ pub fn render(context: &mut RenderContext, viewport: Rect, surface: &mut Surface for element_id in &config.statusline.right { let render = get_render_function(*element_id); (render)(context, |context, span| { + let base_style = statusline_style(context, &element_id.to_string()); append(&mut context.parts.right, span, base_style) }) } @@ -103,6 +105,7 @@ pub fn render(context: &mut RenderContext, viewport: Rect, surface: &mut Surface for element_id in &config.statusline.center { let render = get_render_function(*element_id); (render)(context, |context, span| { + let base_style = statusline_style(context, &element_id.to_string()); append(&mut context.parts.center, span, base_style) }) } @@ -161,6 +164,18 @@ where } } +fn statusline_style(context: &RenderContext, scope: &str) -> Style { + let scope = format!("ui.statusline.{scope}"); + let visible = context.focused; + let config = context.editor.config(); + + if visible && config.color_modes { + context.editor.theme.get(&scope) + } else { + Style::default() + } +} + fn render_mode<'a, F>(context: &mut RenderContext<'a>, write: F) where F: Fn(&mut RenderContext<'a>, Span<'a>) + Copy, @@ -522,10 +537,9 @@ fn render_separator<'a, F>(context: &mut RenderContext<'a>, write: F) where F: Fn(&mut RenderContext<'a>, Span<'a>) + Copy, { - let sep = &context.editor.config().statusline.separator; - let style = context.editor.theme.get("ui.statusline.separator"); + let sep = context.editor.config().statusline.separator.clone(); - write(context, Span::styled(sep.to_string(), style)); + write(context, sep.into()); } fn render_spacer<'a, F>(context: &mut RenderContext<'a>, write: F) @@ -561,11 +575,10 @@ fn render_file_indent_style<'a, F>(context: &mut RenderContext<'a>, write: F) where F: Fn(&mut RenderContext<'a>, Span<'a>) + Copy, { - let style = context.doc.indent_style; - + let indent_style = context.doc.indent_style; write( context, - match style { + match indent_style { IndentStyle::Tabs => " tabs ".into(), IndentStyle::Spaces(indent) => { format!(" {} space{} ", indent, if indent == 1 { "" } else { "s" }).into() diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index bc811b88b..59358a2e3 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -27,6 +27,7 @@ use std::{ borrow::Cow, cell::Cell, collections::{BTreeMap, HashMap, HashSet}, + fmt::Display, fs, io::{self, stdin}, num::NonZeroUsize, @@ -620,6 +621,37 @@ pub enum StatusLineElement { Register, } +impl Display for StatusLineElement { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + use StatusLineElement::*; + let element = match self { + Mode => "mode", + Spinner => "spinner", + FileBaseName => "file-base-name", + FileName => "file-name", + FileAbsolutePath => "file-absolute-path", + FileModificationIndicator => "file-modification-indicator", + ReadOnlyIndicator => "read-only-indicator", + FileEncoding => "file-encoding", + FileLineEnding => "file-line-ending", + FileIndentStyle => "file-indent-style", + FileType => "file-type", + Diagnostics => "diagnostics", + WorkspaceDiagnostics => "workspace-diagnostics", + Selections => "selections", + PrimarySelectionLength => "primary-selection-length", + Position => "position", + Separator => "separator", + PositionPercentage => "position-percentage", + TotalLineNumbers => "total-line-numbers", + Spacer => "spacer", + VersionControl => "version-control", + Register => "register", + }; + write!(f, "{element}") + } +} + // Cursor shape is read and used on every rendered frame and so needs // to be fast. Therefore we avoid a hashmap and use an enum indexed array. #[derive(Debug, Clone, PartialEq, Eq)]