From a8646cb75e8df7eb939a541b885c407ed18ba5b0 Mon Sep 17 00:00:00 2001 From: shaoying Date: Sun, 22 Dec 2019 23:38:32 +0800 Subject: [PATCH] add tmux.go --- core/chat/conf.go | 1 + core/wiki/template.go | 31 +++++++ misc/shy.go | 5 ++ misc/tmux/tmux.go | 202 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 239 insertions(+) create mode 100644 core/chat/conf.go create mode 100644 core/wiki/template.go create mode 100644 misc/shy.go create mode 100644 misc/tmux/tmux.go diff --git a/core/chat/conf.go b/core/chat/conf.go new file mode 100644 index 00000000..5c2cd9a8 --- /dev/null +++ b/core/chat/conf.go @@ -0,0 +1 @@ +package chat diff --git a/core/wiki/template.go b/core/wiki/template.go new file mode 100644 index 00000000..a0bf010b --- /dev/null +++ b/core/wiki/template.go @@ -0,0 +1,31 @@ +package wiki + +var title = `{{.Option "prefix"}}{{.Option "content"}}` + +var shell = `
$ {{.Option "input"}} +{{.Option "output"}}
` + +var order = `` + +var table = ` +{{range $i, $v := .Optionv "head"}}{{end}} +{{range $index, $value := .Optionv "list"}} +{{range $i, $v := $value}}{{end}} +{{end}} +
{{$v}}
{{$v}}
` + +var prefix = `` + +var premenu = `` +var endmenu = `` diff --git a/misc/shy.go b/misc/shy.go new file mode 100644 index 00000000..5b3d8395 --- /dev/null +++ b/misc/shy.go @@ -0,0 +1,5 @@ +package misc + +import ( + _ "github.com/shylinux/icebergs/misc/tmux" +) diff --git a/misc/tmux/tmux.go b/misc/tmux/tmux.go new file mode 100644 index 00000000..90a8b974 --- /dev/null +++ b/misc/tmux/tmux.go @@ -0,0 +1,202 @@ +package tmux + +import ( + "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/cli" + "github.com/shylinux/toolkits" + "strings" + "time" +) + +type Frame struct { +} + +func (f *Frame) Spawn(m *ice.Message, c *ice.Context, arg ...string) ice.Server { + return &Frame{} +} +func (f *Frame) Begin(m *ice.Message, arg ...string) ice.Server { + return f +} +func (f *Frame) Start(m *ice.Message, arg ...string) bool { + return true +} +func (f *Frame) Close(m *ice.Message, arg ...string) bool { + return true +} + +var Index = &ice.Context{Name: "tmux", Help: "终端模块", + Caches: map[string]*ice.Cache{}, + Configs: map[string]*ice.Config{ + "buffer": {Name: "buffer", Help: "缓存", Value: kit.Data()}, + "session": {Name: "session", Help: "会话", Value: kit.Data( + "format", "#{session_id},#{session_attached},#{session_name},#{session_windows},#{session_height},#{session_width}", + "fields", "id,tag,session,windows,height,width", + "cmd", []interface{}{"cli.system", "tmux", "list-session"}, + )}, + "windows": {Name: "window", Help: "窗口", Value: kit.Data( + "format", "#{window_id},#{window_active},#{window_name},#{window_panes},#{window_height},#{window_width}", + "fields", "id,tag,window,panes,height,width", + "cmd", []interface{}{"cli.system", "tmux", "list-windows"}, + )}, + "panes": {Name: "pane", Help: "终端", Value: kit.Data( + "format", "#{pane_id},#{pane_active},#{pane_index},#{pane_tty},#{pane_height},#{pane_width}", + "fields", "id,tag,pane,tty,height,width", + "cmd", []interface{}{"cli.system", "tmux", "list-panes"}, + )}, + "view": {Name: "pane", Help: "终端", Value: kit.Data( + "format", "#{pane_id},#{pane_active},#{pane_index},#{pane_tty},#{pane_height},#{pane_width}", + "fields", "id,tag,pane,tty,height,width", + "cmd", []interface{}{"cli.system", "tmux", "list-panes"}, + )}, + }, + Commands: map[string]*ice.Command{ + ice.ICE_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmd(ice.GDB_EVENT, "listen", "miss.start", "cli.tmux.session") + }}, + ice.ICE_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + }}, + "buffer": {Name: "buffer", Help: "终端", + List: kit.List( + kit.MDB_TYPE, "text", "name", "buffer", "action", "auto", + kit.MDB_TYPE, "text", "name", "value", + kit.MDB_TYPE, "button", "value", "查看", "action", "auto", + kit.MDB_TYPE, "button", "value", "返回", "cb", "Last", + ), + Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) == 0 { + // 缓存列表 + for i, v := range kit.Split(m.Cmdx("cli.system", "tmux", "list-buffers"), "\n") { + ls := strings.SplitN(v, ": ", 3) + m.Push("buffer", ls[0]) + m.Push("size", ls[1]) + if i < 3 { + m.Push("text", m.Cmdx("cli.system", "tmux", "show-buffer", "-b", ls[0])) + } else { + m.Push("text", ls[2][1:]) + } + } + return + } + + if len(arg) > 1 { + // 设置缓存 + m.Cmd("cli.system", "tmux", "set-buffer", "-b", arg[0], arg[1]) + } + + // 查看缓存 + m.Cmdy("cli.system", "tmux", "show-buffer", "-b", arg[0]).Set("append") + }}, + "session": {Name: "session", Help: "会话", List: kit.List( + kit.MDB_TYPE, "text", "name", "session", "action", "auto", + kit.MDB_TYPE, "text", "name", "window", "action", "auto", + kit.MDB_TYPE, "text", "name", "pane", "action", "auto", + kit.MDB_TYPE, "button", "value", "查看", "action", "auto", + kit.MDB_TYPE, "button", "value", "返回", "cb", "Last", + ), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + prefix := []string{"cli.system", "tmux"} + if len(arg) > 3 { + switch arg[1] { + case "select": + if arg[2] == "session" { + // 选择会话 + m.Cmd(prefix, "switch-client", "-t", arg[3]) + arg = arg[:0] + break + } + + if m.Cmd(prefix, "switch-client", "-t", m.Option("session")); arg[2] == "window" { + // 选择窗口 + m.Cmd(prefix, "select-window", "-t", m.Option("session")+":"+arg[3]) + arg = []string{m.Option("session")} + break + } + + if m.Cmd(prefix, "select-window", "-t", m.Option("session")+":"+m.Option("window")); arg[2] == "pane" { + // 选择终端 + m.Cmd(prefix, "select-pane", "-t", m.Option("session")+":"+m.Option("window")+"."+arg[3]) + arg = []string{m.Option("session"), m.Option("window")} + } + case "modify": + switch arg[2] { + case "session": + // 重命名会话 + m.Cmd(prefix, "rename-session", "-t", arg[4], arg[3]) + arg = arg[:0] + case "window": + // 重命名窗口 + m.Cmd(prefix, "rename-window", "-t", m.Option("session")+":"+arg[4], arg[3]) + arg = []string{m.Option("session")} + } + case "delete": + switch arg[2] { + case "session": + // 删除会话 + m.Cmd(prefix, "kill-session", "-t", arg[3]) + arg = arg[:0] + case "window": + // 删除窗口 + m.Cmd(prefix, "kill-window", "-t", m.Option("session")+":"+arg[3]) + arg = []string{m.Option("session")} + case "pane": + // 删除终端 + m.Cmd(prefix, "kill-pane", "-t", m.Option("session")+":"+m.Option("window")+"."+arg[3]) + arg = []string{m.Option("session"), m.Option("window")} + } + } + } + + if len(arg) == 0 { + // 会话列表 + m.Split(m.Cmdx(m.Confv(cmd, "meta.cmd"), + "-F", m.Conf(cmd, "meta.format")), m.Conf(cmd, "meta.fields"), ",", "\n") + return + } + + target := arg[0] + if m.Cmd(prefix, "has-session", "-t", target).Append("code") != "0" { + // 创建会话 + m.Cmd(prefix, "new-session", "-ds", arg[0]) + } + + if len(arg) == 1 { + // 窗口列表 + m.Cmdy("windows", target) + return + } + + if target = arg[0] + ":" + arg[1]; m.Cmd(prefix, "rename-window", "-t", target, arg[1]).Append("code") != "0" { + // 创建窗口 + m.Cmd(prefix, "switch-client", "-t", arg[0]) + m.Cmd(prefix, "new-window", "-t", arg[0], "-dn", arg[1]) + } + + if len(arg) == 2 { + // 终端列表 + m.Cmdy("panes", target) + return + } + + if target = arg[0] + ":" + arg[1] + "." + arg[2]; len(arg) > 3 { + // 执行命令 + m.Cmd(prefix, "send-keys", "-t", target, strings.Join(arg[3:], " "), "Enter") + time.Sleep(1 * time.Second) + } + + // 终端内容 + m.Cmdy("view", target) + }}, + "windows": {Name: "window", Help: "窗口", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Split(m.Cmdx(m.Confv(cmd, "meta.cmd"), "-t", kit.Select("", arg, 0), + "-F", m.Conf(cmd, "meta.format")), m.Conf(cmd, "meta.fields"), ",", "\n") + }}, + "panes": {Name: "pane", Help: "终端", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Split(m.Cmdx(m.Confv(cmd, "meta.cmd"), "-t", kit.Select("", arg, 0), + "-F", m.Conf(cmd, "meta.format")), m.Conf(cmd, "meta.fields"), ",", "\n") + }}, + "view": {Name: "view", Help: "终端", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmdy("cli.system", "tmux", "capture-pane", "-pt", kit.Select("", arg, 0)).Set("append") + }}, + }, +} + +func init() { cli.Index.Register(Index, &Frame{}) }