-// 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 {
- if f.Name() == pluginName+".lua" {
- if err := L.DoFile(configDir + "/plugins/" + pluginName + "/" + f.Name()); err != nil {
- TermMessage(err)
- continue
- }
- loadedPlugins = append(loadedPlugins, pluginName)
+// 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) bool {
+ return func(v *View, _ bool) bool {
+ _, err := Call(function, nil)
+ if err != nil {
+ TermMessage(err)
+ }
+ return false
+ }
+}
+
+func unpack(old []string) []interface{} {
+ new := make([]interface{}, len(old))
+ for i, v := range old {
+ new[i] = v
+ }
+ return new
+}
+
+// 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, unpack(args)...)
+ if err != nil {
+ TermMessage(err)
+ }
+ }
+}
+
+// LuaFunctionComplete returns a function which can be used for autocomplete in plugins
+func LuaFunctionComplete(function string) func(string) []string {
+ return func(input string) (result []string) {
+
+ res, err := Call(function, input)
+ if err != nil {
+ TermMessage(err)
+ }
+ if tbl, ok := res.(*lua.LTable); !ok {
+ TermMessage(function, "should return a table of strings")
+ } else {
+ for i := 1; i <= tbl.Len(); i++ {
+ val := tbl.RawGetInt(i)
+ if v, ok := val.(lua.LString); !ok {
+ TermMessage(function, "should return a table of strings")
+ } else {
+ result = append(result, string(v))