diff --git a/internal/console/console.go b/internal/console/console.go index f3e0026..e1a3b4a 100644 --- a/internal/console/console.go +++ b/internal/console/console.go @@ -39,7 +39,7 @@ func HomeCursor() { } func MoveCursor(x, y int) { - fmt.Printf("\x1b[%d;%dH", y, x) + fmt.Printf("\x1b[%d;%dH", y + 1, x + 1) } func HideCursor() { diff --git a/internal/editor/editor.go b/internal/editor/editor.go index 0177c7e..7673807 100644 --- a/internal/editor/editor.go +++ b/internal/editor/editor.go @@ -4,6 +4,14 @@ import ( "strings" "tea.kareha.org/lab/levi/internal/console" + "tea.kareha.org/lab/levi/internal/util" +) + +type mode int + +const ( + modeCommand = iota + modeInsert ) type Editor struct { @@ -11,6 +19,7 @@ type Editor struct { kb *Keyboard x, y int line *strings.Builder + mode mode } func New() *Editor { @@ -23,6 +32,7 @@ func New() *Editor { x: 0, y: 0, line: new(strings.Builder), + mode: modeCommand, } } @@ -30,26 +40,57 @@ func (ed *Editor) addRune(r rune) { ed.line.WriteRune(r) } -func (ed *Editor) draw() { +func (ed *Editor) drawStatus() { + _, h := console.Size() + + console.MoveCursor(0, h - 2) + switch ed.mode { + case modeCommand: + console.Print("-- [command] q: quit, i: insert --") + case modeInsert: + console.Print("-- [insert] Esc: command mode --") + } +} + +func (ed *Editor) drawBuffer() { + console.Print(ed.line.String()) +} + +func (ed *Editor) repaint() { + console.HideCursor() + console.Clear() console.HomeCursor() - console.Print("Hit Esc to Exit") + ed.drawBuffer() + ed.drawStatus() console.MoveCursor(ed.x, ed.y) - console.Print(ed.line.String()) + + console.ShowCursor() } func (ed *Editor) Main() { for { - console.HideCursor() - ed.draw() - console.ShowCursor() + ed.repaint() r := ed.kb.ReadRune() - if r == Esc { - break + switch ed.mode { + case modeCommand: + switch r { + case 'q': + return + case 'i': + ed.mode = modeInsert + } + case modeInsert: + switch r { + case Esc: + ed.mode = modeCommand + default: + ed.addRune(r) + ed.x += util.RuneWidth(r) + } } - ed.addRune(r) } }