mirror of
https://github.com/zyedidia/micro.git
synced 2026-03-16 05:47:06 +09:00
plugins: Add capability to dis-/enable them per buffer (#2836)
This commit is contained in:
@@ -306,7 +306,7 @@ func (h *BufPane) ResizePane(size int) {
|
|||||||
// PluginCB calls all plugin callbacks with a certain name and displays an
|
// PluginCB calls all plugin callbacks with a certain name and displays an
|
||||||
// error if there is one and returns the aggregrate boolean response
|
// error if there is one and returns the aggregrate boolean response
|
||||||
func (h *BufPane) PluginCB(cb string) bool {
|
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 {
|
if err != nil {
|
||||||
screen.TermMessage(err)
|
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
|
// PluginCBRune is the same as PluginCB but also passes a rune to the plugins
|
||||||
func (h *BufPane) PluginCBRune(cb string, r rune) bool {
|
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 {
|
if err != nil {
|
||||||
screen.TermMessage(err)
|
screen.TermMessage(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -237,7 +237,7 @@ func (eh *EventHandler) Execute(t *TextEvent) {
|
|||||||
}
|
}
|
||||||
eh.UndoStack.Push(t)
|
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 {
|
if err != nil {
|
||||||
screen.TermMessage(err)
|
screen.TermMessage(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,26 @@ func (b *Buffer) SetOptionNative(option string, nativeValue interface{}) error {
|
|||||||
buf.HighlightSearch = nativeValue.(bool)
|
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 {
|
if b.OptionCallback != nil {
|
||||||
b.OptionCallback(option, nativeValue)
|
b.OptionCallback(option, nativeValue)
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ func LoadAllPlugins() error {
|
|||||||
func RunPluginFn(fn string, args ...lua.LValue) error {
|
func RunPluginFn(fn string, args ...lua.LValue) error {
|
||||||
var reterr error
|
var reterr error
|
||||||
for _, p := range Plugins {
|
for _, p := range Plugins {
|
||||||
if !p.IsEnabled() {
|
if !p.IsLoaded() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
_, err := p.Call(fn, args...)
|
_, 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
|
// RunPluginFnBool runs a function in all plugins and returns
|
||||||
// false if any one of them returned false
|
// false if any one of them returned false
|
||||||
// also returns an error if any of the plugins had an error
|
// 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
|
var reterr error
|
||||||
retbool := true
|
retbool := true
|
||||||
for _, p := range Plugins {
|
for _, p := range Plugins {
|
||||||
if !p.IsEnabled() {
|
if !p.IsLoaded() || (settings != nil && settings[p.Name] == false) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
val, err := p.Call(fn, args...)
|
val, err := p.Call(fn, args...)
|
||||||
@@ -71,11 +71,11 @@ type Plugin struct {
|
|||||||
Info *PluginInfo // json file containing info
|
Info *PluginInfo // json file containing info
|
||||||
Srcs []RuntimeFile // lua files
|
Srcs []RuntimeFile // lua files
|
||||||
Loaded bool
|
Loaded bool
|
||||||
Default bool // pre-installed plugin
|
Default bool // pre-installed plugin
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsEnabled returns if a plugin is enabled
|
// IsLoaded returns if a plugin is enabled
|
||||||
func (p *Plugin) IsEnabled() bool {
|
func (p *Plugin) IsLoaded() bool {
|
||||||
if v, ok := GlobalSettings[p.Name]; ok {
|
if v, ok := GlobalSettings[p.Name]; ok {
|
||||||
return v.(bool) && p.Loaded
|
return v.(bool) && p.Loaded
|
||||||
}
|
}
|
||||||
@@ -101,7 +101,7 @@ func (p *Plugin) Load() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
p.Loaded = true
|
p.Loaded = true
|
||||||
RegisterGlobalOption(p.Name, true)
|
RegisterCommonOption(p.Name, true)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,7 +133,7 @@ func (p *Plugin) Call(fn string, args ...lua.LValue) (lua.LValue, error) {
|
|||||||
func FindPlugin(name string) *Plugin {
|
func FindPlugin(name string) *Plugin {
|
||||||
var pl *Plugin
|
var pl *Plugin
|
||||||
for _, p := range Plugins {
|
for _, p := range Plugins {
|
||||||
if !p.IsEnabled() {
|
if !p.IsLoaded() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if p.Name == name {
|
if p.Name == name {
|
||||||
|
|||||||
@@ -363,7 +363,7 @@ func GetInstalledVersions(withCore bool) PluginVersions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, p := range Plugins {
|
for _, p := range Plugins {
|
||||||
if !p.IsEnabled() {
|
if !p.IsLoaded() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
version := GetInstalledPluginVersion(p.Name)
|
version := GetInstalledPluginVersion(p.Name)
|
||||||
@@ -572,7 +572,7 @@ func (pv PluginVersions) install(out io.Writer) {
|
|||||||
// UninstallPlugin deletes the plugin folder of the given plugin
|
// UninstallPlugin deletes the plugin folder of the given plugin
|
||||||
func UninstallPlugin(out io.Writer, name string) {
|
func UninstallPlugin(out io.Writer, name string) {
|
||||||
for _, p := range Plugins {
|
for _, p := range Plugins {
|
||||||
if !p.IsEnabled() {
|
if !p.IsLoaded() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if p.Name == name {
|
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 no plugins are specified, update all installed plugins.
|
||||||
if len(plugins) == 0 {
|
if len(plugins) == 0 {
|
||||||
for _, p := range Plugins {
|
for _, p := range Plugins {
|
||||||
if !p.IsEnabled() || p.Default {
|
if !p.IsLoaded() || p.Default {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
plugins = append(plugins, p.Name)
|
plugins = append(plugins, p.Name)
|
||||||
|
|||||||
@@ -236,6 +236,21 @@ func RegisterGlobalOptionPlug(pl string, name string, defaultvalue interface{})
|
|||||||
return RegisterGlobalOption(pl+"."+name, defaultvalue)
|
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
|
// RegisterGlobalOption creates a new global-only option
|
||||||
func RegisterGlobalOption(name string, defaultvalue interface{}) error {
|
func RegisterGlobalOption(name string, defaultvalue interface{}) error {
|
||||||
if v, ok := GlobalSettings[name]; !ok {
|
if v, ok := GlobalSettings[name]; !ok {
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ func SetStatusInfoFnLua(fn string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
statusInfo[fn] = func(b *buffer.Buffer) string {
|
statusInfo[fn] = func(b *buffer.Buffer) string {
|
||||||
if pl == nil || !pl.IsEnabled() {
|
if pl == nil || !pl.IsLoaded() {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
val, err := pl.Call(plFn, luar.New(ulua.L, b))
|
val, err := pl.Call(plFn, luar.New(ulua.L, b))
|
||||||
|
|||||||
Reference in New Issue
Block a user