|
3 | 3 | //! Displays git diffs with syntax highlighting for added/removed lines. |
4 | 4 |
|
5 | 5 | use crate::studio::theme; |
6 | | -use crate::studio::utils::truncate_width; |
| 6 | +use crate::studio::utils::{expand_tabs, truncate_width}; |
7 | 7 | use ratatui::Frame; |
8 | 8 | use ratatui::layout::Rect; |
9 | 9 | use ratatui::style::{Modifier, Style}; |
@@ -597,15 +597,17 @@ fn render_diff_line(line: &DiffLine, line_num_width: usize, width: usize) -> Lin |
597 | 597 |
|
598 | 598 | match line.line_type { |
599 | 599 | DiffLineType::FileHeader => { |
600 | | - let content = format!("━━━ {} ", line.content); |
| 600 | + let expanded = expand_tabs(&line.content, 4); |
| 601 | + let content = format!("━━━ {} ", expanded); |
601 | 602 | let truncated = truncate_width(&content, width); |
602 | 603 | Line::from(vec![Span::styled(truncated, style)]) |
603 | 604 | } |
604 | 605 | DiffLineType::HunkHeader => { |
605 | 606 | // " " prefix takes line_num_width * 2 + 3 |
| 607 | + let expanded = expand_tabs(&line.content, 4); |
606 | 608 | let prefix_width = line_num_width * 2 + 4; |
607 | 609 | let max_content = width.saturating_sub(prefix_width); |
608 | | - let truncated = truncate_width(&line.content, max_content); |
| 610 | + let truncated = truncate_width(&expanded, max_content); |
609 | 611 | Line::from(vec![ |
610 | 612 | Span::styled( |
611 | 613 | format!("{:>width$} ", "", width = line_num_width * 2 + 3), |
@@ -636,11 +638,14 @@ fn render_diff_line(line: &DiffLine, line_num_width: usize, width: usize) -> Lin |
636 | 638 | _ => theme::dimmed(), |
637 | 639 | }; |
638 | 640 |
|
| 641 | + // Expand tabs to spaces for proper width calculation and rendering |
| 642 | + let expanded_content = expand_tabs(&line.content, 4); |
| 643 | + |
639 | 644 | // Calculate available width for content |
640 | 645 | // Format: "XXXX │ XXXX +content" |
641 | 646 | let fixed_width = line_num_width * 2 + 6; // " │ " (3) + " " (1) + prefix (1) + padding (1) |
642 | 647 | let max_content = width.saturating_sub(fixed_width); |
643 | | - let truncated = truncate_width(&line.content, max_content); |
| 648 | + let truncated = truncate_width(&expanded_content, max_content); |
644 | 649 |
|
645 | 650 | Line::from(vec![ |
646 | 651 | Span::styled(old_num, theme::dimmed()), |
|
0 commit comments