mirror of
https://github.com/helix-editor/helix.git
synced 2024-11-22 09:26:19 +04:00
Make indent guides configurable
This commit is contained in:
parent
924b4ebb39
commit
8ad0b83e30
@ -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 = "╎"
|
||||
```
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user