81 lines
1.4 KiB
Go
81 lines
1.4 KiB
Go
package commands
|
|
|
|
import (
|
|
"os"
|
|
"os/exec"
|
|
|
|
"github.com/riywo/loginshell"
|
|
|
|
"git.sr.ht/~rjarry/aerc/app"
|
|
"git.sr.ht/~rjarry/aerc/lib/ui"
|
|
)
|
|
|
|
type Term struct {
|
|
Cmd []string `opt:"..." required:"false"`
|
|
}
|
|
|
|
func init() {
|
|
Register(Term{})
|
|
}
|
|
|
|
func (Term) Description() string {
|
|
return "Open a new terminal tab."
|
|
}
|
|
|
|
func (Term) Context() CommandContext {
|
|
return GLOBAL
|
|
}
|
|
|
|
func (Term) Aliases() []string {
|
|
return []string{"terminal", "term"}
|
|
}
|
|
|
|
func (t Term) Execute(args []string) error {
|
|
return TermCore(t.Cmd)
|
|
}
|
|
|
|
// The help command is an alias for `term man` thus Term requires a simple func
|
|
func TermCore(args []string) error {
|
|
return TermCoreDirectory(args, "")
|
|
}
|
|
|
|
func TermCoreDirectory(args []string, dir string) error {
|
|
if len(args) == 0 {
|
|
shell, err := loginshell.Shell()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
args = []string{shell}
|
|
}
|
|
|
|
if dir != "" {
|
|
if _, err := os.Stat(dir); os.IsNotExist(err) {
|
|
return err
|
|
}
|
|
}
|
|
|
|
cmd := exec.Command(args[0], args[1:]...)
|
|
cmd.Dir = dir
|
|
term, err := app.NewTerminal(cmd)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
tab := app.NewTab(term, args[0])
|
|
term.OnTitle = func(title string) {
|
|
if title == "" {
|
|
title = args[0]
|
|
}
|
|
if tab.Name != title {
|
|
tab.Name = title
|
|
ui.Invalidate()
|
|
}
|
|
}
|
|
term.OnClose = func(err error) {
|
|
app.RemoveTab(term, false)
|
|
if err != nil {
|
|
app.PushError(err.Error())
|
|
}
|
|
}
|
|
return nil
|
|
}
|