package editor import "strings" type row struct { chars []rune render []rune } func newRow(s string) *row { var chars []rune var render []rune for _, ch := range s { chars = append(chars, ch) render = append(render, ch) } return &row {chars, render} } func (r *row) size() int { return len(r.chars) } func (r *row) rSize() int { return len(r.render) } func (r *row) update() { r.render = r.render[:0] replacement := strings.Repeat(" ", KiloTabStop) str := strings.ReplaceAll(string(r.chars), "\t", replacement) for _, ch := range str { r.render = append(r.render, ch) } } func (r *row) cursorXToRenderX (cursorX int) int { renderX := 0 i := 0 for ; i < cursorX; i++ { if r.chars[i] == '\t' { renderX += (KiloTabStop - 1) - (renderX % KiloTabStop) } renderX += 1 } return renderX }