From ed74e6d5d405dd37e067c5fd41e2ae908da22a3c Mon Sep 17 00:00:00 2001 From: A-Walrus <58790821+A-Walrus@users.noreply.github.com> Date: Sun, 21 Aug 2022 07:54:02 +0300 Subject: [PATCH] Switch to `tabpad` configuration option (#3458) Virtual whitespace tabs are created from the `tab` character padded with `tabpad` up to the tab width. --- book/src/configuration.md | 3 ++- helix-term/src/ui/editor.rs | 12 ++++++++---- helix-view/src/editor.rs | 2 ++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/book/src/configuration.md b/book/src/configuration.md index 74474a74d..affd497c7 100644 --- a/book/src/configuration.md +++ b/book/src/configuration.md @@ -192,7 +192,7 @@ Options for rendering whitespace with visible characters. Use `:set whitespace.r | Key | Description | Default | |-----|-------------|---------| | `render` | Whether to render whitespace. May either be `"all"` or `"none"`, or a table with sub-keys `space`, `tab`, and `newline`. | `"none"` | -| `characters` | Literal characters to use when rendering whitespace. Sub-keys may be any of `tab`, `space`, `nbsp` or `newline` | See example below | +| `characters` | Literal characters to use when rendering whitespace. Sub-keys may be any of `tab`, `space`, `nbsp`, `newline` or `tabpad` | See example below | Example @@ -210,6 +210,7 @@ space = "·" nbsp = "⍽" tab = "→" newline = "⏎" +tabpad = "·" # Tabs will look like "→···" (depending on tab width) ``` ### `[editor.indent-guides]` Section diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 401d284eb..438d14121 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -390,19 +390,23 @@ impl EditorView { // of times than it is to always call Rope::slice/get_slice (it will internally always hit RSEnum::Light). let text = doc.text().slice(..); + let characters = &whitespace.characters; + let mut spans = Vec::new(); let mut visual_x = 0u16; let mut line = 0u16; let tab_width = doc.tab_width(); let tab = if whitespace.render.tab() == WhitespaceRenderValue::All { - (1..tab_width).fold(whitespace.characters.tab.to_string(), |s, _| s + " ") + std::iter::once(characters.tab) + .chain(std::iter::repeat(characters.tabpad).take(tab_width - 1)) + .collect() } else { " ".repeat(tab_width) }; - let space = whitespace.characters.space.to_string(); - let nbsp = whitespace.characters.nbsp.to_string(); + let space = characters.space.to_string(); + let nbsp = characters.nbsp.to_string(); let newline = if whitespace.render.newline() == WhitespaceRenderValue::All { - whitespace.characters.newline.to_string() + characters.newline.to_string() } else { " ".to_string() }; diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 1e7f508c1..18c2a343c 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -438,6 +438,7 @@ pub struct WhitespaceCharacters { pub space: char, pub nbsp: char, pub tab: char, + pub tabpad: char, pub newline: char, } @@ -448,6 +449,7 @@ impl Default for WhitespaceCharacters { nbsp: '⍽', // U+237D tab: '→', // U+2192 newline: '⏎', // U+23CE + tabpad: ' ', } } }