aboutsummaryrefslogtreecommitdiff
path: root/0013-Add-rainbow-indentation-guides.patch
diff options
context:
space:
mode:
Diffstat (limited to '0013-Add-rainbow-indentation-guides.patch')
-rw-r--r--0013-Add-rainbow-indentation-guides.patch190
1 files changed, 190 insertions, 0 deletions
diff --git a/0013-Add-rainbow-indentation-guides.patch b/0013-Add-rainbow-indentation-guides.patch
new file mode 100644
index 00000000..532b6905
--- /dev/null
+++ b/0013-Add-rainbow-indentation-guides.patch
@@ -0,0 +1,190 @@
+From 35f26da37440f8729982f9ee543a5bb24ad276a2 Mon Sep 17 00:00:00 2001
+From: JJ <git@toki.la>
+Date: Sat, 15 Jul 2023 19:17:27 -0700
+Subject: [PATCH] Add rainbow indentation guides
+
+ref: https://github.com/helix-editor/helix/pull/4493
+---
+ book/src/configuration.md | 12 +++++-----
+ helix-term/src/ui/document.rs | 42 ++++++++++++++++++++++++++---------
+ helix-view/src/editor.rs | 10 +++++++++
+ helix-view/src/theme.rs | 4 ++++
+ 4 files changed, 53 insertions(+), 15 deletions(-)
+
+diff --git a/book/src/configuration.md b/book/src/configuration.md
+index 32a4aac4..6609c30e 100644
+--- a/book/src/configuration.md
++++ b/book/src/configuration.md
+@@ -261,11 +261,12 @@ ### `[editor.indent-guides]` Section
+
+ Options for rendering vertical indent guides.
+
+-| Key | Description | Default |
+-| --- | --- | --- |
+-| `render` | Whether to render indent guides | `false` |
+-| `character` | Literal character to use for rendering the indent guide | `│` |
+-| `skip-levels` | Number of indent levels to skip | `0` |
++| Key | Description | Default |
++| --- | --- | --- |
++| `render` | Whether to render indent indent-guides | `false` |
++| `character` | Literal character to use for rendering the indent guide | `│` |
++| `skip-levels` | Number of indent levels to skip | `0` |
++| `rainbow-option` | Enum to set rainbow indentations. Options: `normal`, `dim` and `none`| `none` |
+
+ Example:
+
+@@ -274,6 +275,7 @@ ### `[editor.indent-guides]` Section
+ render = true
+ character = "╎" # Some characters that work well: "▏", "┆", "┊", "⸽"
+ skip-levels = 1
++rainbow-option = "normal"
+ ```
+
+ ### `[editor.gutters]` Section
+diff --git a/helix-term/src/ui/document.rs b/helix-term/src/ui/document.rs
+index 80da1c54..f406a6f9 100644
+--- a/helix-term/src/ui/document.rs
++++ b/helix-term/src/ui/document.rs
+@@ -7,9 +7,9 @@
+ use helix_core::syntax::HighlightEvent;
+ use helix_core::text_annotations::TextAnnotations;
+ use helix_core::{visual_offset_from_block, Position, RopeSlice};
+-use helix_view::editor::{WhitespaceConfig, WhitespaceRenderValue};
++use helix_view::editor::{RainbowIndentOptions, WhitespaceConfig, WhitespaceRenderValue};
+ use helix_view::graphics::Rect;
+-use helix_view::theme::Style;
++use helix_view::theme::{Modifier, Style};
+ use helix_view::view::ViewPosition;
+ use helix_view::Document;
+ use helix_view::Theme;
+@@ -310,6 +310,8 @@ pub struct TextRenderer<'a> {
+ pub whitespace_style: Style,
+ pub indent_guide_char: String,
+ pub indent_guide_style: Style,
++ pub indent_guide_rainbow: RainbowIndentOptions,
++ pub theme: &'a Theme,
+ pub newline: String,
+ pub nbsp: String,
+ pub space: String,
+@@ -326,7 +328,7 @@ impl<'a> TextRenderer<'a> {
+ pub fn new(
+ surface: &'a mut Surface,
+ doc: &Document,
+- theme: &Theme,
++ theme: &'a Theme,
+ col_offset: usize,
+ viewport: Rect,
+ ) -> TextRenderer<'a> {
+@@ -363,12 +365,19 @@ pub fn new(
+ };
+
+ let text_style = theme.get("ui.text");
++ let basic_style = text_style.patch(
++ theme
++ .try_get("ui.virtual.indent-guide")
++ .unwrap_or_else(|| theme.get("ui.virtual.whitespace")),
++ );
+
+ let indent_width = doc.indent_style.indent_width(tab_width) as u16;
+
+ TextRenderer {
+ surface,
+ indent_guide_char: editor_config.indent_guides.character.into(),
++ indent_guide_rainbow: editor_config.indent_guides.rainbow_option.clone(),
++ theme,
+ newline,
+ nbsp,
+ space,
+@@ -379,11 +388,7 @@ pub fn new(
+ starting_indent: col_offset / indent_width as usize
+ + (col_offset % indent_width as usize != 0) as usize
+ + editor_config.indent_guides.skip_levels as usize,
+- indent_guide_style: text_style.patch(
+- theme
+- .try_get("ui.virtual.indent-guide")
+- .unwrap_or_else(|| theme.get("ui.virtual.whitespace")),
+- ),
++ indent_guide_style: basic_style,
+ text_style,
+ draw_indent_guides: editor_config.indent_guides.render,
+ viewport,
+@@ -477,8 +482,25 @@ pub fn draw_indent_guides(&mut self, indent_level: usize, row: u16) {
+ as u16;
+ let y = self.viewport.y + row;
+ debug_assert!(self.surface.in_bounds(x, y));
+- self.surface
+- .set_string(x, y, &self.indent_guide_char, self.indent_guide_style);
++ match self.indent_guide_rainbow {
++ RainbowIndentOptions::None => {
++ self.surface
++ .set_string(x, y, &self.indent_guide_char, self.indent_guide_style)
++ }
++ RainbowIndentOptions::Dim => {
++ let new_style = self
++ .indent_guide_style
++ .patch(self.theme.get_rainbow(i))
++ .add_modifier(Modifier::DIM);
++ self.surface
++ .set_string(x, y, &self.indent_guide_char, new_style);
++ }
++ RainbowIndentOptions::Normal => {
++ let new_style = self.indent_guide_style.patch(self.theme.get_rainbow(i));
++ self.surface
++ .set_string(x, y, &self.indent_guide_char, new_style);
++ }
++ };
+ }
+ }
+ }
+diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
+index c0410f7d..543c7bde 100644
+--- a/helix-view/src/editor.rs
++++ b/helix-view/src/editor.rs
+@@ -743,12 +743,21 @@ fn default() -> Self {
+ }
+ }
+
++#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
++#[serde(rename_all = "kebab-case")]
++pub enum RainbowIndentOptions {
++ None,
++ Dim,
++ Normal,
++}
++
+ #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+ #[serde(default, rename_all = "kebab-case")]
+ pub struct IndentGuidesConfig {
+ pub render: bool,
+ pub character: char,
+ pub skip_levels: u8,
++ pub rainbow_option: RainbowIndentOptions,
+ }
+
+ impl Default for IndentGuidesConfig {
+@@ -757,6 +766,7 @@ fn default() -> Self {
+ skip_levels: 0,
+ render: false,
+ character: '│',
++ rainbow_option: RainbowIndentOptions::None,
+ }
+ }
+ }
+diff --git a/helix-view/src/theme.rs b/helix-view/src/theme.rs
+index 2b024384..25b0f197 100644
+--- a/helix-view/src/theme.rs
++++ b/helix-view/src/theme.rs
+@@ -378,6 +378,10 @@ pub fn is_16_color(&self) -> bool {
+ pub fn rainbow_length(&self) -> usize {
+ self.rainbow_length
+ }
++
++ pub fn get_rainbow(&self, index: usize) -> Style {
++ self.highlights[index % self.rainbow_length]
++ }
+ }
+
+ fn default_rainbow() -> Vec<Style> {
+--
+2.41.0
+