]> git.lizzy.rs Git - micro.git/commitdiff
Some plugin callbacks
authorZachary Yedidia <zyedidia@gmail.com>
Tue, 19 Mar 2019 22:28:51 +0000 (18:28 -0400)
committerZachary Yedidia <zyedidia@gmail.com>
Wed, 25 Dec 2019 22:05:10 +0000 (17:05 -0500)
cmd/micro/initlua.go [new file with mode: 0644]
cmd/micro/micro.go
internal/action/bufpane.go
internal/action/globals.go
internal/buffer/buffer.go
internal/config/plugin.go
internal/config/rtfiles.go
internal/lua/lua.go

diff --git a/cmd/micro/initlua.go b/cmd/micro/initlua.go
new file mode 100644 (file)
index 0000000..d68e907
--- /dev/null
@@ -0,0 +1,37 @@
+package main
+
+import (
+       "log"
+
+       lua "github.com/yuin/gopher-lua"
+       luar "layeh.com/gopher-luar"
+
+       "github.com/zyedidia/micro/internal/action"
+       ulua "github.com/zyedidia/micro/internal/lua"
+       "github.com/zyedidia/micro/internal/screen"
+)
+
+func init() {
+       ulua.L = lua.NewState()
+       ulua.L.SetGlobal("import", luar.New(ulua.L, LuaImport))
+}
+
+func LuaImport(pkg string) *lua.LTable {
+       if pkg == "micro" {
+               return luaImportMicro()
+       } else {
+               return ulua.Import(pkg)
+       }
+}
+
+func luaImportMicro() *lua.LTable {
+       pkg := ulua.L.NewTable()
+
+       ulua.L.SetField(pkg, "TermMessage", luar.New(ulua.L, screen.TermMessage))
+       ulua.L.SetField(pkg, "TermError", luar.New(ulua.L, screen.TermError))
+       ulua.L.SetField(pkg, "InfoBar", luar.New(ulua.L, action.GetInfoBar))
+       ulua.L.SetField(pkg, "Log", luar.New(ulua.L, log.Println))
+       ulua.L.SetField(pkg, "TryBindKey", luar.New(ulua.L, action.TryBindKey))
+
+       return pkg
+}
index fc89f3bc0fc0215524f09e1afb1edaa5328e9468..9799ef70f2870289a7fbe6befa67f3f6c52f0702 100644 (file)
@@ -27,6 +27,7 @@ var (
        flagStartPos  = flag.String("startpos", "", "LINE,COL to start the cursor at when opening a buffer.")
        flagConfigDir = flag.String("config-dir", "", "Specify a custom location for the configuration directory")
        flagOptions   = flag.Bool("options", false, "Show all option help")
+       optionFlags   map[string]*string
 )
 
 func InitFlags() {
@@ -50,7 +51,7 @@ func InitFlags() {
                fmt.Println("\nUse `micro -options` to see the full list of configuration options")
        }
 
-       optionFlags := make(map[string]*string)
+       optionFlags = make(map[string]*string)
 
        for k, v := range config.DefaultGlobalSettings() {
                optionFlags[k] = flag.String(k, "", fmt.Sprintf("The %s option. Default value: '%v'", k, v))
@@ -74,16 +75,6 @@ func InitFlags() {
                }
                os.Exit(0)
        }
-       for k, v := range optionFlags {
-               if *v != "" {
-                       nativeValue, err := config.GetNativeValue(k, config.GlobalSettings[k], *v)
-                       if err != nil {
-                               screen.TermMessage(err)
-                               continue
-                       }
-                       config.GlobalSettings[k] = nativeValue
-               }
-       }
 }
 
 // LoadInput determines which files should be loaded into buffers
