7 lua "github.com/yuin/gopher-lua"
8 ulua "github.com/zyedidia/micro/internal/lua"
11 // ErrNoSuchFunction is returned when Call is executed on a function that does not exist
12 var ErrNoSuchFunction = errors.New("No such function exists")
14 // LoadAllPlugins loads all detected plugins (in runtime/plugins and ConfigDir/plugins)
15 func LoadAllPlugins() error {
17 for _, p := range Plugins {
26 // RunPluginFn runs a given function in all plugins
27 // returns an error if any of the plugins had an error
28 func RunPluginFn(fn string, args ...lua.LValue) error {
30 for _, p := range Plugins {
34 _, err := p.Call(fn, args...)
35 if err != nil && err != ErrNoSuchFunction {
36 reterr = errors.New("Plugin " + p.Name + ": " + err.Error())
42 // RunPluginFnBool runs a function in all plugins and returns
43 // false if any one of them returned false
44 // also returns an error if any of the plugins had an error
45 func RunPluginFnBool(fn string, args ...lua.LValue) (bool, error) {
48 for _, p := range Plugins {
52 val, err := p.Call(fn, args...)
53 if err == ErrNoSuchFunction {
57 reterr = errors.New("Plugin " + p.Name + ": " + err.Error())
60 if v, ok := val.(lua.LBool); ok {
61 retbool = retbool && bool(v)
64 return retbool, reterr
67 // Plugin stores information about the source files/info for a plugin
69 DirName string // name of plugin folder
70 Name string // name of plugin
71 Info *PluginInfo // json file containing info
72 Srcs []RuntimeFile // lua files
74 Default bool // pre-installed plugin
77 // IsEnabled returns if a plugin is enabled
78 func (p *Plugin) IsEnabled() bool {
79 if v, ok := GlobalSettings[p.Name]; ok {
80 return v.(bool) && p.Loaded
85 // Plugins is a list of all detected plugins (enabled or disabled)
88 // Load creates an option for the plugin and runs all source files
89 func (p *Plugin) Load() error {
90 if v, ok := GlobalSettings[p.Name]; ok && !v.(bool) {
93 for _, f := range p.Srcs {
98 err = ulua.LoadFile(p.Name, f.Name(), dat)
104 RegisterGlobalOption(p.Name, true)
108 // Call calls a given function in this plugin
109 func (p *Plugin) Call(fn string, args ...lua.LValue) (lua.LValue, error) {
110 plug := ulua.L.GetGlobal(p.Name)
111 if plug == lua.LNil {
112 log.Println("Plugin does not exist:", p.Name, "at", p.DirName, ":", p)
115 luafn := ulua.L.GetField(plug, fn)
116 if luafn == lua.LNil {
117 return nil, ErrNoSuchFunction
119 err := ulua.L.CallByParam(lua.P{
127 ret := ulua.L.Get(-1)
132 // FindPlugin returns the plugin with the given name
133 func FindPlugin(name string) *Plugin {
135 for _, p := range Plugins {
147 // FindAnyPlugin does not require the plugin to be enabled
148 func FindAnyPlugin(name string) *Plugin {
150 for _, p := range Plugins {