diff --git a/cmd/micro/initlua.go b/cmd/micro/initlua.go index 5acb979d..41d752cc 100644 --- a/cmd/micro/initlua.go +++ b/cmd/micro/initlua.go @@ -2,6 +2,7 @@ package main import ( "log" + "time" lua "github.com/yuin/gopher-lua" luar "layeh.com/gopher-luar" @@ -55,6 +56,11 @@ func luaImportMicro() *lua.LTable { return action.Tabs })) ulua.L.SetField(pkg, "Lock", luar.New(ulua.L, &ulua.Lock)) + ulua.L.SetField(pkg, "After", luar.New(ulua.L, func(t time.Duration, f func()) { + time.AfterFunc(t, func() { + timerChan <- f + }) + })) return pkg } diff --git a/cmd/micro/micro.go b/cmd/micro/micro.go index e0ef0987..09c9ab2b 100644 --- a/cmd/micro/micro.go +++ b/cmd/micro/micro.go @@ -46,6 +46,8 @@ var ( sigterm chan os.Signal sighup chan os.Signal + + timerChan chan func() ) func InitFlags() { @@ -364,6 +366,8 @@ func main() { signal.Notify(sigterm, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGABRT) signal.Notify(sighup, syscall.SIGHUP) + timerChan = make(chan func()) + // Here is the event loop which runs in a separate thread go func() { for { @@ -429,6 +433,8 @@ func DoEvent() { for len(screen.DrawChan()) > 0 { <-screen.DrawChan() } + case f := <-timerChan: + f() case <-sighup: for _, b := range buffer.OpenBuffers { if !b.Modified() { diff --git a/runtime/help/plugins.md b/runtime/help/plugins.md index 19dd0c3e..497f623d 100644 --- a/runtime/help/plugins.md +++ b/runtime/help/plugins.md @@ -121,6 +121,11 @@ The packages and functions are listed below (in Go type signatures): current pane is not a BufPane. - `CurTab() *Tab`: returns the current tab. + + - `After(t time.Duration, f func())`: run function `f` in the background + after time `t` elapses. See https://pkg.go.dev/time#Duration for the + usage of `time.Duration`. + * `micro/config` - `MakeCommand(name string, action func(bp *BufPane, args[]string), completer buffer.Completer)`: