diff --git a/job.go b/job.go index d5572b8..5ffb61f 100644 --- a/job.go +++ b/job.go @@ -112,6 +112,7 @@ func (j *job) lua() rt.Value { "stop": {j.luaStop, 0, false}, "start": {j.luaStart, 0, false}, "foreground": {j.luaForeground, 0, false}, + "background": {j.luaBackground, 0, false}, } luaJob := rt.NewTable() util.SetExports(l, luaJob, jobFuncs) @@ -154,7 +155,14 @@ func (j *job) luaForeground(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { // lua code can run in other threads and goroutines, so this exists jobs.foreground = true - err := j.foreground() + // this is kinda funny + // background continues the process incase it got suspended + err := j.background() + if err != nil { + return nil, err + } + + err = j.foreground() if err != nil { return nil, err } @@ -163,6 +171,19 @@ func (j *job) luaForeground(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.Next(), nil } +func (j *job) luaBackground(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { + if !j.running { + return nil, errors.New("job not running") + } + + err := j.background() + if err != nil { + return nil, err + } + + return c.Next(), nil +} + type jobHandler struct { jobs map[int]*job latestID int diff --git a/job_unix.go b/job_unix.go index 3eed5b8..5029012 100644 --- a/job_unix.go +++ b/job_unix.go @@ -26,3 +26,13 @@ func (j *job) foreground() error { return nil } + +func (j *job) background() error { + proc := j.handle.Process + if proc == nil { + return nil + } + + proc.Signal(syscall.SIGCONT) + return nil +} diff --git a/job_windows.go b/job_windows.go index 270e00a..140a5d1 100644 --- a/job_windows.go +++ b/job_windows.go @@ -9,3 +9,7 @@ import ( func (j *job) foreground() error { return errors.New("not supported on windows") } + +func (j *job) background() error { + return errors.New("not supported on windows") +} diff --git a/nature/commands/bg.lua b/nature/commands/bg.lua new file mode 100644 index 0000000..f0aa462 --- /dev/null +++ b/nature/commands/bg.lua @@ -0,0 +1,15 @@ +local commander = require 'commander' + +commander.register('bg', function() + local job = hilbish.jobs.last() + if not job then + print 'bg: no last job' + return 1 + end + + local err = job.background() + if err then + print('bg: ' .. err) + return 2 + end +end)