Break stuff

This commit is contained in:
Timothy Warren 2021-03-26 12:01:17 -04:00
parent c02206233c
commit 458f94f576
5 changed files with 105 additions and 40 deletions

7
editor/constants.go Normal file
View File

@ -0,0 +1,7 @@
package editor
// ----------------------------------------------------------------------------
// !Constants
// ----------------------------------------------------------------------------
const KiloVersion = "0.0.1"

View File

@ -2,12 +2,11 @@ package editor
import ( import (
"fmt" "fmt"
"strings"
"timshome.page/gilo/fn" "timshome.page/gilo/fn"
"timshome.page/gilo/terminal" "timshome.page/gilo/terminal"
) )
const KiloVersion = "0.0.1"
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// !Editor // !Editor
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -43,26 +42,6 @@ func (e *editor) RefreshScreen() {
terminal.Write(ab.toString()) terminal.Write(ab.toString())
} }
func (e *editor) ProcessKeypress() bool {
ch, _ := terminal.ReadKey()
// Clean up on exit
if ch == fn.Ctrl('q') {
terminal.Write(terminal.ClearScreen + terminal.ResetCursor)
return false
}
switch ch {
case 'w', 'a', 's', 'd':
e.moveCursor(ch)
default:
// Do nothing!
}
return true
}
func (e *editor) drawRows(ab *buffer) { func (e *editor) drawRows(ab *buffer) {
for y :=0; y < e.screen.Rows; y += 1 { for y :=0; y < e.screen.Rows; y += 1 {
if y == e.screen.Rows / 3 { if y == e.screen.Rows / 3 {
@ -95,15 +74,44 @@ func (e *editor) drawRows(ab *buffer) {
} }
} }
func (e *editor) moveCursor (key rune) { func (e *editor) ProcessKeypress() bool {
str, _ := terminal.Read()
// 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:
e.moveCursor(code)
default:
// Do something later
}
}
for _, ch := range str {
// Clean up on exit
if ch == fn.Ctrl('q') {
terminal.Write(terminal.ClearScreen + terminal.ResetCursor)
return false
}
}
return true
}
func (e *editor) moveCursor (rawKey string) {
key := keyMap[rawKey]
switch key { switch key {
case 'a': case keyLeft:
e.cursor.x -= 1 e.cursor.x -= 1
case 'd': case keyRight:
e.cursor.x += 1 e.cursor.x += 1
case 'w': case keyUp:
e.cursor.y -= 1 e.cursor.y -= 1
case 's': case keyDown:
e.cursor.y += 1 e.cursor.y += 1
} }
} }

30
editor/keymap.go Normal file
View File

@ -0,0 +1,30 @@
package editor
// ----------------------------------------------------------------------------
// !Terminal Input Escape Code Sequences
// ----------------------------------------------------------------------------
const(
KeyArrowUp = "A"
KeyArrowDown = "B"
KeyArrowRight = "C"
KeyArrowLeft = "D"
)
// ----------------------------------------------------------------------------
// !Map escape sequences to simpler constants
// ----------------------------------------------------------------------------
const (
keyUp = "ARROW_UP"
keyDown = "ARROW_DOWN"
keyLeft = "ARROW_LEFT"
keyRight = "ARROW_RIGHT"
)
var keyMap = map[string]string{
KeyArrowUp: keyUp,
KeyArrowDown: keyDown,
KeyArrowLeft: keyLeft,
KeyArrowRight: keyRight,
}

View File

@ -3,24 +3,44 @@ package terminal
import "fmt" import "fmt"
const ClearLine = "\x1b[K" // ----------------------------------------------------------------------------
const ClearScreen = "\x1b[2J" // !Terminal Escape Code Sequences
// ----------------------------------------------------------------------------
const HideCursor = "\x1b[?25l" const EscPrefix = "\x1b["
const ShowCursor = "\x1b[?25h"
const ResetCursor = "\x1b[H"
const KeyArrowUp = "\x1b[A"
const KeyArrowDown = "\x1b[B"
const KeyArrowRight = "\x1b[C"
const KeyArrowLeft = "\x1b[D"
const (
// Clears the line after the escape sequence
ClearLine = "\x1b[K"
// Clears the entire screen
ClearScreen = "\x1b[2J"
)
// Cursor Codes
const (
HideCursor = "\x1b[?25l"
ShowCursor = "\x1b[?25h"
// Reports cursor location to stdout
LocateCursor = "\x1b[6n"
// Moves cursor to default position (1,1)
ResetCursor = "\x1b[H"
)
// ----------------------------------------------------------------------------
// !Helpers
// ----------------------------------------------------------------------------
// Add the ANSI escape code prefix to the relevant escape code
func Code (s string) string { func Code (s string) string {
return fmt.Sprintf("\x1b[%s", s) return fmt.Sprintf("%s%s", EscPrefix, s)
} }
// Move the terminal cursor to the 0-based coordinate // Generate the escape sequence to move the terminal cursor to the 0-based coordinate
func MoveCursor(x int, y int) string { func MoveCursor(x int, y int) string {
// Allow 0-based indexing, the terminal code is 1-based // Allow 0-based indexing, the terminal code is 1-based
x += 1 x += 1

View File

@ -33,10 +33,10 @@ func Size () *Screen {
func sizeTrick () (rows int, cols int) { func sizeTrick () (rows int, cols int) {
// Move cursor to location further than likely screen size // Move cursor to location further than likely screen size
// The cursor will move to maximum available position // The cursor will move to maximum available position
fmt.Print("\x1b[999C\x1b[99B") fmt.Print(Code("999C") + Code("999B"))
// Ask the terminal where the cursor is // Ask the terminal where the cursor is
fmt.Print("\x1b[6n") fmt.Print(LocateCursor)
// Read stdin looking for the reported location // Read stdin looking for the reported location
buffer := "" buffer := ""