Skip to content

Commit d3887c3

Browse files
committed
fix(term): use diff.minus for deletion lines in diff viewer
Lines that exist only in file A (pure-deletion hunks) were colored with diff.plus (green) instead of diff.minus (red). Extract the style dispatch into diff_line_style and dispatch based on DiffSide so each category maps to the correct theme scope: - DiffSide::A, other empty -> diff.minus (deleted from B) - DiffSide::B, other empty -> diff.plus (added in B) - either side, other non-empty -> diff.delta (modified) Covered by a unit test in diff_coloring_tests.
1 parent 7dbb344 commit d3887c3

1 file changed

Lines changed: 68 additions & 5 deletions

File tree

helix-term/src/ui/editor.rs

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ impl EditorView {
133133
style
134134
}
135135
};
136+
let style_deleted = fg_to_bg(theme.get("diff.minus"));
136137
let style_added = fg_to_bg(theme.get("diff.plus"));
137138
let style_modified = fg_to_bg(theme.get("diff.delta"));
138139

@@ -164,11 +165,13 @@ impl EditorView {
164165
}
165166
};
166167
if my_range.contains(&doc_line) {
167-
let style = if other_range.is_empty() {
168-
style_added
169-
} else {
170-
style_modified
171-
};
168+
let style = diff_line_style(
169+
side,
170+
other_range.is_empty(),
171+
style_deleted,
172+
style_added,
173+
style_modified,
174+
);
172175
renderer
173176
.set_style(Rect::new(inner.x, pos.visual_line, inner.width, 1), style);
174177
}
@@ -1847,3 +1850,63 @@ fn canonicalize_key(key: &mut KeyEvent) {
18471850
key.modifiers.remove(KeyModifiers::SHIFT)
18481851
}
18491852
}
1853+
1854+
/// Selects the diff line background style based on which side is being rendered
1855+
/// and whether the opposite side has any content for this hunk.
1856+
fn diff_line_style(
1857+
side: helix_view::diff_session::DiffSide,
1858+
other_range_empty: bool,
1859+
style_deleted: Style,
1860+
style_added: Style,
1861+
style_modified: Style,
1862+
) -> Style {
1863+
if other_range_empty {
1864+
match side {
1865+
helix_view::diff_session::DiffSide::A => style_deleted,
1866+
helix_view::diff_session::DiffSide::B => style_added,
1867+
}
1868+
} else {
1869+
style_modified
1870+
}
1871+
}
1872+
1873+
#[cfg(test)]
1874+
mod diff_coloring_tests {
1875+
use helix_view::{
1876+
diff_session::DiffSide,
1877+
graphics::{Color, Style},
1878+
};
1879+
1880+
use super::diff_line_style;
1881+
1882+
fn mk(r: u8, g: u8, b: u8) -> Style {
1883+
Style::default().bg(Color::Rgb(r, g, b))
1884+
}
1885+
1886+
#[test]
1887+
fn deletion_lines_use_minus_style() {
1888+
let deleted = mk(255, 0, 0); // red
1889+
let added = mk(0, 255, 0); // green
1890+
let modified = mk(255, 165, 0); // orange
1891+
1892+
// pure deletion on A side = red
1893+
assert_eq!(
1894+
diff_line_style(DiffSide::A, true, deleted, added, modified),
1895+
deleted
1896+
);
1897+
// pure addition on B side = green
1898+
assert_eq!(
1899+
diff_line_style(DiffSide::B, true, deleted, added, modified),
1900+
added
1901+
);
1902+
// modifications = orange regardless of side
1903+
assert_eq!(
1904+
diff_line_style(DiffSide::A, false, deleted, added, modified),
1905+
modified
1906+
);
1907+
assert_eq!(
1908+
diff_line_style(DiffSide::B, false, deleted, added, modified),
1909+
modified
1910+
);
1911+
}
1912+
}

0 commit comments

Comments
 (0)