instant.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package edit
  2. import (
  3. "src.elv.sh/pkg/cli"
  4. "src.elv.sh/pkg/cli/modes"
  5. "src.elv.sh/pkg/cli/tk"
  6. "src.elv.sh/pkg/eval"
  7. "src.elv.sh/pkg/parse"
  8. )
  9. func initInstant(ed *Editor, ev *eval.Evaler, nb eval.NsBuilder) {
  10. bindingVar := newBindingVar(emptyBindingsMap)
  11. bindings := newMapBindings(ed, ev, bindingVar)
  12. nb.AddNs("-instant",
  13. eval.BuildNsNamed("edit:-instant").
  14. AddVar("binding", bindingVar).
  15. AddGoFns(map[string]any{
  16. "start": func() { instantStart(ed.app, ev, bindings) },
  17. }))
  18. }
  19. func instantStart(app cli.App, ev *eval.Evaler, bindings tk.Bindings) {
  20. execute := func(code string) ([]string, error) {
  21. outPort, collect, err := eval.StringCapturePort()
  22. if err != nil {
  23. return nil, err
  24. }
  25. err = ev.Eval(
  26. parse.Source{Name: "[instant]", Code: code},
  27. eval.EvalCfg{
  28. Ports: []*eval.Port{nil, outPort},
  29. Interrupt: eval.ListenInterrupts})
  30. return collect(), err
  31. }
  32. w, err := modes.NewInstant(app,
  33. modes.InstantSpec{Bindings: bindings, Execute: execute})
  34. if w != nil {
  35. app.PushAddon(w)
  36. app.Redraw()
  37. }
  38. if err != nil {
  39. app.Notify(modes.ErrorText(err))
  40. }
  41. }