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