github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/edit/minibuf.go (about) 1 package edit 2 3 import ( 4 "github.com/markusbkk/elvish/pkg/cli/modes" 5 "github.com/markusbkk/elvish/pkg/cli/tk" 6 "github.com/markusbkk/elvish/pkg/eval" 7 "github.com/markusbkk/elvish/pkg/parse" 8 ) 9 10 func initMinibuf(ed *Editor, ev *eval.Evaler, nb eval.NsBuilder) { 11 bindingVar := newBindingVar(emptyBindingsMap) 12 bindings := newMapBindings(ed, ev, bindingVar) 13 nb.AddNs("minibuf", 14 eval.BuildNsNamed("edit:minibuf"). 15 AddVar("binding", bindingVar). 16 AddGoFns(map[string]interface{}{ 17 "start": func() { minibufStart(ed, ev, bindings) }, 18 })) 19 } 20 21 func minibufStart(ed *Editor, ev *eval.Evaler, bindings tk.Bindings) { 22 w := tk.NewCodeArea(tk.CodeAreaSpec{ 23 Prompt: modes.Prompt(" MINIBUF ", true), 24 Bindings: bindings, 25 OnSubmit: func() { minibufSubmit(ed, ev) }, 26 // TODO: Add Highlighter. Right now the async highlighter is not 27 // directly usable. 28 }) 29 ed.app.PushAddon(w) 30 ed.app.Redraw() 31 } 32 33 func minibufSubmit(ed *Editor, ev *eval.Evaler) { 34 app := ed.app 35 codeArea, ok := app.ActiveWidget().(tk.CodeArea) 36 if !ok { 37 return 38 } 39 ed.app.PopAddon() 40 code := codeArea.CopyState().Buffer.Content 41 src := parse.Source{Name: "[minibuf]", Code: code} 42 notifyPort, cleanup := makeNotifyPort(ed) 43 defer cleanup() 44 ports := []*eval.Port{eval.DummyInputPort, notifyPort, notifyPort} 45 err := ev.Eval(src, eval.EvalCfg{Ports: ports}) 46 if err != nil { 47 app.Notify(modes.ErrorText(err)) 48 } 49 }