@@ -49,7 +49,8 @@ type DiffView struct {
4949 splitHunks []splitHunk
5050
5151 codeWidth int
52− fullCodeWidth int // with leading symbols
52+ fullCodeWidth int // with leading symbols
53+ extraColOnAfter bool // add extra column on after panel
5354 beforeNumDigits int
5455 afterNumDigits int
5556}
@@ -144,11 +145,16 @@ func (dv *DiffView) String() string {
144145 dv.resizeCodeWidth()
145146 }
146147
148+ style := lipgloss.NewStyle()
149+ if dv.width > 0 {
150+ style = style.MaxWidth(dv.width)
151+ }
152+
147153 switch dv.layout {
148154 case layoutUnified:
149− return dv.renderUnified()
155+ return style.Render(strings.TrimSuffix(dv.renderUnified(), "\n"))
150156 case layoutSplit:
151− return dv.renderSplit()
157+ return style.Render(strings.TrimSuffix(dv.renderSplit(), "\n"))
152158 default:
153159 panic("unknown diffview layout")
154160 }
@@ -268,7 +274,9 @@ func (dv *DiffView) resizeCodeWidth() {
268274 case layoutUnified:
269275 dv.codeWidth = dv.width - fullNumWidth - leadingSymbolsSize
270276 case layoutSplit:
271− dv.codeWidth = (dv.width - fullNumWidth - leadingSymbolsSize*2) / 2
277+ remainingWidth := dv.width - fullNumWidth - leadingSymbolsSize*2
278+ dv.codeWidth = remainingWidth / 2
279+ dv.extraColOnAfter = isOdd(remainingWidth)
272280 }
273281
274282 dv.fullCodeWidth = dv.codeWidth + leadingSymbolsSize
@@ -340,7 +348,7 @@ func (dv *DiffView) renderSplit() string {
340348 if dv.lineNumbers {
341349 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", dv.afterNumDigits)))
342350 }
343− b.WriteString(dv.style.DividerLine.Code.Width(dv.fullCodeWidth).Render(" "))
351+ b.WriteString(dv.style.DividerLine.Code.Width(dv.fullCodeWidth + btoi(dv.extraColOnAfter)).Render(" "))
344352 b.WriteRune('\n')
345353
346354 beforeLine := h.fromLine
@@ -355,7 +363,7 @@ func (dv *DiffView) renderSplit() string {
355363 }
356364 if l.after != nil {
357365 afterContent = strings.TrimSuffix(l.after.Content, "\n")
358− afterContent = ansi.Truncate(afterContent, dv.codeWidth, "…")
366+ afterContent = ansi.Truncate(afterContent, dv.codeWidth+btoi(dv.extraColOnAfter), "…")
359367 }
360368
361369 switch {
@@ -384,19 +392,19 @@ func (dv *DiffView) renderSplit() string {
384392 if dv.lineNumbers {
385393 b.WriteString(dv.style.MissingLine.LineNumber.Render(pad(" ", dv.afterNumDigits)))
386394 }
387− b.WriteString(dv.style.MissingLine.Code.Width(dv.fullCodeWidth).Render(" "))
395+ b.WriteString(dv.style.MissingLine.Code.Width(dv.fullCodeWidth + btoi(dv.extraColOnAfter)).Render(" "))
388396 case l.after.Kind == udiff.Equal:
389397 if dv.lineNumbers {
390398 b.WriteString(dv.style.EqualLine.LineNumber.Render(pad(afterLine, dv.afterNumDigits)))
391399 }
392− b.WriteString(dv.style.EqualLine.Code.Width(dv.fullCodeWidth).Render(" " + afterContent))
400+ b.WriteString(dv.style.EqualLine.Code.Width(dv.fullCodeWidth + btoi(dv.extraColOnAfter)).Render(" " + afterContent))
393401 afterLine++
394402 case l.after.Kind == udiff.Insert:
395403 if dv.lineNumbers {
396404 b.WriteString(dv.style.InsertLine.LineNumber.Render(pad(afterLine, dv.afterNumDigits)))
397405 }
398406 b.WriteString(dv.style.InsertLine.Symbol.Render("+ "))
399− b.WriteString(dv.style.InsertLine.Code.Width(dv.codeWidth).Render(afterContent))
407+ b.WriteString(dv.style.InsertLine.Code.Width(dv.codeWidth + btoi(dv.extraColOnAfter)).Render(afterContent))
400408 afterLine++
401409 }
402410