package tmux import "fmt" // newSessionArgs builds args for `tmux new-session -d -s -x 220 -y 50 // -c -c `. The shell -c form runs the launch command // inside the configured shell so exported env vars and quoting work correctly. func newSessionArgs(id, cwd, shellPath, launchCmd string) []string { return []string{ "new-session", "-d", "-s", id, "-x", "220", "-y", "50", "-c", cwd, shellPath, "-c", launchCmd, } } // setStatusOffArgs hides the tmux status bar for the given session. // set-option uses pane-targeting syntax which does not accept the `=` prefix, // so we pass the session name directly. func setStatusOffArgs(id string) []string { return []string{"set-option", "-t", id, "status", "off"} } // setMouseOnArgs enables tmux mouse mode so the terminal's SGR mouse-wheel // reports scroll the pane via copy-mode; without it, wheel scrolling no-ops. // Pane-targeting, so no `=` prefix (see setStatusOffArgs). func setMouseOnArgs(id string) []string { return []string{"set-option", "-t", id, "mouse", "on"} } // killSessionArgs builds args for `tmux kill-session -t =`. The `=` prefix // requests exact-name matching so a session "foo" does not accidentally match // "foobar" (tmux otherwise does unique-prefix matching). func killSessionArgs(id string) []string { return []string{"kill-session", "-t", exactSessionTarget(id)} } // hasSessionArgs builds args for `tmux has-session -t =`. The `=` prefix // requests exact-name matching (see killSessionArgs). func hasSessionArgs(id string) []string { return []string{"has-session", "-t", exactSessionTarget(id)} } // exactSessionTarget wraps id in tmux's exact-match prefix `=` so session- // selection commands (-t) target only the session with that precise name. // Only kill-session and has-session support this prefix; pane-targeting // commands (send-keys, capture-pane, set-option) use a plain session name. func exactSessionTarget(id string) string { return "=" + id } // sendKeysLiteralArgs builds args for `tmux send-keys -t -l `. // The -l flag stops tmux interpreting words like "Enter" as key names so the // text is sent verbatim. func sendKeysLiteralArgs(id, chunk string) []string { return []string{"send-keys", "-t", id, "-l", chunk} } // sendEnterArgs builds args for `tmux send-keys -t Enter` to submit the // queued input. func sendEnterArgs(id string) []string { return []string{"send-keys", "-t", id, "Enter"} } // capturePaneArgs builds args for `tmux capture-pane -t -p -S -`. // -p prints to stdout; -S - starts n lines back in history. func capturePaneArgs(id string, lines int) []string { return []string{"capture-pane", "-t", id, "-p", "-S", fmt.Sprintf("-%d", lines)} }