diff --git a/editor/editor.go b/editor/editor.go index 7dede1d..b208146 100644 --- a/editor/editor.go +++ b/editor/editor.go @@ -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') } \ No newline at end of file diff --git a/editor/keymap.go b/editor/keymap.go index 74d7495..077223a 100644 --- a/editor/keymap.go +++ b/editor/keymap.go @@ -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, -} \ No newline at end of file + keyUp = "ARROW_UP" + keyDown = "ARROW_DOWN" + keyLeft = "ARROW_LEFT" + keyRight = "ARROW_RIGHT" + keyPageUp = "PAGE_UP" + keyPageDown = "PAGE_DOWN" + keyHome = "HOME" + keyEnd = "END" + keyDelete = "DELETE" +) \ No newline at end of file