forked from x/icebergs
199 lines
7.1 KiB
Go
199 lines
7.1 KiB
Go
package tmux
|
|
|
|
import (
|
|
"path"
|
|
"strings"
|
|
|
|
ice "shylinux.com/x/icebergs"
|
|
"shylinux.com/x/icebergs/base/cli"
|
|
"shylinux.com/x/icebergs/base/ctx"
|
|
"shylinux.com/x/icebergs/base/lex"
|
|
"shylinux.com/x/icebergs/base/mdb"
|
|
"shylinux.com/x/icebergs/base/nfs"
|
|
"shylinux.com/x/icebergs/base/web"
|
|
"shylinux.com/x/icebergs/core/code"
|
|
kit "shylinux.com/x/toolkits"
|
|
)
|
|
|
|
func _tmux_key(arg ...string) string {
|
|
if len(arg) > 2 {
|
|
return arg[0] + nfs.DF + arg[1] + nfs.PT + arg[2]
|
|
} else if len(arg) > 1 {
|
|
return arg[0] + nfs.DF + arg[1]
|
|
} else if len(arg) > 0 {
|
|
return arg[0]
|
|
} else {
|
|
return "miss"
|
|
}
|
|
}
|
|
|
|
const (
|
|
FORMAT = "format"
|
|
FIELDS = "fields"
|
|
)
|
|
const (
|
|
SESSION = "session"
|
|
WINDOW = "window"
|
|
PANE = "pane"
|
|
VIEW = "view"
|
|
CMD = "cmd"
|
|
)
|
|
const (
|
|
NEW_SESSION = "new-session"
|
|
NEW_WINDOW = "new-window"
|
|
LINK_WINDOW = "link-window"
|
|
SPLIT_WINDOW = "split-window"
|
|
|
|
KILL_PANE = "kill-pane"
|
|
KILL_WINDOW = "kill-window"
|
|
KILL_SESSION = "kill-session"
|
|
|
|
RENAME_WINDOW = "rename-window"
|
|
RENAME_SESSION = "rename-session"
|
|
SWITCH_CLIENT = "switch-client"
|
|
SELECT_WINDOW = "select-window"
|
|
SELECT_PANE = "select-pane"
|
|
|
|
LIST_SESSION = "list-session"
|
|
LIST_WINDOWS = "list-windows"
|
|
LIST_PANES = "list-panes"
|
|
|
|
SEND_KEYS = "send-keys"
|
|
CAPTURE_PANE = "capture-pane"
|
|
ENTER = "Enter"
|
|
)
|
|
|
|
func init() {
|
|
Index.Merge(&ice.Context{Configs: ice.Configs{
|
|
SESSION: {Value: kit.Data(
|
|
FORMAT, "#{session_id},#{session_attached},#{session_name},#{session_windows},#{session_height},#{session_width}",
|
|
FIELDS, "id,tag,session,windows,height,width",
|
|
)},
|
|
WINDOW: {Value: kit.Data(
|
|
FORMAT, "#{window_id},#{window_active},#{window_name},#{window_panes},#{window_height},#{window_width}",
|
|
FIELDS, "id,tag,window,panes,height,width",
|
|
)},
|
|
PANE: {Value: kit.Data(
|
|
FORMAT, "#{pane_id},#{pane_active},#{pane_index},#{pane_tty},#{pane_height},#{pane_width},#{pane_current_command}",
|
|
FIELDS, "id,tag,pane,tty,height,width,cmd",
|
|
)},
|
|
}, Commands: ice.Commands{
|
|
SESSION: {Name: "session session window pane cmds auto", Help: "会话", Actions: ice.Actions{
|
|
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
|
|
if m.Option(ctx.ACTION) == SCRIPT {
|
|
m.Cmdy(SCRIPT, mdb.INPUTS, arg)
|
|
return
|
|
}
|
|
switch arg[0] {
|
|
case mdb.NAME:
|
|
m.Cmdy(web.DREAM).Cut("name,size,time")
|
|
}
|
|
}},
|
|
mdb.CREATE: {Name: "create name", Hand: func(m *ice.Message, arg ...string) {
|
|
if m.Option(cli.CMD_ENV, "TMUX", ""); m.Option(PANE) != "" {
|
|
_tmux_cmd(m, SPLIT_WINDOW, "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE)))
|
|
} else if m.Option(WINDOW) != "" {
|
|
_tmux_cmd(m, SPLIT_WINDOW, "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW)))
|
|
} else if m.Option(SESSION) != "" {
|
|
_tmux_cmd(m, NEW_WINDOW, "-d", "-t", m.Option(SESSION), "-n", m.Option(mdb.NAME))
|
|
} else {
|
|
m.Option(cli.CMD_DIR, path.Join(ice.USR_LOCAL_WORK, m.Option(mdb.NAME)))
|
|
ls := kit.Split(m.Option(mdb.NAME), "-")
|
|
name := kit.Select(ls[0], ls, 1)
|
|
if !cli.IsSuccess(_tmux_cmd(m, NEW_SESSION, "-d", "-s", m.Option(mdb.NAME), "-n", name)) {
|
|
return
|
|
}
|
|
name = _tmux_key(m.Option(mdb.NAME), name)
|
|
if !cli.IsSuccess(_tmux_cmd(m, SPLIT_WINDOW, "-t", kit.Keys(name, "1"), "-p", "40")) {
|
|
return
|
|
}
|
|
m.Go(func() {
|
|
m.Sleep300ms()
|
|
_tmux_cmd(m, SEND_KEYS, "-t", kit.Keys(name, "2"), "ish_miss_log", ENTER)
|
|
_tmux_cmd(m, SEND_KEYS, "-t", kit.Keys(name, "1"), "vi etc/miss.sh", ENTER)
|
|
})
|
|
if m.Cmd(PANE, _tmux_key("miss", name)).Length() == 0 {
|
|
_tmux_cmd(m, LINK_WINDOW, "-s", name, "-t", "miss:")
|
|
}
|
|
}
|
|
}},
|
|
mdb.REMOVE: {Hand: func(m *ice.Message, arg ...string) {
|
|
if m.Option(PANE) != "" {
|
|
_tmux_cmd(m, KILL_PANE, "-t", kit.Select(_tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE)), m.Option(mdb.ID)))
|
|
} else if m.Option(WINDOW) != "" {
|
|
_tmux_cmd(m, KILL_WINDOW, "-t", kit.Select(_tmux_key(m.Option(SESSION), m.Option(WINDOW)), m.Option(mdb.ID)))
|
|
} else if m.Option(SESSION) != "" {
|
|
_tmux_cmd(m, KILL_SESSION, "-t", m.Option(SESSION))
|
|
}
|
|
}},
|
|
mdb.MODIFY: {Hand: func(m *ice.Message, arg ...string) {
|
|
switch arg[0] {
|
|
case WINDOW:
|
|
_tmux_cmd(m, RENAME_WINDOW, "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW)), arg[1])
|
|
case SESSION:
|
|
_tmux_cmd(m, RENAME_SESSION, "-t", m.Option(SESSION), arg[1])
|
|
}
|
|
}},
|
|
mdb.SELECT: {Help: "切入", Hand: func(m *ice.Message, arg ...string) {
|
|
if _tmux_cmd(m, SWITCH_CLIENT, "-t", m.Option(SESSION)); m.Option(WINDOW) != "" {
|
|
_tmux_cmd(m, SELECT_WINDOW, "-t", kit.Select(_tmux_key(m.Option(SESSION), m.Option(WINDOW)), m.Option(mdb.ID)))
|
|
}
|
|
if m.Option(PANE) != "" {
|
|
_tmux_cmd(m, SELECT_PANE, "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE)))
|
|
}
|
|
}},
|
|
code.XTERM: {Help: "终端", Hand: func(m *ice.Message, arg ...string) {
|
|
if m.Option(WINDOW) == "" {
|
|
ctx.ProcessField(m, web.CODE_XTERM, []string{"tmux attach -t " + m.Option(SESSION)}, arg...)
|
|
}
|
|
}},
|
|
SCRIPT: {Name: "script name", Help: "脚本", Hand: func(m *ice.Message, arg ...string) {
|
|
m.Cmd(SCRIPT, m.Option(mdb.NAME), func(value ice.Maps) {
|
|
kit.For(kit.SplitLine(value[mdb.TEXT]), func(line string) {
|
|
kit.Switch(value[mdb.TYPE],
|
|
"shell", func() { m.Cmd(CMD, _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE)), line) },
|
|
"vim", func() { m.Cmd(CMD, _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE)), line) },
|
|
"tmux", func() { _tmux_cmd(m, line) },
|
|
)
|
|
})
|
|
}).Sleep30ms()
|
|
}},
|
|
web.DREAM_CREATE: {Hand: func(m *ice.Message, arg ...string) {
|
|
m.Go(func() {
|
|
nfs.Exists(m.Sleep3s(), path.Join(ice.USR_LOCAL_WORK, m.Option(mdb.NAME)), func(p string) { m.Cmd("", mdb.CREATE) })
|
|
})
|
|
}},
|
|
}, Hand: func(m *ice.Message, arg ...string) {
|
|
if m.Action(SCRIPT); len(arg) > 3 {
|
|
m.Cmd(CMD, _tmux_key(arg[0], arg[1], arg[2]), arg[3:])
|
|
}
|
|
if len(arg) > 2 {
|
|
m.Echo(strings.TrimSpace(m.Cmdx(VIEW, _tmux_key(arg[0], arg[1], arg[2]))))
|
|
return
|
|
}
|
|
if m.Action(mdb.CREATE); len(arg) > 1 {
|
|
m.Cmdy(PANE, _tmux_key(arg[0], arg[1]))
|
|
} else if len(arg) > 0 {
|
|
m.Cmdy(WINDOW, arg[0])
|
|
} else {
|
|
m.Split(_tmux_cmd(m, LIST_SESSION, "-F", mdb.Config(m, FORMAT)).Result(), mdb.Config(m, FIELDS), mdb.FS, lex.NL)
|
|
}
|
|
m.Table(func(value ice.Maps) {
|
|
kit.If(value["tag"] == "1", func() { m.PushButton("") }, func() { m.PushButton(code.XTERM, mdb.SELECT, mdb.REMOVE) })
|
|
})
|
|
}},
|
|
WINDOW: {Hand: func(m *ice.Message, arg ...string) {
|
|
m.Split(m.Cmdx(cli.SYSTEM, TMUX, LIST_WINDOWS, "-t", kit.Select("", arg, 0), "-F", mdb.Config(m, FORMAT)), mdb.Config(m, FIELDS), mdb.FS, lex.NL)
|
|
}},
|
|
PANE: {Hand: func(m *ice.Message, arg ...string) {
|
|
m.Split(_tmux_cmds(m, LIST_PANES, "-t", kit.Select("", arg, 0), "-F", mdb.Config(m, FORMAT)), mdb.Config(m, FIELDS), mdb.FS, lex.NL)
|
|
}},
|
|
VIEW: {Hand: func(m *ice.Message, arg ...string) {
|
|
m.Echo(_tmux_cmds(m, CAPTURE_PANE, "-p", "-t", kit.Select("", arg, 0)))
|
|
}},
|
|
CMD: {Hand: func(m *ice.Message, arg ...string) {
|
|
_tmux_cmd(m, SEND_KEYS, "-t", arg[0], strings.Join(arg[1:], lex.SP), ENTER)
|
|
}},
|
|
}})
|
|
}
|