Make indent guides configurable

This commit is contained in:
Gokul Soumya 2022-05-31 22:43:08 +05:30 committed by Blaž Hrastnik
parent 924b4ebb39
commit 8ad0b83e30
4 changed files with 49 additions and 9 deletions

View File

@ -167,3 +167,20 @@ # or control each character
tab = "→"
newline = "⏎"
```
### `[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 | `│` |
Example:
```toml
[editor.indent-guides]
render = true
character = "╎"
```

View File

@ -131,7 +131,7 @@ pub fn render_view(
surface,
theme,
highlights,
&editor.config().whitespace,
&editor.config(),
);
Self::render_gutter(editor, doc, view, view.area, surface, theme, is_focused);
Self::render_rulers(editor, doc, view, inner, surface, theme);
@ -373,8 +373,9 @@ pub fn render_text_highlights<H: Iterator<Item = HighlightEvent>>(
surface: &mut Surface,
theme: &Theme,
highlights: H,
whitespace: &helix_view::editor::WhitespaceConfig,
config: &helix_view::editor::Config,
) {
let whitespace = &config.whitespace;
use helix_view::editor::WhitespaceRenderValue;
// It's slightly more efficient to produce a full RopeSlice from the Rope, then slice that a bunch
@ -397,22 +398,25 @@ pub fn render_text_highlights<H: Iterator<Item = HighlightEvent>>(
} else {
" ".to_string()
};
let indent_guide_char = config.indent_guides.character.to_string();
let text_style = theme.get("ui.text");
let whitespace_style = theme.get("ui.virtual.whitespace");
let mut is_in_indent_area = true;
let mut last_line_indent_level = 0;
let indent_style = theme
.try_get("ui.virtual.indent-guide")
.unwrap_or_else(|| theme.get("comment"));
let indent_style = theme.get("ui.virtual.indent-guide");
let draw_indent_guides = |indent_level, line, surface: &mut Surface| {
if !config.indent_guides.render {
return;
}
for i in 0..(indent_level / tab_width as u16) {
surface.set_string(
viewport.x + (i * tab_width as u16) - offset.col as u16,
viewport.y + line,
"",
&indent_guide_char,
indent_style,
);
}
@ -491,7 +495,7 @@ pub fn render_text_highlights<H: Iterator<Item = HighlightEvent>>(
let grapheme = Cow::from(grapheme);
let is_whitespace;
let (grapheme, width) = if grapheme == "\t" {
let (display_grapheme, width) = if grapheme == "\t" {
is_whitespace = true;
// make sure we display tab as appropriate amount of spaces
let visual_tab_width = tab_width - (visual_x as usize % tab_width);
@ -518,7 +522,7 @@ pub fn render_text_highlights<H: Iterator<Item = HighlightEvent>>(
surface.set_string(
viewport.x + visual_x - offset.col as u16,
viewport.y + line,
grapheme,
display_grapheme,
if is_whitespace {
style.patch(whitespace_style)
} else {

View File

@ -240,7 +240,7 @@ fn render(&mut self, area: Rect, surface: &mut Surface, cx: &mut Context) {
surface,
&cx.editor.theme,
highlights,
&cx.editor.config().whitespace,
&cx.editor.config(),
);
// highlight the line

View File

@ -156,6 +156,8 @@ pub struct Config {
pub rulers: Vec<u16>,
#[serde(default)]
pub whitespace: WhitespaceConfig,
/// Vertical indent width guides.
pub indent_guides: IndentGuidesConfig,
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
@ -364,6 +366,22 @@ fn default() -> Self {
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct IndentGuidesConfig {
pub render: bool,
pub character: char,
}
impl Default for IndentGuidesConfig {
fn default() -> Self {
Self {
render: false,
character: '',
}
}
}
impl Default for Config {
fn default() -> Self {
Self {
@ -391,6 +409,7 @@ fn default() -> Self {
lsp: LspConfig::default(),
rulers: Vec::new(),
whitespace: WhitespaceConfig::default(),
indent_guides: IndentGuidesConfig::default(),
}
}
}