]> git.lizzy.rs Git - micro.git/blobdiff - cmd/micro/plugin.go
Merge pull request #168 from onodera-punpun/syntax_css
[micro.git] / cmd / micro / plugin.go
index add2476a6060b92473846b90d039e7720ed42811..3ac7ebae7c3c876c12ae01845d06af1b0db8a0d4 100644 (file)
@@ -1,11 +1,63 @@
 package main
 
 import (
+       "errors"
        "io/ioutil"
+
+       "github.com/layeh/gopher-luar"
+       "github.com/yuin/gopher-lua"
 )
 
 var loadedPlugins []string
 
+var preInstalledPlugins = []string{
+       "go",
+       "linter",
+}
+
+// Call calls the lua function 'function'
+// If it does not exist nothing happens, if there is an error,
+// the error is returned
+func Call(function string, args []string) error {
+       luaFunc := L.GetGlobal(function)
+       if luaFunc.String() == "nil" {
+               return errors.New("function does not exist: " + function)
+       }
+       luaArgs := luar.New(L, args)
+       err := L.CallByParam(lua.P{
+               Fn:      luaFunc,
+               NRet:    0,
+               Protect: true,
+       }, luaArgs)
+       return err
+}
+
+// LuaFunctionBinding is a function generator which takes the name of a lua function
+// and creates a function that will call that lua function
+// Specifically it creates a function that can be called as a binding because this is used
+// to bind keys to lua functions
+func LuaFunctionBinding(function string) func(*View) bool {
+       return func(v *View) bool {
+               err := Call(function, nil)
+               if err != nil {
+                       TermMessage(err)
+               }
+               return false
+       }
+}
+
+// LuaFunctionCommand is the same as LuaFunctionBinding except it returns a normal function
+// so that a command can be bound to a lua function
+func LuaFunctionCommand(function string) func([]string) {
+       return func(args []string) {
+               err := Call(function, args)
+               if err != nil {
+                       TermMessage(err)
+               }
+       }
+}
+
+// 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 {
@@ -23,4 +75,18 @@ func LoadPlugins() {
                        }
                }
        }
+
+       for _, pluginName := range preInstalledPlugins {
+               plugin := "runtime/plugins/" + pluginName + "/" + pluginName + ".lua"
+               data, err := Asset(plugin)
+               if err != nil {
+                       TermMessage("Error loading pre-installed plugin: " + pluginName)
+                       continue
+               }
+               if err := L.DoString(string(data)); err != nil {
+                       TermMessage(err)
+                       continue
+               }
+               loadedPlugins = append(loadedPlugins, pluginName)
+       }
 }