feat(ui): add nbsp (non-breaking space) to rendered whitespace (#2322)

pull/2352/head
unrelentingtech 3 years ago committed by GitHub
parent e4c2618099
commit 2c60798b00
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -145,7 +145,7 @@ Options for rendering whitespace with visible characters. Use `:set whitespace.r
| Key | Description | Default | | 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"` | | `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` or `newline` | See example below | | `characters` | Literal characters to use when rendering whitespace. Sub-keys may be any of `tab`, `space`, `nbsp` or `newline` | See example below |
Example Example
@ -160,6 +160,7 @@ newline = "none"
[editor.whitespace.characters] [editor.whitespace.characters]
space = "·" space = "·"
nbsp = "⍽"
tab = "→" tab = "→"
newline = "⏎" newline = "⏎"
``` ```

@ -370,6 +370,7 @@ impl EditorView {
" ".repeat(tab_width) " ".repeat(tab_width)
}; };
let space = whitespace.characters.space.to_string(); let space = whitespace.characters.space.to_string();
let nbsp = whitespace.characters.nbsp.to_string();
let newline = if whitespace.render.newline() == WhitespaceRenderValue::All { let newline = if whitespace.render.newline() == WhitespaceRenderValue::All {
whitespace.characters.newline.to_string() whitespace.characters.newline.to_string()
} else { } else {
@ -406,6 +407,14 @@ impl EditorView {
" " " "
}; };
let nbsp = if whitespace.render.nbsp() == WhitespaceRenderValue::All
&& text.len_chars() < end
{
&nbsp
} else {
" "
};
use helix_core::graphemes::{grapheme_width, RopeGraphemes}; use helix_core::graphemes::{grapheme_width, RopeGraphemes};
for grapheme in RopeGraphemes::new(text) { for grapheme in RopeGraphemes::new(text) {
@ -445,6 +454,9 @@ impl EditorView {
} else if grapheme == " " { } else if grapheme == " " {
is_whitespace = true; is_whitespace = true;
(space, 1) (space, 1)
} else if grapheme == "\u{00A0}" {
is_whitespace = true;
(nbsp, 1)
} else { } else {
is_whitespace = false; is_whitespace = false;
// Cow will prevent allocations if span contained in a single slice // Cow will prevent allocations if span contained in a single slice

@ -288,6 +288,7 @@ pub enum WhitespaceRender {
Specific { Specific {
default: Option<WhitespaceRenderValue>, default: Option<WhitespaceRenderValue>,
space: Option<WhitespaceRenderValue>, space: Option<WhitespaceRenderValue>,
nbsp: Option<WhitespaceRenderValue>,
tab: Option<WhitespaceRenderValue>, tab: Option<WhitespaceRenderValue>,
newline: Option<WhitespaceRenderValue>, newline: Option<WhitespaceRenderValue>,
}, },
@ -311,6 +312,14 @@ impl WhitespaceRender {
} }
} }
} }
pub fn nbsp(&self) -> WhitespaceRenderValue {
match *self {
Self::Basic(val) => val,
Self::Specific { default, nbsp, .. } => {
nbsp.or(default).unwrap_or(WhitespaceRenderValue::None)
}
}
}
pub fn tab(&self) -> WhitespaceRenderValue { pub fn tab(&self) -> WhitespaceRenderValue {
match *self { match *self {
Self::Basic(val) => val, Self::Basic(val) => val,
@ -333,6 +342,7 @@ impl WhitespaceRender {
#[serde(default)] #[serde(default)]
pub struct WhitespaceCharacters { pub struct WhitespaceCharacters {
pub space: char, pub space: char,
pub nbsp: char,
pub tab: char, pub tab: char,
pub newline: char, pub newline: char,
} }
@ -341,6 +351,7 @@ impl Default for WhitespaceCharacters {
fn default() -> Self { fn default() -> Self {
Self { Self {
space: '·', // U+00B7 space: '·', // U+00B7
nbsp: '', // U+237D
tab: '', // U+2192 tab: '', // U+2192
newline: '', // U+23CE newline: '', // U+23CE
} }

Loading…
Cancel
Save