From 3335f377a9ccaae39a0a1d677e1690334c388b08 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Tue, 19 Mar 2019 18:28:51 -0400 Subject: [PATCH] Some plugin callbacks --- cmd/micro/initlua.go | 37 ++++++++++++++++++++++++++++++++++++ cmd/micro/micro.go | 39 ++++++++++++++++++++++---------------- internal/action/bufpane.go | 6 ++++++ internal/action/globals.go | 4 ++++ internal/buffer/buffer.go | 10 +++++++++- internal/config/plugin.go | 15 +++++++++++++++ internal/config/rtfiles.go | 2 ++ internal/lua/lua.go | 5 ----- 8 files changed, 96 insertions(+), 22 deletions(-) create mode 100644 cmd/micro/initlua.go diff --git a/cmd/micro/initlua.go b/cmd/micro/initlua.go new file mode 100644 index 00000000..d68e9077 --- /dev/null +++ b/cmd/micro/initlua.go @@ -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 +} diff --git a/cmd/micro/micro.go b/cmd/micro/micro.go index fc89f3bc..9799ef70 100644 --- a/cmd/micro/micro.go +++ b/cmd/micro/micro.go @@ -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() diff --git a/internal/action/bufpane.go b/internal/action/bufpane.go index ac6c674f..87f06d5c 100644 --- a/internal/action/bufpane.go +++ b/internal/action/bufpane.go @@ -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 } diff --git a/internal/action/globals.go b/internal/action/globals.go index edc4f476..301545c8 100644 --- a/internal/action/globals.go +++ b/internal/action/globals.go @@ -5,3 +5,7 @@ var InfoBar *InfoPane func InitGlobals() { InfoBar = NewInfoBar() } + +func GetInfoBar() *InfoPane { + return InfoBar +} diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 7496db93..c1a2f72f 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -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 diff --git a/internal/config/plugin.go b/internal/config/plugin.go index ffb24e94..1ffa9ce7 100644 --- a/internal/config/plugin.go +++ b/internal/config/plugin.go @@ -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 diff --git a/internal/config/rtfiles.go b/internal/config/rtfiles.go index d31b4123..520c74b3 100644 --- a/internal/config/rtfiles.go +++ b/internal/config/rtfiles.go @@ -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())) diff --git a/internal/lua/lua.go b/internal/lua/lua.go index 853f10fa..e0392e95 100644 --- a/internal/lua/lua.go +++ b/internal/lua/lua.go @@ -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)")