style: fill diff gaps with adjacent slash stripes

This commit is contained in:
2026-10-11 01:31:48 +02:00
parent 1611af2901
commit de47bf6370
2 changed files with 5 additions and 13 deletions
+1 -1
View File
@@ -217,7 +217,7 @@ File rows show colored **A** (added, green), **M** (modified, yellow), **D** (re
Changed text rows use muted red backgrounds in Before and muted green backgrounds in After, including blank tails and real empty lines. Foreground colors use the editor's bundled Tree-sitter syntax highlighting, parsed independently for each snapshot and its path (including the old path for renames). Unknown languages retain the normal foreground; historical snapshots do not borrow live-buffer LSP tokens. Changed text rows use muted red backgrounds in Before and muted green backgrounds in After, including blank tails and real empty lines. Foreground colors use the editor's bundled Tree-sitter syntax highlighting, parsed independently for each snapshot and its path (including the old path for renames). Unknown languages retain the normal foreground; historical snapshots do not borrow live-buffer LSP tokens.
Missing counterparts use muted `/` stripes on the normal terminal background instead of blank rows, with one space between slashes. Each successive aligned row shifts the stripes one column left, forming continuous diagonals; the phase follows aligned row and horizontal offset so scrolling does not restart the pattern. Actual empty source lines retain their normal/change background and are not hatched. Missing counterparts use adjacent muted `/` stripes on the normal terminal background instead of blank rows, with a slash in every column. The dense pattern stays continuous while scrolling. Actual empty source lines retain their normal/change background and are not hatched.
Tab/Shift+Tab cycles focus between Files, Before, and After. In text panes, Up/Down or Ctrl+j/k scrolls both panes together; Left/Right or Ctrl+h/l scrolls the focused pane horizontally. Home/End goes to the first/last tree row or aligned text row. Wheel input over a text pane scrolls both panes; over Files it navigates visible tree rows without opening them. Esc first leaves filtering when the tree is focused; otherwise it closes the diff and preserves the editor's buffers, cursors, unsaved text, and undo history. Typing and pasted text cannot edit either snapshot. Tab/Shift+Tab cycles focus between Files, Before, and After. In text panes, Up/Down or Ctrl+j/k scrolls both panes together; Left/Right or Ctrl+h/l scrolls the focused pane horizontally. Home/End goes to the first/last tree row or aligned text row. Wheel input over a text pane scrolls both panes; over Files it navigates visible tree rows without opening them. Esc first leaves filtering when the tree is focused; otherwise it closes the diff and preserves the editor's buffers, cursors, unsaved text, and undo history. Typing and pasted text cannot edit either snapshot.
+4 -12
View File
@@ -1296,9 +1296,8 @@ fn draw_diff_pane(
let style = Style::default().fg(Color::Rgb(72, 72, 72)).bg(Color::Reset); let style = Style::default().fg(Color::Rgb(72, 72, 72)).bg(Color::Reset);
let buffer = frame.buffer_mut(); let buffer = frame.buffer_mut();
for x in 0..content.width { for x in 0..content.width {
let slash = (usize::from(x) % 2 + aligned_row % 2 + left % 2) % 2 == 0;
buffer[(content.x + x, row_area.y)] buffer[(content.x + x, row_area.y)]
.set_symbol(if slash { "/" } else { " " }) .set_symbol("/")
.set_style(style); .set_style(style);
} }
continue; continue;
@@ -2568,8 +2567,7 @@ mod tests {
let gap_symbols: Vec<_> = (after.x + 1..after.right() - 1) let gap_symbols: Vec<_> = (after.x + 1..after.right() - 1)
.map(|x| { .map(|x| {
let cell = &buffer[(x, y)]; let cell = &buffer[(x, y)];
let column = x - after.x - 1; assert_eq!(cell.symbol(), "/");
assert_eq!(cell.symbol(), [" ", "/"][usize::from(column % 2)]);
assert_eq!(cell.bg, Color::Reset); assert_eq!(cell.bg, Color::Reset);
assert_eq!(cell.fg, Color::Rgb(72, 72, 72)); assert_eq!(cell.fg, Color::Rgb(72, 72, 72));
cell.symbol().to_owned() cell.symbol().to_owned()
@@ -2618,10 +2616,8 @@ mod tests {
for offset in 0..2 { for offset in 0..2 {
let y = before.y + 1 + offset; let y = before.y + 1 + offset;
for x in before.x + 1..before.right() - 1 { for x in before.x + 1..before.right() - 1 {
let column = x - before.x - 1;
let cell = &buffer[(x, y)]; let cell = &buffer[(x, y)];
let pattern = if offset == 0 { ["/", " "] } else { [" ", "/"] }; assert_eq!(cell.symbol(), "/");
assert_eq!(cell.symbol(), pattern[usize::from(column % 2)]);
assert_eq!(cell.bg, Color::Reset); assert_eq!(cell.bg, Color::Reset);
assert_eq!(cell.fg, Color::Rgb(72, 72, 72)); assert_eq!(cell.fg, Color::Rgb(72, 72, 72));
} }
@@ -2641,11 +2637,7 @@ mod tests {
render_diff(&mut terminal, &diff, &mut panels); render_diff(&mut terminal, &diff, &mut panels);
let buffer = terminal.backend().buffer(); let buffer = terminal.backend().buffer();
for x in before.x + 1..before.right() - 1 { for x in before.x + 1..before.right() - 1 {
let column = x - before.x - 1; assert_eq!(buffer[(x, before.y + 1)].symbol(), "/");
assert_eq!(
buffer[(x, before.y + 1)].symbol(),
["/", " "][usize::from(column % 2)],
);
} }
assert_eq!(buffer[(before.x, before.y + 1)].symbol(), "│"); assert_eq!(buffer[(before.x, before.y + 1)].symbol(), "│");
assert_eq!(buffer[(before.right() - 1, before.y + 1)].symbol(), "│"); assert_eq!(buffer[(before.right() - 1, before.y + 1)].symbol(), "│");