L.SetGlobal("IsWordChar", luar.New(L, IsWordChar))
L.SetGlobal("HandleCommand", luar.New(L, HandleCommand))
L.SetGlobal("HandleShellCommand", luar.New(L, HandleShellCommand))
+ L.SetGlobal("ExecCommand", luar.New(L, ExecCommand))
+ L.SetGlobal("RunShellCommand", luar.New(L, RunShellCommand))
+ L.SetGlobal("RunBackgroundShell", luar.New(L, RunBackgroundShell))
+ L.SetGlobal("RunInteractiveShell", luar.New(L, RunInteractiveShell))
+ L.SetGlobal("TermEmuSupported", luar.New(L, TermEmuSupported))
+ L.SetGlobal("RunTermEmulator", luar.New(L, RunTermEmulator))
L.SetGlobal("GetLeadingWhitespace", luar.New(L, GetLeadingWhitespace))
L.SetGlobal("MakeCompletion", luar.New(L, MakeCompletion))
L.SetGlobal("NewBuffer", luar.New(L, NewBufferFromString))
const TermEmuSupported = true
-func RunTermEmulator(input string, wait bool, getOutput bool) error {
+func RunTermEmulator(input string, wait bool, getOutput bool, callback string) error {
args, err := shellwords.Split(input)
if err != nil {
return err
}
- err = CurView().StartTerminal(args, wait, false, "")
+ err = CurView().StartTerminal(args, wait, getOutput, callback)
return err
}
package main
+import "errors"
+
const TermEmuSupported = false
-func RunTermEmulator(input string, wait bool, getOutput bool) string {
- return "Unsupported"
+func RunTermEmulator(input string, wait bool, getOutput bool) error {
+ return errors.New("Unsupported operating system")
}
package main
import (
+ "bytes"
"fmt"
"os"
"os/exec"
selection [2]Loc
wait bool
getOutput bool
+ output *bytes.Buffer
callback string
}
}
// Start begins a new command in this terminal with a given view
-func (t *Terminal) Start(execCmd []string, view *View) error {
+func (t *Terminal) Start(execCmd []string, view *View, getOutput bool) error {
if len(execCmd) <= 0 {
return nil
}
cmd := exec.Command(execCmd[0], execCmd[1:]...)
- term, _, err := terminal.Start(&t.state, cmd)
+ t.output = nil
+ if getOutput {
+ t.output = bytes.NewBuffer([]byte{})
+ }
+ term, _, err := terminal.Start(&t.state, cmd, t.output)
if err != nil {
return err
}
t.term = term
t.view = view
+ t.getOutput = getOutput
t.vtOld = view.Type
t.status = VTRunning
t.title = execCmd[0] + ":" + strconv.Itoa(cmd.Process.Pid)
if t.wait {
t.status = VTDone
} else {
- t.status = VTIdle
+ t.Close()
t.view.Type = t.vtOld
}
}
func (t *Terminal) Close() {
t.status = VTIdle
// call the lua function that the user has given as a callback
- _, err := Call(t.callback)
- if err != nil && !strings.HasPrefix(err.Error(), "function does not exist") {
- TermMessage(err)
+ if t.getOutput {
+ _, err := Call(t.callback, t.output.String())
+ if err != nil && !strings.HasPrefix(err.Error(), "function does not exist") {
+ TermMessage(err)
+ }
}
}
-Subproject commit 282ce0e5322c82529687d609ee670fac7c7d917c
+Subproject commit a41f924260f4464b040619f1dd9797f17320d83e
-Subproject commit 441ca94228d630ad17c739751abc3e23cb422c6e
+Subproject commit 1195183a16e63a2b0b98b64b2f76c0603387adb3
// StartTerminal execs a command in this view
func (v *View) StartTerminal(execCmd []string, wait bool, getOutput bool, luaCallback string) error {
- err := v.term.Start(execCmd, v)
+ err := v.term.Start(execCmd, v, getOutput)
v.term.wait = wait
- v.term.getOutput = getOutput
v.term.callback = luaCallback
if err == nil {
v.term.Resize(v.Width, v.Height)