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 package editor
import ( import (
"strings"
"timshome.page/gilo/fn" "timshome.page/gilo/fn"
"timshome.page/gilo/terminal" "timshome.page/gilo/terminal"
) )
@ -28,47 +27,29 @@ func New() *editor {
} }
func (e *editor) ProcessKeypress() bool { func (e *editor) ProcessKeypress() bool {
var runes []rune var str string
// for ch, size := terminal.ReadKey(); size != 0; ch, size = terminal.ReadKey() { ch, _ := terminal.ReadKey()
for i := 0; i < 4; i++ { if ch == fn.Ctrl('q') {
ch, size := terminal.ReadKey() // Clean up on exit
if size == 0 { terminal.Write(terminal.ClearScreen + terminal.ResetCursor)
break
}
if ch == fn.Ctrl('q') { return false
// 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
}
} }
// terminal.Write("%v", runes) if ch == '\x1b' {
str := string(runes) str = string('\x1b') + parseEscapeSequence()
runes = runes[:0] } else {
str = string(ch)
}
// Escape sequences can be less fun... switch str {
if strings.Contains(str, terminal.EscPrefix) { case keyUp, keyDown, keyLeft, keyRight, keyPageUp, keyPageDown, keyHome, keyEnd:
code := strings.TrimPrefix(str, terminal.EscPrefix) e.moveCursor(str)
return true
switch code { default:
case KeyArrowUp, KeyArrowDown, KeyArrowLeft, KeyArrowRight, KeyPageUp, KeyPageDown: // Do something later
e.moveCursor(code) terminal.Write("Code: %v", str)
runes = runes[:0]
return true
default:
// Do something later
terminal.Write("Code: %v", str)
}
} }
return true return true
@ -76,25 +57,89 @@ func (e *editor) ProcessKeypress() bool {
func (e *editor) moveCursor (key string) { func (e *editor) moveCursor (key string) {
switch key { switch key {
case KeyArrowLeft: case keyLeft:
if e.cursor.x != 0 { if e.cursor.x != 0 {
e.cursor.x -= 1 e.cursor.x -= 1
} }
case KeyArrowRight: case keyRight:
if e.cursor.x != e.screen.Cols-1 { if e.cursor.x != e.screen.Cols-1 {
e.cursor.x += 1 e.cursor.x += 1
} }
case KeyArrowUp: case keyUp:
if e.cursor.y != 0 { if e.cursor.y != 0 {
e.cursor.y -= 1 e.cursor.y -= 1
} }
case KeyArrowDown: case keyDown:
if e.cursor.y != e.screen.Rows-1 { if e.cursor.y != e.screen.Rows-1 {
e.cursor.y += 1 e.cursor.y += 1
} }
case KeyPageUp: case keyPageUp:
e.cursor.y = 0 e.cursor.y = 0
case KeyPageDown: case keyPageDown:
e.cursor.y = e.screen.Rows 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 ( const (
keyUp = '↑' keyUp = "ARROW_UP"
keyDown = '↓' keyDown = "ARROW_DOWN"
keyLeft = '←' keyLeft = "ARROW_LEFT"
keyRight = '→' keyRight = "ARROW_RIGHT"
keyPageUp = '⭱' keyPageUp = "PAGE_UP"
keyPageDown = '⭳' keyPageDown = "PAGE_DOWN"
keyHome = "HOME"
keyEnd = "END"
keyDelete = "DELETE"
) )
var keyMap = map[string]rune{
KeyArrowUp: keyUp,
KeyArrowDown: keyDown,
KeyArrowLeft: keyLeft,
KeyArrowRight: keyRight,
KeyPageUp: keyPageUp,
KeyPageDown: keyPageDown,
}