Fix some offset errors for cursor operations
All checks were successful
timw4mail/gilo/pipeline/head This commit looks good

This commit is contained in:
Timothy Warren 2021-03-31 14:32:43 -04:00
parent ae1c91ac74
commit ae65be003c
5 changed files with 51 additions and 20 deletions

View File

@ -5,3 +5,4 @@ package editor
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
const KiloVersion = "0.0.1" const KiloVersion = "0.0.1"
const KiloTabStop = 4

View File

@ -56,14 +56,15 @@ func (e *editor) drawRows(ab *buffer) {
// If the column offset is greater than the length of the row, // If the column offset is greater than the length of the row,
// just display an empty row // just display an empty row
if e.offset.x > rawRow.Size() { if e.offset.x > rawRow.size() {
ab.append("") ab.append("")
continue continue
} }
row := truncateString(string(e.rows[fileRow].chars[e.offset.x:]), e.screen.Cols) rowLen := e.rows[fileRow].rSize() - e.offset.x
ab.append(row) outputRow := truncateString(string(e.rows[fileRow].render[e.offset.x:]), rowLen)
ab.append(outputRow)
} }
ab.append(terminal.ClearLine) ab.append(terminal.ClearLine)

View File

@ -86,7 +86,7 @@ func (e *editor) ProcessKeypress() bool {
func (e *editor) moveCursor (key string) { func (e *editor) moveCursor (key string) {
var row *row var row *row
if e.cursor.y > len(e.rows) { if e.cursor.y >= len(e.rows) {
row = nil row = nil
} else { } else {
row = e.rows[e.cursor.y] row = e.rows[e.cursor.y]
@ -101,15 +101,15 @@ func (e *editor) moveCursor (key string) {
// Move from beginning of current row to end of previous row // Move from beginning of current row to end of previous row
if e.cursor.y > 0 { if e.cursor.y > 0 {
e.cursor.y -= 1 e.cursor.y -= 1
e.cursor.x = e.rows[e.cursor.y].Size() e.cursor.x = e.rows[e.cursor.y].size()
} }
case keyRight: case keyRight:
if row != nil && e.cursor.x < row.Size() { if row != nil && e.cursor.x < row.size() {
e.cursor.x += 1 e.cursor.x += 1
} }
// Move from end of current line to beginning of next line // Move from end of current line to beginning of next line
if row != nil && e.cursor.x == row.Size() { if row != nil && e.cursor.x == row.size() && e.cursor.y < len(e.rows) - 1 {
e.cursor.y += 1 e.cursor.y += 1
e.cursor.x = 0 e.cursor.x = 0
} }
@ -118,18 +118,28 @@ func (e *editor) moveCursor (key string) {
e.cursor.y -= 1 e.cursor.y -= 1
} }
case keyDown: case keyDown:
if e.cursor.y < len(e.rows) { if e.cursor.y < (len(e.rows) - 1) {
e.cursor.y += 1 e.cursor.y += 1
} }
case keyPageUp: case keyPageUp:
e.cursor.y = 0 if e.cursor.y > e.screen.Rows {
e.cursor.y -= e.screen.Rows
} else {
e.cursor.y = 0
}
case keyPageDown: case keyPageDown:
e.cursor.y = e.screen.Rows if e.cursor.y + e.screen.Rows > len(e.rows) {
e.cursor.y += e.screen.Rows
} else {
e.cursor.y = len(e.rows) - 1
}
case keyHome: case keyHome:
e.cursor.x = 0 e.cursor.x = 0
case keyEnd: case keyEnd:
if row != nil { if row != nil {
e.cursor.x = row.Size() e.cursor.x = row.size()
} }
} }
@ -137,7 +147,7 @@ func (e *editor) moveCursor (key string) {
row = nil row = nil
} else { } else {
row = e.rows[e.cursor.y] row = e.rows[e.cursor.y]
rowLen := row.Size() rowLen := row.size()
// Snap to the end of a shorter line from a longer one // Snap to the end of a shorter line from a longer one
if e.cursor.x > rowLen { if e.cursor.x > rowLen {
@ -147,7 +157,8 @@ func (e *editor) moveCursor (key string) {
} }
func (e *editor) appendRow(s string) { func (e *editor) appendRow(s string) {
newRow := NewRow(s) newRow := newRow(s)
newRow.update()
e.rows = append(e.rows, newRow) e.rows = append(e.rows, newRow)
} }

View File

@ -1,21 +1,39 @@
package editor package editor
import "strings"
type row struct { type row struct {
chars []rune chars []rune
render []rune
} }
func NewRow(s string) *row { func newRow(s string) *row {
var chars []rune var chars []rune
var render []rune
for _, ch := range s { for _, ch := range s {
chars = append(chars, ch) chars = append(chars, ch)
render = append(render, ch)
} }
return &row {chars} return &row {chars, render}
} }
func (r *row) Size() int { func (r *row) size() int {
return len(r.chars) 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)
}
}

View File

@ -4,7 +4,7 @@ import "testing"
func TestNewRow(t *testing.T) { func TestNewRow(t *testing.T) {
str := "abcdefg" str := "abcdefg"
row := NewRow(str) row := newRow(str)
got := string(row.chars) got := string(row.chars)
want := str want := str
@ -16,9 +16,9 @@ func TestNewRow(t *testing.T) {
func TestRowSize(t *testing.T) { func TestRowSize(t *testing.T) {
str := "abcdefg" str := "abcdefg"
row := NewRow(str) row := newRow(str)
got := row.Size() got := row.size()
want := 7 want := 7
if got != want { if got != want {