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