indent guides: Fix tab handling (#12249)

Fixes indent guides when using tabs, 
Fixes: #12209, fixes #12210

Release Notes:

- N/A
This commit is contained in:
Bennet Bo Fenner 2024-05-24 18:24:03 +02:00 committed by GitHub
parent 414f97f702
commit af3d7a60c8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 236 additions and 133 deletions

View file

@ -4,7 +4,7 @@ use collections::HashSet;
use gpui::{AppContext, Task};
use language::BufferRow;
use multi_buffer::{MultiBufferIndentGuide, MultiBufferRow};
use text::{BufferId, Point};
use text::{BufferId, LineIndent, Point};
use ui::ViewContext;
use util::ResultExt;
@ -13,7 +13,7 @@ use crate::{DisplaySnapshot, Editor};
struct ActiveIndentedRange {
buffer_id: BufferId,
row_range: Range<BufferRow>,
indent: u32,
indent: LineIndent,
}
#[derive(Default)]
@ -112,7 +112,8 @@ impl Editor {
.enumerate()
.filter(|(_, indent_guide)| {
indent_guide.buffer_id == active_indent_range.buffer_id
&& indent_guide.indent_width() == active_indent_range.indent
&& indent_guide.indent_level()
== active_indent_range.indent.len(indent_guide.tab_size)
});
let mut matches = HashSet::default();
@ -189,19 +190,19 @@ fn should_recalculate_indented_range(
return true;
}
let (old_indent, old_is_blank) = snapshot.line_indent_for_row(prev_row.0);
let (new_indent, new_is_blank) = snapshot.line_indent_for_row(new_row.0);
let old_line_indent = snapshot.line_indent_for_row(prev_row.0);
let new_line_indent = snapshot.line_indent_for_row(new_row.0);
if old_is_blank
|| new_is_blank
|| old_indent != new_indent
if old_line_indent.is_line_empty()
|| new_line_indent.is_line_empty()
|| old_line_indent != new_line_indent
|| snapshot.max_point().row == new_row.0
{
return true;
}
let (next_line_indent, next_line_is_blank) = snapshot.line_indent_for_row(new_row.0 + 1);
next_line_is_blank || next_line_indent != old_indent
let next_line_indent = snapshot.line_indent_for_row(new_row.0 + 1);
next_line_indent.is_line_empty() || next_line_indent != old_line_indent
} else {
true
}