From 4acdbe3699336efd105828852da917a81d170fa8 Mon Sep 17 00:00:00 2001 From: Denis Gruzdev Date: Thu, 3 Oct 2024 16:49:15 +0000 Subject: [PATCH] Add `ruler-style` option in addition to `ruler-char` --- book/src/editor.md | 3 ++- helix-term/src/ui/editor.rs | 24 ++++++++++++++---------- helix-view/src/editor.rs | 20 +++++++++++++++++--- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/book/src/editor.md b/book/src/editor.md index 9abeacef3..187d90da4 100644 --- a/book/src/editor.md +++ b/book/src/editor.md @@ -42,7 +42,8 @@ | `true-color` | Set to `true` to override automatic detection of terminal truecolor support in the event of a false negative | `false` | | `undercurl` | Set to `true` to override automatic detection of terminal undercurl support in the event of a false negative | `false` | | `rulers` | List of column positions at which to display the rulers. Can be overridden by language specific `rulers` in `languages.toml` file | `[]` | -| `ruler-char` | Specifies the character used to display the rulers. When unset, the rulers will be indicated by a subtle background or style change, depending on the theme in use | `none` | +| `ruler-style` | `bg` displays the ruler as a background color, while `char` displays the configured `ruler-char` | `bg` | +| `ruler-char` | Specifies the character used to display the rulers when `ruler-style` is `char` | `│` | | `bufferline` | Renders a line at the top of the editor displaying open buffers. Can be `always`, `never` or `multiple` (only shown if more than one buffer is in use) | `never` | | `color-modes` | Whether to color the mode indicator with different colors depending on the mode itself | `false` | | `text-width` | Maximum line length. Used for the `:reflow` command and soft-wrapping if `soft-wrap.wrap-at-text-width` is set | `80` | diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 44a8b7acc..fb7f502e3 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -24,7 +24,7 @@ use helix_core::{ use helix_view::{ annotations::diagnostics::DiagnosticFilter, document::{Mode, SavePoint, SCRATCH_BUFFER_NAME}, - editor::{CompleteAction, CursorShapeConfig}, + editor::{CompleteAction, CursorShapeConfig, RulerStyle}, graphics::{Color, CursorKind, Modifier, Rect, Style}, input::{KeyEvent, MouseButton, MouseEvent, MouseEventKind}, keyboard::{KeyCode, KeyModifiers}, @@ -254,11 +254,12 @@ impl EditorView { theme: &Theme, ) { let editor_rulers = &editor.config().rulers; - let editor_ruler_char = editor.config().ruler_char.map(|c| c.to_string()); + let ruler_style = &editor.config().ruler_style; + let ruler_char = editor.config().ruler_char.to_string(); - let theme_key = match &editor_ruler_char { - None => "ui.virtual.ruler", - Some(_) => "ui.virtual.ruler.char", + let theme_key = match ruler_style { + RulerStyle::Bg => "ui.virtual.ruler", + RulerStyle::Char => "ui.virtual.ruler.char", }; let ruler_theme = theme @@ -280,12 +281,15 @@ impl EditorView { .filter(|ruler| ruler < &viewport.width) .map(|ruler| viewport.clip_left(ruler).with_width(1)) .for_each(|area| { - if let Some(ruler_char) = &editor_ruler_char { - for y in area.y..area.height { - surface.set_string(area.x, y, ruler_char, ruler_theme) + match ruler_style { + RulerStyle::Bg => { + surface.set_style(area, ruler_theme); + } + RulerStyle::Char => { + for y in area.y..area.height { + surface.set_string(area.x, y, &ruler_char, ruler_theme); + } } - } else { - surface.set_style(area, ruler_theme) } }) } diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index fe39af965..ce6f79a96 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -314,8 +314,10 @@ pub struct Config { pub terminal: Option, /// Column numbers at which to draw the rulers. Defaults to `[]`, meaning no rulers. pub rulers: Vec, - /// Character used to draw the rulers when specified. If `None`, rulers are drawn using style only. - pub ruler_char: Option, + /// Set to `bg` to display rulers with background color (default) or `char` to use character from `ruler-char`. + pub ruler_style: RulerStyle, + /// Character used to draw the rulers when specified + pub ruler_char: char, #[serde(default)] pub whitespace: WhitespaceConfig, /// Persistently display open buffers along the top @@ -638,6 +640,17 @@ impl Default for CursorShapeConfig { } } +/// ruler render style +#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum RulerStyle { + /// Render rulers with background color + #[default] + Bg, + /// Render rulers with character from `ruler-char` + Char, +} + /// bufferline render modes #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] @@ -965,7 +978,8 @@ impl Default for Config { lsp: LspConfig::default(), terminal: get_terminal_provider(), rulers: Vec::new(), - ruler_char: None, + ruler_style: RulerStyle::default(), + ruler_char: '│', whitespace: WhitespaceConfig::default(), bufferline: BufferLine::default(), indent_guides: IndentGuidesConfig::default(),