Horizontal scrolling and line end snapping
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
cef024bb30
commit
ae1c91ac74
@ -20,7 +20,7 @@ func (e *editor) RefreshScreen() {
|
|||||||
ab.append(terminal.ResetCursor)
|
ab.append(terminal.ResetCursor)
|
||||||
|
|
||||||
e.drawRows(ab)
|
e.drawRows(ab)
|
||||||
ab.append(terminal.MoveCursor(e.cursor.x, e.cursor.y))
|
ab.append(terminal.MoveCursor(e.cursor.x - e.offset.x, e.cursor.y - e.offset.y))
|
||||||
|
|
||||||
ab.append(terminal.ShowCursor)
|
ab.append(terminal.ShowCursor)
|
||||||
|
|
||||||
@ -35,6 +35,14 @@ func (e *editor) scroll() {
|
|||||||
if e.cursor.y >= e.offset.y + e.screen.Rows {
|
if e.cursor.y >= e.offset.y + e.screen.Rows {
|
||||||
e.offset.y = e.cursor.y - e.screen.Rows + 1
|
e.offset.y = e.cursor.y - e.screen.Rows + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if e.cursor.x < e.offset.x {
|
||||||
|
e.offset.x = e.cursor.x
|
||||||
|
}
|
||||||
|
|
||||||
|
if e.cursor.x >= e.offset.x + e.screen.Cols {
|
||||||
|
e.offset.x = e.cursor.x - e.screen.Cols
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *editor) drawRows(ab *buffer) {
|
func (e *editor) drawRows(ab *buffer) {
|
||||||
@ -44,7 +52,17 @@ func (e *editor) drawRows(ab *buffer) {
|
|||||||
if fileRow >= len(e.rows) {
|
if fileRow >= len(e.rows) {
|
||||||
e.drawPlaceholderRow(y, ab)
|
e.drawPlaceholderRow(y, ab)
|
||||||
} else {
|
} else {
|
||||||
row := truncateString(string(e.rows[fileRow].chars), e.screen.Cols)
|
rawRow := e.rows[fileRow]
|
||||||
|
|
||||||
|
// If the column offset is greater than the length of the row,
|
||||||
|
// just display an empty row
|
||||||
|
if e.offset.x > rawRow.Size() {
|
||||||
|
ab.append("")
|
||||||
|
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
row := truncateString(string(e.rows[fileRow].chars[e.offset.x:]), e.screen.Cols)
|
||||||
ab.append(row)
|
ab.append(row)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,15 +85,34 @@ func (e *editor) ProcessKeypress() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (e *editor) moveCursor (key string) {
|
func (e *editor) moveCursor (key string) {
|
||||||
|
var row *row
|
||||||
|
if e.cursor.y > len(e.rows) {
|
||||||
|
row = nil
|
||||||
|
} else {
|
||||||
|
row = e.rows[e.cursor.y]
|
||||||
|
}
|
||||||
|
|
||||||
switch key {
|
switch key {
|
||||||
case keyLeft:
|
case keyLeft:
|
||||||
if e.cursor.x != 0 {
|
if e.cursor.x != 0 {
|
||||||
e.cursor.x -= 1
|
e.cursor.x -= 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Move from beginning of current row to end of previous row
|
||||||
|
if e.cursor.y > 0 {
|
||||||
|
e.cursor.y -= 1
|
||||||
|
e.cursor.x = e.rows[e.cursor.y].Size()
|
||||||
|
}
|
||||||
case keyRight:
|
case keyRight:
|
||||||
if e.cursor.x != e.screen.Cols-1 {
|
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
|
||||||
|
if row != nil && e.cursor.x == row.Size() {
|
||||||
|
e.cursor.y += 1
|
||||||
|
e.cursor.x = 0
|
||||||
|
}
|
||||||
case keyUp:
|
case keyUp:
|
||||||
if e.cursor.y != 0 {
|
if e.cursor.y != 0 {
|
||||||
e.cursor.y -= 1
|
e.cursor.y -= 1
|
||||||
@ -109,7 +128,21 @@ func (e *editor) moveCursor (key string) {
|
|||||||
case keyHome:
|
case keyHome:
|
||||||
e.cursor.x = 0
|
e.cursor.x = 0
|
||||||
case keyEnd:
|
case keyEnd:
|
||||||
e.cursor.x = e.screen.Cols
|
if row != nil {
|
||||||
|
e.cursor.x = row.Size()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if e.cursor.y > len(e.rows) {
|
||||||
|
row = nil
|
||||||
|
} else {
|
||||||
|
row = e.rows[e.cursor.y]
|
||||||
|
rowLen := row.Size()
|
||||||
|
|
||||||
|
// Snap to the end of a shorter line from a longer one
|
||||||
|
if e.cursor.x > rowLen {
|
||||||
|
e.cursor.x = rowLen
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user