7 lua "github.com/yuin/gopher-lua"
8 ulua "github.com/zyedidia/micro/internal/lua"
11 var ErrNoSuchFunction = errors.New("No such function exists")
13 // LoadAllPlugins loads all detected plugins (in runtime/plugins and ConfigDir/plugins)
14 func LoadAllPlugins() error {
16 for _, p := range Plugins {
25 // RunPluginFn runs a given function in all plugins
26 // returns an error if any of the plugins had an error
27 func RunPluginFn(fn string, args ...lua.LValue) error {
29 for _, p := range Plugins {
33 _, err := p.Call(fn, args...)
34 if err != nil && err != ErrNoSuchFunction {
35 reterr = errors.New("Plugin " + p.Name + ": " + err.Error())
41 // RunPluginFnBool runs a function in all plugins and returns
42 // false if any one of them returned false
43 // also returns an error if any of the plugins had an error
44 func RunPluginFnBool(fn string, args ...lua.LValue) (bool, error) {
47 for _, p := range Plugins {
51 val, err := p.Call(fn, args...)
52 if err == ErrNoSuchFunction {
56 reterr = errors.New("Plugin " + p.Name + ": " + err.Error())
59 if v, ok := val.(lua.LBool); !ok {
60 reterr = errors.New(p.Name + "." + fn + " should return a boolean")
62 retbool = retbool && bool(v)
65 return retbool, reterr
69 Name string // name of plugin
70 Info RuntimeFile // json file containing info
71 Srcs []RuntimeFile // lua files
75 func (p *Plugin) IsEnabled() bool {
76 if v, ok := GlobalSettings[p.Name]; ok {
77 return v.(bool) && p.Loaded
84 func (p *Plugin) Load() error {
85 for _, f := range p.Srcs {
86 if v, ok := GlobalSettings[p.Name]; ok && !v.(bool) {
93 err = ulua.LoadFile(p.Name, f.Name(), dat)
98 RegisterGlobalOption(p.Name, true)
103 func (p *Plugin) Call(fn string, args ...lua.LValue) (lua.LValue, error) {
104 plug := ulua.L.GetGlobal(p.Name)
105 log.Println(p.Name, fn, plug)
106 luafn := ulua.L.GetField(plug, fn)
107 if luafn == lua.LNil {
108 return nil, ErrNoSuchFunction
110 err := ulua.L.CallByParam(lua.P{
118 ret := ulua.L.Get(-1)
123 func FindPlugin(name string) *Plugin {
125 for _, p := range Plugins {