// PreActionCall executes the lua pre callback if possible
func PreActionCall(funcName string, view *View) bool {
executeAction := true
- for _, pl := range loadedPlugins {
+ for pl := range loadedPlugins {
ret, err := Call(pl+".pre"+funcName, view)
if err != nil && !strings.HasPrefix(err.Error(), "function does not exist") {
TermMessage(err)
// PostActionCall executes the lua plugin callback if possible
func PostActionCall(funcName string, view *View) bool {
relocate := true
- for _, pl := range loadedPlugins {
+ for pl := range loadedPlugins {
ret, err := Call(pl+".on"+funcName, view)
if err != nil && !strings.HasPrefix(err.Error(), "function does not exist") {
TermMessage(err)
v.Buf.Insert(v.Cursor.Loc, string(t))
v.Cursor.Right()
- for _, pl := range loadedPlugins {
+ for pl := range loadedPlugins {
_, err := Call(pl+".onRune", string(t), v)
if err != nil && !strings.HasPrefix(err.Error(), "function does not exist") {
TermMessage(err)
removed := ""
for _, plugin := range args[1:] {
// check if the plugin exists.
- for _, lp := range loadedPlugins {
- if lp == plugin {
- UninstallPlugin(plugin)
- removed += plugin + " "
- continue
- }
+ if _, ok := loadedPlugins[plugin]; ok {
+ UninstallPlugin(plugin)
+ removed += plugin + " "
+ continue
}
}
if !IsSpaces(removed) {
}
eh.UndoStack.Push(t)
- for _, pl := range loadedPlugins {
+ for pl := range loadedPlugins {
ret, err := Call(pl+".onBeforeTextEvent", t)
if err != nil && !strings.HasPrefix(err.Error(), "function does not exist") {
TermMessage(err)
for _, v := range t.views {
v.Buf.FindFileType()
v.Buf.UpdateRules()
- for _, pl := range loadedPlugins {
+ for pl := range loadedPlugins {
_, err := Call(pl+".onViewOpen", v)
if err != nil && !strings.HasPrefix(err.Error(), "function does not exist") {
TermMessage(err)
"github.com/yuin/gopher-lua"
)
-var loadedPlugins []string
+var loadedPlugins map[string]string
// Call calls the lua function 'function'
// If it does not exist nothing happens, if there is an error,
}
}
+// luaPluginName convert a human-friendly plugin name into a valid lua variable name.
+func luaPluginName(name string) string {
+ return strings.Replace(name, "-", "_", -1)
+}
+
// LoadPlugins loads the pre-installed plugins and the plugins located in ~/.config/micro/plugins
func LoadPlugins() {
+
+ loadedPlugins = make(map[string]string)
+
for _, plugin := range ListRuntimeFiles(RTPlugin) {
- alreadyExists := false
+
pluginName := plugin.Name()
- for _, pl := range loadedPlugins {
- if pl == pluginName {
- alreadyExists = true
- break
- }
+ if _, ok := loadedPlugins[pluginName]; ok {
+ continue
}
- if !alreadyExists {
- data, err := plugin.Data()
- if err != nil {
- TermMessage("Error loading plugin: " + pluginName)
- continue
- }
- pluginDef := "\nlocal P = {}\n" + pluginName + " = P\nsetmetatable(" + pluginName + ", {__index = _G})\nsetfenv(1, P)\n"
+ data, err := plugin.Data()
+ if err != nil {
+ TermMessage("Error loading plugin: " + pluginName)
+ continue
+ }
- if err := L.DoString(pluginDef + string(data)); err != nil {
- TermMessage(err)
- continue
- }
- loadedPlugins = append(loadedPlugins, pluginName)
+ pluginLuaName := luaPluginName(pluginName)
+ pluginDef := "\nlocal P = {}\n" + pluginLuaName + " = P\nsetmetatable(" + pluginLuaName + ", {__index = _G})\nsetfenv(1, P)\n"
+
+ if err := L.DoString(pluginDef + string(data)); err != nil {
+ TermMessage(err)
+ continue
}
+
+ loadedPlugins[pluginName] = pluginLuaName
+
}
if _, err := os.Stat(configDir + "/init.lua"); err == nil {
if err := L.DoString(pluginDef + string(data)); err != nil {
TermMessage(err)
}
- loadedPlugins = append(loadedPlugins, "init")
+ loadedPlugins["init"] = "init"
}
}
result = append(result, newStaticPluginVersion(CorePluginName, Version))
}
- for _, name := range loadedPlugins {
- version := GetInstalledPluginVersion(name)
+ for name, lpname := range loadedPlugins {
+ version := GetInstalledPluginVersion(lpname)
if pv := newStaticPluginVersion(name, version); pv != nil {
result = append(result, pv)
}
func UninstallPlugin(name string) {
if err := os.RemoveAll(filepath.Join(configDir, "plugins", name)); err != nil {
messenger.Error(err)
+ return
}
+ delete(loadedPlugins, name)
}
// Install installs the plugin
func UpdatePlugins(plugins []string) {
// if no plugins are specified, update all installed plugins.
if len(plugins) == 0 {
- plugins = loadedPlugins
+ for name := range loadedPlugins {
+ plugins = append(plugins, name)
+ }
}
messenger.AddLog("Checking for plugin updates")
v.Height--
}
- for _, pl := range loadedPlugins {
+ for pl := range loadedPlugins {
_, err := Call(pl+".onViewOpen", v)
if err != nil && !strings.HasPrefix(err.Error(), "function does not exist") {
TermMessage(err)
v.Buf.Insert(v.Cursor.Loc, string(e.Rune()))
v.Cursor.Right()
- for _, pl := range loadedPlugins {
+ for pl := range loadedPlugins {
_, err := Call(pl+".onRune", string(e.Rune()), v)
if err != nil && !strings.HasPrefix(err.Error(), "function does not exist") {
TermMessage(err)