@@ -137,7 +137,12 @@ func (dv *DiffView) String() string {
137 dv.convertDiffToSplit()
137 dv.convertDiffToSplit()
138 dv.adjustStyles()
138 dv.adjustStyles()
139 dv.detectNumDigits()
139 dv.detectNumDigits()
140− dv.detectCodeWidth()
142+ dv.detectCodeWidth()
144+ dv.resizeCodeWidth()
142 switch dv.layout {
147 switch dv.layout {
143 case layoutUnified:
148 case layoutUnified:
@@ -254,6 +259,21 @@ func (dv *DiffView) detectSplitCodeWidth() {
262+// resizeCodeWidth resizes the code width to fit within the specified width.
263+func (dv *DiffView) resizeCodeWidth() {
264+ fullNumWidth := dv.beforeNumDigits + dv.afterNumDigits
265+ fullNumWidth += lineNumPadding * 4 // left and right padding for both line numbers
269+ dv.codeWidth = dv.width - fullNumWidth - leadingSymbolsSize
271+ dv.codeWidth = (dv.width - fullNumWidth - leadingSymbolsSize*2) / 2
274+ dv.fullCodeWidth = dv.codeWidth + leadingSymbolsSize
257// renderUnified renders the unified diff view as a string.
277// renderUnified renders the unified diff view as a string.
258func (dv *DiffView) renderUnified() string {
278func (dv *DiffView) renderUnified() string {
259 var b strings.Builder
279 var b strings.Builder
@@ -263,7 +283,8 @@ func (dv *DiffView) renderUnified() string {
263 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", dv.beforeNumDigits)))
283 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", dv.beforeNumDigits)))
264 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", dv.afterNumDigits)))
284 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", dv.afterNumDigits)))
286+ content := ansi.Truncate(dv.hunkLineFor(h), dv.fullCodeWidth, "…")
266− b.WriteString(dv.style.DividerLine.Code.Width(dv.fullCodeWidth).Render(dv.hunkLineFor(h)))
287+ b.WriteString(dv.style.DividerLine.Code.Width(dv.fullCodeWidth).Render(content))
267 b.WriteRune('\n')
288 b.WriteRune('\n')
269 beforeLine := h.FromLine
290 beforeLine := h.FromLine
@@ -271,6 +292,7 @@ func (dv *DiffView) renderUnified() string {
272 for _, l := range h.Lines {
293 for _, l := range h.Lines {
273 content := strings.TrimSuffix(l.Content, "\n")
294 content := strings.TrimSuffix(l.Content, "\n")
295+ content = ansi.Truncate(content, dv.codeWidth, "…")
275 switch l.Kind {
297 switch l.Kind {
276 case udiff.Equal:
298 case udiff.Equal:
@@ -313,7 +335,8 @@ func (dv *DiffView) renderSplit() string {
313 if dv.lineNumbers {
335 if dv.lineNumbers {
314 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", dv.beforeNumDigits)))
336 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", dv.beforeNumDigits)))
338+ content := ansi.Truncate(dv.hunkLineFor(dv.unified.Hunks[i]), dv.fullCodeWidth, "…")
316− b.WriteString(dv.style.DividerLine.Code.Width(dv.fullCodeWidth).Render(dv.hunkLineFor(dv.unified.Hunks[i])))
339+ b.WriteString(dv.style.DividerLine.Code.Width(dv.fullCodeWidth).Render(content))
317 if dv.lineNumbers {
340 if dv.lineNumbers {
318 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", dv.afterNumDigits)))
341 b.WriteString(dv.style.DividerLine.LineNumber.Render(pad("…", dv.afterNumDigits)))
@@ -328,9 +351,11 @@ func (dv *DiffView) renderSplit() string {
328 var afterContent string
351 var afterContent string
329 if l.before != nil {
352 if l.before != nil {
330 beforeContent = strings.TrimSuffix(l.before.Content, "\n")
353 beforeContent = strings.TrimSuffix(l.before.Content, "\n")
354+ beforeContent = ansi.Truncate(beforeContent, dv.codeWidth, "…")
332 if l.after != nil {
356 if l.after != nil {
333 afterContent = strings.TrimSuffix(l.after.Content, "\n")
357 afterContent = strings.TrimSuffix(l.after.Content, "\n")
358+ afterContent = ansi.Truncate(afterContent, dv.codeWidth, "…")