You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
smug/tmux.go

130 lines
2.9 KiB
Go

3 years ago
package main
import (
"os"
"os/exec"
"strings"
3 years ago
)
const (
VSplit = "vertical"
HSplit = "horizontal"
)
const (
EvenHorizontal = "even-horizontal"
EvenVertical = "even-vertical"
MainHorizontal = "main-horizontal"
MainVertical = "main-vertical"
Tiled = "tiled"
)
3 years ago
type Tmux struct {
commander Commander
}
func (tmux Tmux) NewSession(name string) (string, error) {
cmd := exec.Command("tmux", "new", "-Pd", "-s", name)
3 years ago
return tmux.commander.Exec(cmd)
3 years ago
}
func (tmux Tmux) SessionExists(name string) bool {
cmd := exec.Command("tmux", "has-session", "-t", name)
res, err := tmux.commander.Exec(cmd)
return res == "" && err == nil
}
func (tmux Tmux) KillWindow(target string) error {
cmd := exec.Command("tmux", "kill-window", "-t", target)
_, err := tmux.commander.Exec(cmd)
return err
}
func (tmux Tmux) NewWindow(target string, name string, root string, commands []string) (string, error) {
cmd := exec.Command("tmux", "neww", "-Pd", "-t", target, "-n", name, "-c", root)
window, err := tmux.commander.Exec(cmd)
if err != nil {
return "", err
}
for _, c := range commands {
3 years ago
err = tmux.SendKeys(window, c)
if err != nil {
return "", err
}
3 years ago
}
return window, nil
}
func (tmux Tmux) SendKeys(target string, command string) error {
cmd := exec.Command("tmux", "send-keys", "-t", target, command, "Enter")
_, err := tmux.commander.Exec(cmd)
return err
}
func (tmux Tmux) Attach(target string, stdin *os.File, stdout *os.File, stderr *os.File) error {
cmd := exec.Command("tmux", "attach", "-t", target)
cmd.Stdin = stdin
cmd.Stdout = stdout
cmd.Stderr = stderr
return tmux.commander.ExecSilently(cmd)
}
func (tmux Tmux) RenumberWindows() error {
cmd := exec.Command("tmux", "move-window", "-r")
_, err := tmux.commander.Exec(cmd)
return err
}
func (tmux Tmux) SplitWindow(target string, splitType string, root string, commands []string) (string, error) {
args := []string{"split-window", "-Pd", "-t", target, "-c", root}
switch splitType {
case VSplit:
args = append(args, "-v")
case HSplit:
args = append(args, "-h")
}
cmd := exec.Command("tmux", args...)
pane, err := tmux.commander.Exec(cmd)
if err != nil {
return "", err
}
for _, c := range commands {
3 years ago
err = tmux.SendKeys(pane, c)
if err != nil {
return "", err
}
3 years ago
}
return pane, nil
}
func (tmux Tmux) SelectLayout(target string, layoutType string) (string, error) {
cmd := exec.Command("tmux", "select-layout", "-t", target, layoutType)
return tmux.commander.Exec(cmd)
}
3 years ago
func (tmux Tmux) StopSession(target string) (string, error) {
3 years ago
cmd := exec.Command("tmux", "kill-session", "-t", target)
3 years ago
return tmux.commander.Exec(cmd)
}
func (tmux Tmux) ListWindows(target string) ([]string, error) {
cmd := exec.Command("tmux", "list-windows", "-t", target, "-F", "#{window_index}")
output, err := tmux.commander.Exec(cmd)
if err != nil {
return []string{}, err
}
return strings.Split(output, "\n"), nil
}