diff --git a/internal/canvas/buffer/buffer.go b/internal/canvas/buffer/buffer.go index 0256bec..ba8c26b 100644 --- a/internal/canvas/buffer/buffer.go +++ b/internal/canvas/buffer/buffer.go @@ -115,6 +115,11 @@ func (b Buffer) SetCell(p image.Point, r rune, opts ...cell.Option) (int, error) return -1, err } rw := runewidth.RuneWidth(r) + if rw == 0 { + // Even if the rune is invisible, like the zero-value rune, it still + // occupies at least the target cell. + rw = 1 + } if rw > remW { return -1, fmt.Errorf("cannot set rune %q of width %d at point %v, only have %d remaining cells at this line", r, rw, p, remW) } diff --git a/internal/canvas/buffer/buffer_test.go b/internal/canvas/buffer/buffer_test.go index d59f3c6..f0c94da 100644 --- a/internal/canvas/buffer/buffer_test.go +++ b/internal/canvas/buffer/buffer_test.go @@ -411,6 +411,18 @@ func TestSetCell(t *testing.T) { return b }(), }, + { + desc: "sets zero-value rune in a cell", + buffer: mustNew(image.Point{3, 3}), + point: image.Point{1, 2}, + r: 0, + wantCells: 1, + want: func() Buffer { + b := mustNew(size) + b[1][2].Rune = 0 + return b + }(), + }, { desc: "sets cell options", buffer: mustNew(image.Point{3, 3}),