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  }