Fix some offset errors for cursor operations
All checks were successful
timw4mail/gilo/pipeline/head This commit looks good
All checks were successful
timw4mail/gilo/pipeline/head This commit looks good
This commit is contained in:
parent
ae1c91ac74
commit
ae65be003c
@ -5,3 +5,4 @@ package editor
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
const KiloVersion = "0.0.1"
|
const KiloVersion = "0.0.1"
|
||||||
|
const KiloTabStop = 4
|
@ -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)
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user