Break everything again

This commit is contained in:
Timothy Warren 2021-03-30 15:45:13 -04:00
parent e0b348b941
commit b0c6d1b369
2 changed files with 98 additions and 59 deletions

View File

@ -1,7 +1,6 @@
package editor
import (
"strings"
"timshome.page/gilo/fn"
"timshome.page/gilo/terminal"
)
@ -28,47 +27,29 @@ func New() *editor {
}
func (e *editor) ProcessKeypress() bool {
var runes []rune
var str string
// for ch, size := terminal.ReadKey(); size != 0; ch, size = terminal.ReadKey() {
for i := 0; i < 4; i++ {
ch, size := terminal.ReadKey()
if size == 0 {
break
}
ch, _ := terminal.ReadKey()
if ch == fn.Ctrl('q') {
// Clean up on exit
terminal.Write(terminal.ClearScreen + terminal.ResetCursor)
if ch == fn.Ctrl('q') {
// Clean up on exit
terminal.Write(terminal.ClearScreen + terminal.ResetCursor)
return false
}
runes = append(runes, ch)
// Break early for arrow keys
if i == 2 && ch >= 'A' && ch <= 'D' {
break
}
return false
}
// terminal.Write("%v", runes)
str := string(runes)
runes = runes[:0]
if ch == '\x1b' {
str = string('\x1b') + parseEscapeSequence()
} else {
str = string(ch)
}
// Escape sequences can be less fun...
if strings.Contains(str, terminal.EscPrefix) {
code := strings.TrimPrefix(str, terminal.EscPrefix)
switch code {
case KeyArrowUp, KeyArrowDown, KeyArrowLeft, KeyArrowRight, KeyPageUp, KeyPageDown:
e.moveCursor(code)
runes = runes[:0]
return true
default:
// Do something later
terminal.Write("Code: %v", str)
}
switch str {
case keyUp, keyDown, keyLeft, keyRight, keyPageUp, keyPageDown, keyHome, keyEnd:
e.moveCursor(str)
return true
default:
// Do something later
terminal.Write("Code: %v", str)
}
return true
@ -76,25 +57,89 @@ func (e *editor) ProcessKeypress() bool {
func (e *editor) moveCursor (key string) {
switch key {
case KeyArrowLeft:
case keyLeft:
if e.cursor.x != 0 {
e.cursor.x -= 1
}
case KeyArrowRight:
case keyRight:
if e.cursor.x != e.screen.Cols-1 {
e.cursor.x += 1
}
case KeyArrowUp:
case keyUp:
if e.cursor.y != 0 {
e.cursor.y -= 1
}
case KeyArrowDown:
case keyDown:
if e.cursor.y != e.screen.Rows-1 {
e.cursor.y += 1
}
case KeyPageUp:
case keyPageUp:
e.cursor.y = 0
case KeyPageDown:
case keyPageDown:
e.cursor.y = e.screen.Rows
case keyHome:
e.cursor.x = 0
case keyEnd:
e.cursor.x = e.screen.Cols
}
}
func parseEscapeSequence () string {
var runes []rune
for i := 0; i < 3; i++ {
ch, size := terminal.ReadKey()
if size == 0 {
return "\x1b"
}
runes = append(runes, ch)
if i == 1 && runes[1] >= 'A' {
if runes[0] == 'O' {
switch runes[1] {
case 'H':
return keyHome
case 'F':
return keyEnd
}
}
if runes[0] == '[' {
switch runes[1] {
case 'A':
return keyUp
case 'B':
return keyDown
case 'C':
return keyRight
case 'D':
return keyLeft
case 'H':
return keyHome
case 'F':
return keyEnd
}
}
}
if i == 2 && runes[0] == '[' && runes[2] == '~' {
switch runes[1] {
case '1':
return keyHome
case '3':
return keyDelete
case '4':
return keyEnd
case '5':
return keyPageUp
case '6':
return keyPageDown
case '7':
return keyHome
case '8':
return keyEnd
}
}
}
return string('\x1b')
}

View File

@ -18,19 +18,13 @@ const(
// ----------------------------------------------------------------------------
const (
keyUp = '↑'
keyDown = '↓'
keyLeft = '←'
keyRight = '→'
keyPageUp = '⭱'
keyPageDown = '⭳'
)
var keyMap = map[string]rune{
KeyArrowUp: keyUp,
KeyArrowDown: keyDown,
KeyArrowLeft: keyLeft,
KeyArrowRight: keyRight,
KeyPageUp: keyPageUp,
KeyPageDown: keyPageDown,
}
keyUp = "ARROW_UP"
keyDown = "ARROW_DOWN"
keyLeft = "ARROW_LEFT"
keyRight = "ARROW_RIGHT"
keyPageUp = "PAGE_UP"
keyPageDown = "PAGE_DOWN"
keyHome = "HOME"
keyEnd = "END"
keyDelete = "DELETE"
)