github.com/kolbycrouch/elvish@v0.14.1-0.20210614162631-215b9ac1c423/pkg/edit/minibuf.go (about) 1 package edit 2 3 import ( 4 "src.elv.sh/pkg/cli/mode" 5 "src.elv.sh/pkg/cli/tk" 6 "src.elv.sh/pkg/eval" 7 "src.elv.sh/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.NsBuilder{ 15 "binding": bindingVar, 16 }.AddGoFns("<edit:minibuf>:", map[string]interface{}{ 17 "start": func() { minibufStart(ed, ev, bindings) }, 18 }).Ns()) 19 } 20 21 func minibufStart(ed *Editor, ev *eval.Evaler, bindings tk.Bindings) { 22 w := tk.NewCodeArea(tk.CodeAreaSpec{ 23 Prompt: mode.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.SetAddon(w, false) 30 ed.app.Redraw() 31 } 32 33 func minibufSubmit(ed *Editor, ev *eval.Evaler) { 34 app := ed.app 35 codeArea, ok := app.CopyState().Addon.(tk.CodeArea) 36 if !ok { 37 return 38 } 39 ed.app.SetAddon(nil, false) 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(err.Error()) 48 } 49 }