// makeModule builds a module from an Editor. func makeModule(ed *Editor) eval.Namespace { ns := eval.Namespace{} // Populate builtins. for _, b := range builtins { ns[eval.FnPrefix+b.name] = eval.NewPtrVariable(&EditBuiltin{b, ed}) } // Populate binding tables in the variable $binding. // TODO Make binding specific to the Editor. binding := map[eval.Value]eval.Value{ eval.String("insert"): BindingTable{keyBindings[modeInsert]}, eval.String("command"): BindingTable{keyBindings[modeCommand]}, eval.String("completion"): BindingTable{keyBindings[modeCompletion]}, eval.String("navigation"): BindingTable{keyBindings[modeNavigation]}, eval.String("history"): BindingTable{keyBindings[modeHistory]}, } ns["binding"] = eval.NewPtrVariable(eval.NewMap(binding)) return ns }
// makeModule builds a module from an Editor. func makeModule(ed *Editor) eval.Namespace { ns := eval.Namespace{} // Populate builtins. for _, b := range builtins { ns[eval.FnPrefix+b.name] = eval.NewPtrVariable(b) } // Populate binding tables in the variable $binding. // TODO Make binding specific to the Editor. binding := &eval.Struct{ []string{"insert", "command", "completion", "navigation", "history"}, []eval.Variable{ eval.NewRoVariable(BindingTable{keyBindings[modeInsert]}), eval.NewRoVariable(BindingTable{keyBindings[modeCommand]}), eval.NewRoVariable(BindingTable{keyBindings[modeCompletion]}), eval.NewRoVariable(BindingTable{keyBindings[modeNavigation]}), eval.NewRoVariable(BindingTable{keyBindings[modeHistory]}), }, } ns["binding"] = eval.NewRoVariable(binding) ns["completer"] = eval.NewRoVariable(CompleterTable(argCompleter)) ns[eval.FnPrefix+"complete-getopt"] = eval.NewRoVariable( // XXX Repr is "&le:complete-getopt" instead of "le:&complete-getopt" &eval.BuiltinFn{"le:complete-getopt", eval.WrapFn(complGetopt)}) ns[eval.FnPrefix+"complete-files"] = eval.NewRoVariable( &eval.BuiltinFn{"le:complete-filename", eval.WrapFn(complFilenameFn)}) ns["prompt"] = ed.ps1 ns["rprompt"] = ed.rps1 ns["rprompt-persistent"] = BoolExposer{&ed.rpromptPersistent} ns["history"] = eval.NewRoVariable(History{&ed.historyMutex, ed.store}) ns["current-command"] = eval.MakeVariableFromCallback( func(v eval.Value) { if !ed.active { throw(ErrEditorInactive) } if s, ok := v.(eval.String); ok { ed.line = string(s) ed.dot = len(ed.line) } else { throw(errMustBeString) } }, func() eval.Value { return eval.String(ed.line) }, ) ns["selected-file"] = eval.MakeRoVariableFromCallback( func() eval.Value { if !ed.active { throw(ErrEditorInactive) } if ed.mode.Mode() != modeNavigation { throw(errNotNav) } return eval.String(ed.navigation.current.selectedName()) }, ) ns["abbr"] = eval.NewRoVariable(eval.MapStringString(ed.abbreviations)) ns["before-readline"] = ed.beforeReadLine ns["after-readline"] = ed.afterReadLine ns[eval.FnPrefix+"styled"] = eval.NewRoVariable(&eval.BuiltinFn{"le:styled", eval.WrapFn(styledBuiltin)}) return ns }