package edit
import (
)
type mapBindings struct {
nt notifier
ev *eval.Evaler
mapVars []vars.PtrVar
}
func ( notifier, *eval.Evaler, ...vars.PtrVar) tk.Bindings {
return mapBindings{, , }
}
func ( mapBindings) ( tk.Widget, term.Event) bool {
, := .(term.KeyEvent)
if ! {
return false
}
:= make([]bindingsMap, len(.mapVars))
for , := range .mapVars {
[] = .GetRaw().(bindingsMap)
}
:= indexLayeredBindings(ui.Key(), ...)
if == nil {
return false
}
callWithNotifyPorts(.nt, .ev, )
return true
}
func ( ui.Key, ...bindingsMap) eval.Callable {
for , := range {
if .HasKey() {
return .GetKey()
}
}
for , := range {
if .HasKey(ui.Default) {
return .GetKey(ui.Default)
}
}
return nil
}
var bindingSource = parse.Source{Name: "[editor binding]"}
func ( notifier, *eval.Evaler, eval.Callable, ...interface{}) {
, := makeNotifyPort()
defer ()
:= .Call(,
eval.CallCfg{Args: , From: "[editor binding]"},
eval.EvalCfg{Ports: []*eval.Port{nil, , }})
if != nil {
.notifyError("binding", )
}
}
func ( notifier) (*eval.Port, func()) {
:= make(chan interface{})
, , := os.Pipe()
if != nil {
panic()
}
var sync.WaitGroup
.Add(2)
go func() {
for := range {
.notifyf("[value out] %s", vals.Repr(, vals.NoPretty))
}
.Done()
}()
go func() {
:= bufio.NewReader()
for {
, := .ReadString('\n')
if != nil {
if != "" {
.notifyf("[bytes out] %s", )
}
if != io.EOF {
.notifyf("[bytes error] %s", )
}
break
}
.notifyf("[bytes out] %s", [:len()-1])
}
.Close()
.Done()
}()
:= &eval.Port{Chan: , File: }
:= func() {
close()
.Close()
.Wait()
}
return ,
}