Add editor packages
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user