func (b *Writer) dump() {
	pos := 0
	for i, line := range b.lines {
		print("(", i, ") ")
		for _, c := range line {
			print("[", string(b.buf.Bytes()[pos:pos+c.size]), "]")
			pos += c.size
		}
		print("\n")
	}
	print("\n")
}
debugging support (keep code around)
package tabwriter
import (
	"bytes"
	"io"
	"unicode/utf8"
	"github.com/lunixbochs/vtclean"
)
type cell struct {
	size  int   
	width int   
	htab  bool  
}
type Writer struct {
	output   io.Writer
	minwidth int
	tabwidth int
	padding  int
	padbytes [8]byte
	flags    uint
	buf       bytes.Buffer  
	pos       int           
	cell      cell          
	endChar   byte          
	lines     [][]cell      
	widths    []int         
	alignment map[int]uint  
}
func (b *Writer) addLine() { b.lines = append(b.lines, []cell{}) }
func (b *Writer) reset() {
	b.buf.Reset()
	b.pos = 0
	b.cell = cell{}
	b.endChar = 0
	b.lines = b.lines[0:0]
	b.widths = b.widths[0:0]
	b.alignment = make(map[int]uint)
	b.addLine()
}
const (
	FilterHTML uint = 1 << iota
	StripEscape
	AlignRight
	DiscardEmptyColumns
	TabIndent
	Debug
)
func (b *Writer) Init(output io.Writer, minwidth, tabwidth, padding int, padchar byte, flags uint) *Writer {
	if minwidth < 0 || tabwidth < 0 || padding < 0 {
		panic("negative minwidth, tabwidth, or padding")
	}
	b.output = output
	b.minwidth = minwidth
	b.tabwidth = tabwidth
	b.padding = padding
	for i := range b.padbytes {
		b.padbytes[i] = padchar
	}
	if padchar == '\t' {
		flags &^= AlignRight
	}
	b.flags = flags
	b.reset()
	return b
}