diff --git a/internal/action/bufpane.go b/internal/action/bufpane.go index f9da9b3a..39433db8 100644 --- a/internal/action/bufpane.go +++ b/internal/action/bufpane.go @@ -306,7 +306,7 @@ func (h *BufPane) ResizePane(size int) { // PluginCB calls all plugin callbacks with a certain name and displays an // error if there is one and returns the aggregrate boolean response func (h *BufPane) PluginCB(cb string) bool { - b, err := config.RunPluginFnBool(cb, luar.New(ulua.L, h)) + b, err := config.RunPluginFnBool(h.Buf.Settings, cb, luar.New(ulua.L, h)) if err != nil { screen.TermMessage(err) } @@ -315,7 +315,7 @@ func (h *BufPane) PluginCB(cb string) bool { // PluginCBRune is the same as PluginCB but also passes a rune to the plugins func (h *BufPane) PluginCBRune(cb string, r rune) bool { - b, err := config.RunPluginFnBool(cb, luar.New(ulua.L, h), luar.New(ulua.L, string(r))) + b, err := config.RunPluginFnBool(h.Buf.Settings, cb, luar.New(ulua.L, h), luar.New(ulua.L, string(r))) if err != nil { screen.TermMessage(err) } diff --git a/internal/buffer/eventhandler.go b/internal/buffer/eventhandler.go index 3862d696..6be34bce 100644 --- a/internal/buffer/eventhandler.go +++ b/internal/buffer/eventhandler.go @@ -237,7 +237,7 @@ func (eh *EventHandler) Execute(t *TextEvent) { } eh.UndoStack.Push(t) - b, err := config.RunPluginFnBool("onBeforeTextEvent", luar.New(ulua.L, eh.buf), luar.New(ulua.L, t)) + b, err := config.RunPluginFnBool(nil, "onBeforeTextEvent", luar.New(ulua.L, eh.buf), luar.New(ulua.L, t)) if err != nil { screen.TermMessage(err) } diff --git a/internal/buffer/settings.go b/internal/buffer/settings.go index 02563e4f..ce9abf3e 100644 --- a/internal/buffer/settings.go +++ b/internal/buffer/settings.go @@ -55,7 +55,26 @@ func (b *Buffer) SetOptionNative(option string, nativeValue interface{}) error { buf.HighlightSearch = nativeValue.(bool) } } - } + } else { + for _, pl := range config.Plugins { + if option == pl.Name { + if nativeValue.(bool) { + if !pl.Loaded { + pl.Load() + } + _, err := pl.Call("init") + if err != nil && err != config.ErrNoSuchFunction { + screen.TermMessage(err) + } + } else if !nativeValue.(bool) && pl.Loaded { + _, err := pl.Call("deinit") + if err != nil && err != config.ErrNoSuchFunction { + screen.TermMessage(err) + } + } + } + } + } if b.OptionCallback != nil { b.OptionCallback(option, nativeValue) diff --git a/internal/config/plugin.go b/internal/config/plugin.go index 2642cfbd..6c5c1541 100644 --- a/internal/config/plugin.go +++ b/internal/config/plugin.go @@ -28,7 +28,7 @@ func LoadAllPlugins() error { func RunPluginFn(fn string, args ...lua.LValue) error { var reterr error for _, p := range Plugins { - if !p.IsEnabled() { + if !p.IsLoaded() { continue } _, err := p.Call(fn, args...) @@ -42,11 +42,11 @@ func RunPluginFn(fn string, args ...lua.LValue) error { // RunPluginFnBool runs a function in all plugins and returns // false if any one of them returned false // also returns an error if any of the plugins had an error -func RunPluginFnBool(fn string, args ...lua.LValue) (bool, error) { +func RunPluginFnBool(settings map[string]interface{}, fn string, args ...lua.LValue) (bool, error) { var reterr error retbool := true for _, p := range Plugins { - if !p.IsEnabled() { + if !p.IsLoaded() || (settings != nil && settings[p.Name] == false) { continue } val, err := p.Call(fn, args...) @@ -71,11 +71,11 @@ type Plugin struct { Info *PluginInfo // json file containing info Srcs []RuntimeFile // lua files Loaded bool - Default bool // pre-installed plugin + Default bool // pre-installed plugin } -// IsEnabled returns if a plugin is enabled -func (p *Plugin) IsEnabled() bool { +// IsLoaded returns if a plugin is enabled +func (p *Plugin) IsLoaded() bool { if v, ok := GlobalSettings[p.Name]; ok { return v.(bool) && p.Loaded } @@ -101,7 +101,7 @@ func (p *Plugin) Load() error { } } p.Loaded = true - RegisterGlobalOption(p.Name, true) + RegisterCommonOption(p.Name, true) return nil } @@ -133,7 +133,7 @@ func (p *Plugin) Call(fn string, args ...lua.LValue) (lua.LValue, error) { func FindPlugin(name string) *Plugin { var pl *Plugin for _, p := range Plugins { - if !p.IsEnabled() { + if !p.IsLoaded() { continue } if p.Name == name { diff --git a/internal/config/plugin_installer.go b/internal/config/plugin_installer.go index 14d40330..ef2d4cb4 100644 --- a/internal/config/plugin_installer.go +++ b/internal/config/plugin_installer.go @@ -363,7 +363,7 @@ func GetInstalledVersions(withCore bool) PluginVersions { } for _, p := range Plugins { - if !p.IsEnabled() { + if !p.IsLoaded() { continue } version := GetInstalledPluginVersion(p.Name) @@ -572,7 +572,7 @@ func (pv PluginVersions) install(out io.Writer) { // UninstallPlugin deletes the plugin folder of the given plugin func UninstallPlugin(out io.Writer, name string) { for _, p := range Plugins { - if !p.IsEnabled() { + if !p.IsLoaded() { continue } if p.Name == name { @@ -605,7 +605,7 @@ func UpdatePlugins(out io.Writer, plugins []string) { // if no plugins are specified, update all installed plugins. if len(plugins) == 0 { for _, p := range Plugins { - if !p.IsEnabled() || p.Default { + if !p.IsLoaded() || p.Default { continue } plugins = append(plugins, p.Name) diff --git a/internal/config/settings.go b/internal/config/settings.go index 5c9c6ae8..18f7d85b 100644 --- a/internal/config/settings.go +++ b/internal/config/settings.go @@ -236,6 +236,21 @@ func RegisterGlobalOptionPlug(pl string, name string, defaultvalue interface{}) return RegisterGlobalOption(pl+"."+name, defaultvalue) } +// RegisterCommonOption creates a new option +func RegisterCommonOption(name string, defaultvalue interface{}) error { + if v, ok := GlobalSettings[name]; !ok { + defaultCommonSettings[name] = defaultvalue + GlobalSettings[name] = defaultvalue + err := WriteSettings(filepath.Join(ConfigDir, "settings.json")) + if err != nil { + return errors.New("Error writing settings.json file: " + err.Error()) + } + } else { + defaultCommonSettings[name] = v + } + return nil +} + // RegisterGlobalOption creates a new global-only option func RegisterGlobalOption(name string, defaultvalue interface{}) error { if v, ok := GlobalSettings[name]; !ok { diff --git a/internal/display/statusline.go b/internal/display/statusline.go index 577c234d..4a48a900 100644 --- a/internal/display/statusline.go +++ b/internal/display/statusline.go @@ -66,7 +66,7 @@ func SetStatusInfoFnLua(fn string) { return } statusInfo[fn] = func(b *buffer.Buffer) string { - if pl == nil || !pl.IsEnabled() { + if pl == nil || !pl.IsLoaded() { return "" } val, err := pl.Call(plFn, luar.New(ulua.L, b))