--- /dev/null
+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
+}
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() {
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))
}
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
InitLog()
+ InitFlags()
+
+ err = config.InitConfigDir(*flagConfigDir)
+ if err != nil {
+ screen.TermMessage(err)
+ }
+
config.InitRuntimeFiles()
err = config.ReadSettings()
if err != nil {
}
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()
}
config.LoadAllPlugins()
+ err = config.RunPluginFn("init")
+ if err != nil {
+ screen.TermMessage(err)
+ }
screen.Init()
"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"
)
h.Cursor = h.Buf.GetActiveCursor()
h.mouseReleased = true
+ config.RunPluginFn("onBufPaneOpen", luar.New(ulua.L, h))
+
return h
}
func InitGlobals() {
InfoBar = NewInfoBar()
}
+
+func GetInfoBar() *InfoPane {
+ return InfoBar
+}
"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"
}
}
+ err = config.RunPluginFn("onBufferOpen", luar.New(ulua.L, b))
+ if err != nil {
+ screen.TermMessage(err)
+ }
+
OpenBuffers = append(OpenBuffers, b)
return b
import (
"errors"
+ "log"
lua "github.com/yuin/gopher-lua"
ulua "github.com/zyedidia/micro/internal/lua"
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
import (
"io/ioutil"
+ "log"
"os"
"path"
"path/filepath"
// 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()))
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)")