84 lines
1.8 KiB
Go
84 lines
1.8 KiB
Go
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
|
||
|
|
}
|