6 lua "github.com/yuin/gopher-lua"
7 ulua "github.com/zyedidia/micro/internal/lua"
10 var ErrNoSuchFunction = errors.New("No such function exists")
12 // LoadAllPlugins loads all detected plugins (in runtime/plugins and ConfigDir/plugins)
13 func LoadAllPlugins() error {
15 for _, p := range Plugins {
24 // RunPluginFn runs a given function in all plugins
25 // returns an error if any of the plugins had an error
26 func RunPluginFn(fn string, args ...lua.LValue) error {
28 for _, p := range Plugins {
32 _, err := p.Call(fn, args...)
33 if err != nil && err != ErrNoSuchFunction {
34 reterr = errors.New("Plugin " + p.Name + ": " + err.Error())
40 // RunPluginFnBool runs a function in all plugins and returns
41 // false if any one of them returned false
42 // also returns an error if any of the plugins had an error
43 func RunPluginFnBool(fn string, args ...lua.LValue) (bool, error) {
46 for _, p := range Plugins {
50 val, err := p.Call(fn, args...)
51 if err == ErrNoSuchFunction {
55 reterr = errors.New("Plugin " + p.Name + ": " + err.Error())
58 if v, ok := val.(lua.LBool); !ok {
59 reterr = errors.New(p.Name + "." + fn + " should return a boolean")
61 retbool = retbool && bool(v)
64 return retbool, reterr
68 DirName string // name of plugin folder
69 Name string // name of plugin
70 Info *PluginInfo // json file containing info
71 Srcs []RuntimeFile // lua files
73 Default bool // pre-installed plugin
76 func (p *Plugin) IsEnabled() bool {
77 if v, ok := GlobalSettings[p.Name]; ok {
78 return v.(bool) && p.Loaded
85 func (p *Plugin) Load() error {
86 for _, f := range p.Srcs {
87 if v, ok := GlobalSettings[p.Name]; ok && !v.(bool) {
94 err = ulua.LoadFile(p.Name, f.Name(), dat)
99 RegisterGlobalOption(p.Name, true)
104 func (p *Plugin) Call(fn string, args ...lua.LValue) (lua.LValue, error) {
105 plug := ulua.L.GetGlobal(p.Name)
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 {