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  }