X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=cmd%2Fmicro%2Fplugin.go;h=04e7b78b27b448221b6c382551d3934753491a3a;hb=64d574c35cfdbd61c5abb456adf58da3ed328b1d;hp=6594e276d38b56b8eefa5d75e44322cad6d74e57;hpb=f7295a25d8e61fe825202e5e09512e7c691e8654;p=micro.git diff --git a/cmd/micro/plugin.go b/cmd/micro/plugin.go index 6594e276..04e7b78b 100644 --- a/cmd/micro/plugin.go +++ b/cmd/micro/plugin.go @@ -4,20 +4,14 @@ import ( "errors" "io/ioutil" "os" - "path/filepath" "strings" - "github.com/layeh/gopher-luar" "github.com/yuin/gopher-lua" + "github.com/zyedidia/tcell" + "layeh.com/gopher-luar" ) -var loadedPlugins []string - -var preInstalledPlugins = []string{ - "go", - "linter", - "autoclose", -} +var loadedPlugins map[string]string // Call calls the lua function 'function' // If it does not exist nothing happens, if there is an error, @@ -67,6 +61,16 @@ func LuaFunctionBinding(function string) func(*View, bool) bool { } } +func LuaFunctionMouseBinding(function string) func(*View, bool, *tcell.EventMouse) bool { + return func(v *View, _ bool, e *tcell.EventMouse) bool { + _, err := Call(function, e) + if err != nil { + TermMessage(err) + } + return false + } +} + func unpack(old []string) []interface{} { new := make([]interface{}, len(old)) for i, v := range old { @@ -119,62 +123,43 @@ func LuaFunctionJob(function string) func(string, ...string) { } } +// 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() { - files, _ := ioutil.ReadDir(configDir + "/plugins") - for _, plugin := range files { - if plugin.IsDir() { - pluginName := plugin.Name() - files, _ := ioutil.ReadDir(configDir + "/plugins/" + pluginName) - for _, f := range files { - fullPath := filepath.Join(configDir, "plugins", pluginName, f.Name()) - if f.Name() == pluginName+".lua" { - data, _ := ioutil.ReadFile(fullPath) - pluginDef := "\nlocal P = {}\n" + pluginName + " = P\nsetmetatable(" + pluginName + ", {__index = _G})\nsetfenv(1, P)\n" - - if err := L.DoString(pluginDef + string(data)); err != nil { - TermMessage(err) - continue - } - loadedPlugins = append(loadedPlugins, pluginName) - } else if f.Name() == "help.md" { - AddRuntimeFile(FILE_Help, namedFile{realFile(fullPath), pluginName}) - } - } + loadedPlugins = make(map[string]string) + + for _, plugin := range ListRuntimeFiles(RTPlugin) { + pluginName := plugin.Name() + if _, ok := loadedPlugins[pluginName]; ok { + continue } - } - for _, pluginName := range preInstalledPlugins { - alreadyExists := false - for _, pl := range loadedPlugins { - if pl == pluginName { - alreadyExists = true - break - } + data, err := plugin.Data() + if err != nil { + TermMessage("Error loading plugin: " + pluginName) + continue } - if !alreadyExists { - plugin := "runtime/plugins/" + pluginName + "/" + pluginName + ".lua" - data, err := Asset(plugin) - if err != nil { - TermMessage("Error loading pre-installed plugin: " + pluginName) - continue - } - pluginDef := "\nlocal P = {}\n" + pluginName + " = P\nsetmetatable(" + pluginName + ", {__index = _G})\nsetfenv(1, P)\n" - if err := L.DoString(pluginDef + string(data)); err != nil { - TermMessage(err) - continue - } - loadedPlugins = append(loadedPlugins, pluginName) + pluginLuaName := luaPluginName(pluginName) + + if err := LoadFile(pluginName, pluginName, string(data)); err != nil { + TermMessage(err) + continue } + + loadedPlugins[pluginName] = pluginLuaName + } if _, err := os.Stat(configDir + "/init.lua"); err == nil { - pluginDef := "\nlocal P = {}\n" + "init" + " = P\nsetmetatable(" + "init" + ", {__index = _G})\nsetfenv(1, P)\n" data, _ := ioutil.ReadFile(configDir + "/init.lua") - if err := L.DoString(pluginDef + string(data)); err != nil { + if err := LoadFile("init", configDir+"init.lua", string(data)); err != nil { TermMessage(err) } - loadedPlugins = append(loadedPlugins, "init") + loadedPlugins["init"] = "init" } }