From 7fa0685d412caca32b7628e75af9591f5ae5cd7e Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Mon, 13 Apr 2026 08:55:53 -0400 Subject: [PATCH] fix(renderer): restore tab stops if hard tabs are enabled When hard tabs are enabled, we optimize rendering by using actual tab characters instead of spaces. This requires us to set tab stops every 8 columns at the beginning of the rendering process. Fixes: https://github.com/charmbracelet/bubbletea/issues/1614 --- cursed_renderer.go | 17 +++++++++++++++-- .../TestViewModel/altscreen_autoexit.golden | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/cursed_renderer.go b/cursed_renderer.go index f22d94a351..8eaafb23d4 100644 --- a/cursed_renderer.go +++ b/cursed_renderer.go @@ -61,7 +61,11 @@ func (s *cursedRenderer) setOptimizations(hardTabs, backspace, mapnl bool) { s.hardTabs = hardTabs s.backspace = backspace s.mapnl = mapnl - s.scr.SetTabStops(s.width) + if s.hardTabs { + s.scr.SetTabStops(s.width) + } else { + s.scr.SetTabStops(-1) + } s.scr.SetBackspace(s.backspace) s.scr.SetMapNewline(s.mapnl) s.mu.Unlock() @@ -275,6 +279,11 @@ func (s *cursedRenderer) flush(closing bool) error { } } + // Restore tab stops if we have tab optimizations enabled. + if s.starting && s.hardTabs { + _, _ = s.scr.WriteString(ansi.SetTabEvery8Columns) + } + if !s.starting && !closing && s.lastView != nil && viewEquals(s.lastView, &view) && frameArea == s.cellbuf.Bounds() { // No changes, nothing to do. return nil @@ -587,7 +596,11 @@ func reset(s *cursedRenderer) { scr.SetColorProfile(s.profile) scr.SetRelativeCursor(true) // Always start in inline mode scr.SetFullscreen(false) // Always start in inline mode - scr.SetTabStops(s.width) + if s.hardTabs { + scr.SetTabStops(s.width) + } else { + scr.SetTabStops(-1) + } scr.SetBackspace(s.backspace) scr.SetMapNewline(s.mapnl) scr.SetScrollOptim(runtime.GOOS != "windows") // disable scroll optimization on Windows due to bugs in some terminals diff --git a/testdata/TestViewModel/altscreen_autoexit.golden b/testdata/TestViewModel/altscreen_autoexit.golden index 61da636d1f..810564717e 100644 --- a/testdata/TestViewModel/altscreen_autoexit.golden +++ b/testdata/TestViewModel/altscreen_autoexit.golden @@ -1 +1 @@ -[>4m[=0;1u[?1049h[?25l[?2004h[>4;2m[=1;1usuccess[>4m[=0;1u [?1049l[?25h[?2004l[?2026$p[?2027$p \ No newline at end of file +[>4m[=0;1u[?1049h[?25l[?2004h[>4;2m[=1;1usuccess[>4m[=0;1u[?1049l[?25h[?2004l[?2026$p[?2027$p \ No newline at end of file