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  }