Add editor packages

This commit is contained in:
dwrz
2026-10-26 02:32:03 +00:00
parent 38714f6c80
commit 4ed2ee97e0
23 changed files with 2114 additions and 0 deletions
+83
View File
@@ -0,0 +1,83 @@
package editor
import (
"fmt"
"log/slog"
"os"
"sync"
"code.chimeric.al/dwrz/wen/internal/editor/buffer"
"code.chimeric.al/dwrz/wen/internal/editor/canvas"
"code.chimeric.al/dwrz/wen/internal/editor/event"
"code.chimeric.al/dwrz/wen/internal/editor/prompt"
"code.chimeric.al/dwrz/wen/pkg/terminal"
"code.chimeric.al/dwrz/wen/pkg/terminal/input"
)
// TODO: add undo and redo.
// TODO: add search and replace.
type Editor struct {
canvas *canvas.Canvas
input chan *input.Event
log *slog.Logger
events chan event.Event
reader *input.Reader
terminal *terminal.Terminal
tmpdir string
mu sync.Mutex
active *buffer.Buffer
buffers map[string]*buffer.Buffer
prompt *prompt.Prompt
}
type Parameters struct {
In *os.File
Log *slog.Logger
Out *os.File
TempDir string
Terminal *terminal.Terminal
}
// TODO: read text piped in from stdin.
// TODO: pipe buffer texts through shell command.
func New(p Parameters) (*Editor, error) {
var editor = &Editor{
buffers: map[string]*buffer.Buffer{},
events: make(chan event.Event),
input: make(chan *input.Event),
log: p.Log,
terminal: p.Terminal,
tmpdir: p.TempDir,
prompt: prompt.New(prompt.Parameters{Log: p.Log}),
}
// Setup user input.
editor.reader = input.New(input.Parameters{
Chan: editor.input,
In: p.In,
Log: p.Log,
})
// Setup the canvas.
editor.canvas = canvas.New(canvas.Parameters{
Log: p.Log,
Out: p.Out,
Terminal: p.Terminal,
})
// Create the initial scratch buffer.
scratch, err := buffer.Create(buffer.NewBufferParams{
Name: editor.tmpdir + "/scratch",
Log: editor.log,
})
if err != nil {
return nil, fmt.Errorf(
"failed to create scratch buffer: %v", err,
)
}
editor.active = scratch
editor.buffers[scratch.Name()] = scratch
return editor, nil
}