@@ -151,6 +142,13 @@ func main() {
 
        InitLog()
 
+       InitFlags()
+
+       err = config.InitConfigDir(*flagConfigDir)
+       if err != nil {
+               screen.TermMessage(err)
+       }
+
        config.InitRuntimeFiles()
        err = config.ReadSettings()
        if err != nil {
@@ -158,11 +156,16 @@ func main() {
        }
        config.InitGlobalSettings()
 
-       InitFlags()
-
-       err = config.InitConfigDir(*flagConfigDir)
-       if err != nil {
-               screen.TermMessage(err)
+       // flag options
+       for k, v := range optionFlags {
+               if *v != "" {
+                       nativeValue, err := config.GetNativeValue(k, config.GlobalSettings[k], *v)
+                       if err != nil {
+                               screen.TermMessage(err)
+                               continue
+                       }
+                       config.GlobalSettings[k] = nativeValue
+               }
        }
 
        action.InitBindings()
@@ -174,6 +177,10 @@ func main() {
        }
 
        config.LoadAllPlugins()
+       err = config.RunPluginFn("init")
+       if err != nil {
+               screen.TermMessage(err)
+       }
 
        screen.Init()
 
index ac6c674fe14c63a22bcf3cc9cf81df996d06928d..87f06d5cef73b232847ab0bdc596f958cc255a76 100644 (file)
@@ -4,8 +4,12 @@ import (
        "strings"
        "time"
 
+       luar "layeh.com/gopher-luar"
+
        "github.com/zyedidia/micro/internal/buffer"
+       "github.com/zyedidia/micro/internal/config"
        "github.com/zyedidia/micro/internal/display"
+       ulua "github.com/zyedidia/micro/internal/lua"
        "github.com/zyedidia/micro/internal/screen"
        "github.com/zyedidia/tcell"
 )
@@ -110,6 +114,8 @@ func NewBufPane(buf *buffer.Buffer, win display.BWindow) *BufPane {
        h.Cursor = h.Buf.GetActiveCursor()
        h.mouseReleased = true
 
+       config.RunPluginFn("onBufPaneOpen", luar.New(ulua.L, h))
+
        return h
 }
 
index edc4f4764e2fb453913541846538ae0c27dc6efd..301545c89bbc5b66095a3179d079e5934e60d89b 100644 (file)
@@ -5,3 +5,7 @@ var InfoBar *InfoPane
 func InitGlobals() {
        InfoBar = NewInfoBar()
 }
+
+func GetInfoBar() *InfoPane {
+       return InfoBar
+}
index 7496db93025d7463b5fa42297778bfb2b05f86d4..c1a2f72f4d711c569179ad8e7003df4257c0532d 100644 (file)
@@ -12,10 +12,13 @@ import (
        "time"
        "unicode/utf8"
 
+       luar "layeh.com/gopher-luar"
+
        "github.com/zyedidia/micro/internal/config"
-       "github.com/zyedidia/micro/pkg/highlight"
+       ulua "github.com/zyedidia/micro/internal/lua"
        "github.com/zyedidia/micro/internal/screen"
        . "github.com/zyedidia/micro/internal/util"
+       "github.com/zyedidia/micro/pkg/highlight"
        "golang.org/x/text/encoding/htmlindex"
        "golang.org/x/text/encoding/unicode"
        "golang.org/x/text/transform"
@@ -228,6 +231,11 @@ func NewBuffer(r io.Reader, size int64, path string, cursorPosition []string, bt
                }
        }
 
+       err = config.RunPluginFn("onBufferOpen", luar.New(ulua.L, b))
+       if err != nil {
+               screen.TermMessage(err)
+       }
+
        OpenBuffers = append(OpenBuffers, b)
 
        return b
index ffb24e941fbc586468ef89632a0cbda1acd06382..1ffa9ce727a450419f8f6e934ba4f88eab806b67 100644 (file)
@@ -2,6 +2,7 @@ package config
 
 import (
        "errors"
+       "log"
 
        lua "github.com/yuin/gopher-lua"
        ulua "github.com/zyedidia/micro/internal/lua"
@@ -9,12 +10,26 @@ import (
 
 var ErrNoSuchFunction = errors.New("No such function exists")
 
+// LoadAllPlugins loads all detected plugins (in runtime/plugins and ConfigDir/plugins)
 func LoadAllPlugins() {
        for _, p := range Plugins {
                p.Load()
        }
 }
 
+// RunPluginFn runs a given function in all plugins
+func RunPluginFn(fn string, args ...lua.LValue) error {
+       var reterr error
+       for _, p := range Plugins {
+               log.Println(p.Name, fn)
+               _, err := p.Call(fn, args...)
+               if err != nil && err != ErrNoSuchFunction {
+                       reterr = errors.New("Plugin " + p.Name + ": " + err.Error())
+               }
+       }
+       return reterr
+}
+
 type Plugin struct {
        Name string        // name of plugin
        Info RuntimeFile   // json file containing info
index d31b412333c830d9f337d0ed6739425e2589c3f2..520c74b3ba1a6295fb67623a57696d2f2c14555a 100644 (file)
@@ -2,6 +2,7 @@ package config
 
 import (
        "io/ioutil"
+       "log"
        "os"
        "path"
        "path/filepath"
@@ -137,6 +138,7 @@ func InitRuntimeFiles() {
        // Search ConfigDir for plugin-scripts
        plugdir := filepath.Join(ConfigDir, "plugins")
        files, _ := ioutil.ReadDir(plugdir)
+       log.Println("reading", plugdir)
        for _, d := range files {
                if d.IsDir() {
                        srcs, _ := ioutil.ReadDir(filepath.Join(plugdir, d.Name()))
index 853f10fa05c041411bb4425a71cfa2173b304403..e0392e9581d21989f38dc92a14b38d975439d8bc 100644 (file)
@@ -23,11 +23,6 @@ import (
 
 var L *lua.LState
 
-func init() {
-       L = lua.NewState()
-       L.SetGlobal("import", luar.New(L, Import))
-}
-
 // LoadFile loads a lua file
 func LoadFile(module string, file string, data []byte) error {
        pluginDef := []byte("module(\"" + module + "\", package.seeall)")