diff --git a/base/mdb/list.go b/base/mdb/list.go index 219434a3..69592f6f 100644 --- a/base/mdb/list.go +++ b/base/mdb/list.go @@ -14,7 +14,6 @@ func _list_fields(m *ice.Message) []string { } func _list_inputs(m *ice.Message, prefix, chain string, field, value string) { list := map[string]int{} - m.Debug("what %v %v", prefix, chain) m.Grows(prefix, chain, "", "", func(index int, val map[string]interface{}) { if val = kit.GetMeta(val); kit.Format(val[kit.MDB_COUNT]) != "" { list[kit.Format(val[field])] = kit.Int(val[kit.MDB_COUNT]) @@ -74,6 +73,7 @@ func _list_export(m *ice.Message, prefix, chain, file string) { count := 0 head := kit.Split(m.OptionFields()) + m.Option(ice.CACHE_LIMIT, "-1") m.Grows(prefix, chain, "", "", func(index int, val map[string]interface{}) { if val = kit.GetMeta(val); index == 0 { if len(head) == 0 || head[0] == "detail" { // 默认表头 diff --git a/base/ssh/scripts.go b/base/ssh/scripts.go index 57cd76e9..a8440f4a 100644 --- a/base/ssh/scripts.go +++ b/base/ssh/scripts.go @@ -281,11 +281,11 @@ func init() { f.ps1 = arg f.prompt(m) }}, - PRINTF: {Name: "printf run:button text:textarea", Help: "输出显示", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + PRINTF: {Name: "printf run:button text", Help: "输出显示", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { f := m.Optionv(FRAME).(*Frame) f.printf(m, arg[0]) }}, - SCREEN: {Name: "screen run:button text:textarea", Help: "输出命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + SCREEN: {Name: "screen run:button text", Help: "输出命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { f := m.Optionv(FRAME).(*Frame) for _, line := range kit.Split(arg[0], ice.NL, ice.NL) { fmt.Fprintf(f.pipe, line+ice.NL) diff --git a/base/yac/script.go b/base/yac/script.go index ab48ad1e..9b6738d0 100644 --- a/base/yac/script.go +++ b/base/yac/script.go @@ -96,7 +96,7 @@ const SCRIPT = "script" func init() { Index.Merge(&ice.Context{Commands: map[string]*ice.Command{ - SCRIPT: {Name: "script name npage text:textarea auto create", Help: "脚本解析", Action: map[string]*ice.Action{ + SCRIPT: {Name: "script name npage text auto create", Help: "脚本解析", Action: map[string]*ice.Action{ mdb.CREATE: {Name: "create name=shy text=etc/yac.txt", Help: "创建", Hand: func(m *ice.Message, arg ...string) { m.Cmd(MATRIX, mdb.CREATE, m.Option(kit.MDB_NAME)) if buf, err := ioutil.ReadFile(m.Option(kit.MDB_TEXT)); err == nil { diff --git a/conf.go b/conf.go index dd0c116e..97f4a470 100644 --- a/conf.go +++ b/conf.go @@ -3,8 +3,10 @@ package ice const ( TB = "\t" SP = " " + DF = ":" PS = "/" PT = "." + FS = "," NL = "\n" OF = " of " diff --git a/core/wiki/parse.go b/core/wiki/parse.go index d4184857..92c3e309 100644 --- a/core/wiki/parse.go +++ b/core/wiki/parse.go @@ -17,7 +17,7 @@ const PARSE = "parse" func init() { Index.Merge(&ice.Context{Commands: map[string]*ice.Command{ - PARSE: {Name: "parse type=auto,base64,json,http,form,time,list auto text:textarea", Help: "解析", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + PARSE: {Name: "parse type=auto,base64,json,http,form,time,list auto text", Help: "解析", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) < 2 { return } diff --git a/misc.go b/misc.go index e4bafd7a..28fa1a4d 100644 --- a/misc.go +++ b/misc.go @@ -260,8 +260,12 @@ func (c *Context) split(name string) (list []interface{}) { ls := kit.Split(name, SP, ":=@") for i := 1; i < len(ls); i++ { switch ls[i] { + case "run": + item = kit.Dict(kit.MDB_TYPE, BUTTON, kit.MDB_NAME, "run") + list = append(list, item) case "text": - list = append(list, kit.List(kit.MDB_TYPE, TEXTAREA, kit.MDB_NAME, "text")...) + item = kit.Dict(kit.MDB_TYPE, TEXTAREA, kit.MDB_NAME, "text") + list = append(list, item) case "auto": list = append(list, kit.List(kit.MDB_TYPE, BUTTON, kit.MDB_NAME, "list", kit.MDB_ACTION, AUTO)...) list = append(list, kit.List(kit.MDB_TYPE, BUTTON, kit.MDB_NAME, "back")...) diff --git a/misc/tmux/buffer.go b/misc/tmux/buffer.go index bf9367f5..63d4e6cb 100644 --- a/misc/tmux/buffer.go +++ b/misc/tmux/buffer.go @@ -10,9 +10,10 @@ import ( kit "shylinux.com/x/toolkits" ) -const TEXT = "text" - -const BUFFER = "buffer" +const ( + BUFFER = "buffer" + TEXT = "text" +) func init() { Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ @@ -40,6 +41,7 @@ func init() { m.Config(mdb.LIST, "") m.Config(kit.MDB_COUNT, "0") + m.Option(ice.CACHE_LIMIT, "-1") m.Cmdy(mdb.IMPORT, m.PrefixKey(), "", mdb.LIST) m.Grows(m.PrefixKey(), "", "", "", func(index int, value map[string]interface{}) { m.Cmd(cli.SYSTEM, TMUX, "set-buffer", "-b", value[kit.MDB_NAME], value[kit.MDB_TEXT]) @@ -77,7 +79,6 @@ func init() { text := m.Cmdx(cli.SYSTEM, TMUX, "show-buffer") m.EchoQRCode(text) m.EchoScript(text) - m.Render("") }}, }}) } diff --git a/misc/tmux/session.go b/misc/tmux/session.go index 50a46bff..72981079 100644 --- a/misc/tmux/session.go +++ b/misc/tmux/session.go @@ -6,12 +6,22 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/cli" + "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" - "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/web" kit "shylinux.com/x/toolkits" ) +func _tmux_key(arg ...string) string { + if len(arg) > 2 { + return arg[0] + ice.DF + arg[1] + ice.PT + arg[2] + } else if len(arg) > 1 { + return arg[0] + ice.DF + arg[1] + } else { + return arg[0] + } +} + const ( FORMAT = "format" FIELDS = "fields" @@ -22,6 +32,7 @@ const ( WINDOW = "window" PANE = "pane" VIEW = "view" + CMD = "cmd" ) func init() { @@ -35,21 +46,33 @@ func init() { FIELDS, "id,tag,window,panes,height,width", )}, PANE: {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", + 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: map[string]*ice.Command{ SESSION: {Name: "session session window pane cmd auto create script", Help: "会话管理", Action: map[string]*ice.Action{ web.DREAM_CREATE: {Name: "dream.create type name", Help: "梦想", Hand: func(m *ice.Message, arg ...string) { - m.Cmd(m.Prefix(SESSION), mdb.CREATE) + if kit.IndexOf(m.Cmd(m.PrefixKey()).Appendv(SESSION), m.Option(kit.MDB_NAME)) == -1 { + m.Cmd(m.PrefixKey(), mdb.CREATE) + } + }}, + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + if m.Option(ctx.ACTION) == SCRIPT { + m.Cmdy(SCRIPT, mdb.INPUTS, arg) + return + } + switch arg[0] { + case kit.MDB_NAME: + m.Cmdy(web.DREAM).Cut("name,size,time") + } }}, mdb.CREATE: {Name: "create name", Help: "添加", Hand: func(m *ice.Message, arg ...string) { m.Option(cli.CMD_ENV, TMUX, "") - if m.Option(PANE) != "" { - m.Cmdy(cli.SYSTEM, TMUX, "split-window", "-t", m.Option(SESSION)+":"+m.Option(WINDOW)+"."+m.Option(PANE)) + if m.Option(PANE) != "" { // 创建终端 + m.Cmdy(cli.SYSTEM, TMUX, "split-window", "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE))) - } else if m.Option(WINDOW) != "" { - m.Cmdy(cli.SYSTEM, TMUX, "split-window", "-t", m.Option(SESSION)+":"+m.Option(WINDOW)) + } else if m.Option(WINDOW) != "" { // 创建终端 + m.Cmdy(cli.SYSTEM, TMUX, "split-window", "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW))) } else if m.Option(SESSION) != "" { // 创建窗口 m.Cmdy(cli.SYSTEM, TMUX, "new-window", "-t", m.Option(SESSION), "-dn", m.Option(kit.MDB_NAME)) @@ -60,7 +83,7 @@ func init() { name := ls[len(ls)-1] m.Cmdy(cli.SYSTEM, TMUX, "new-session", "-ds", m.Option(kit.MDB_NAME), "-n", name) - name = m.Option(kit.MDB_NAME) + ":" + ls[len(ls)-1] + name = _tmux_key(m.Option(kit.MDB_NAME), ls[len(ls)-1]) m.Cmdy(cli.SYSTEM, TMUX, "split-window", "-t", kit.Keys(name, "1"), "-p", "20") m.Cmdy(cli.SYSTEM, TMUX, "split-window", "-t", kit.Keys(name, "2"), "-h") @@ -73,10 +96,21 @@ func init() { } m.ProcessRefresh30ms() }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + if m.Option(PANE) != "" { // 删除终端 + m.Cmd(cli.SYSTEM, TMUX, "kill-pane", "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE))) + + } else if m.Option(WINDOW) != "" { // 删除窗口 + m.Cmd(cli.SYSTEM, TMUX, "kill-window", "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW))) + + } else if m.Option(SESSION) != "" { // 删除会话 + m.Cmd(cli.SYSTEM, TMUX, "kill-session", "-t", m.Option(SESSION)) + } + }}, mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { switch arg[0] { case WINDOW: // 重命名窗口 - m.Cmd(cli.SYSTEM, TMUX, "rename-window", "-t", m.Option(SESSION)+":"+m.Option(WINDOW), arg[1]) + m.Cmd(cli.SYSTEM, TMUX, "rename-window", "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW)), arg[1]) case SESSION: // 重命名会话 m.Cmd(cli.SYSTEM, TMUX, "rename-session", "-t", m.Option(SESSION), arg[1]) @@ -84,75 +118,54 @@ func init() { }}, mdb.SELECT: {Name: "select", Help: "进入", Hand: func(m *ice.Message, arg ...string) { m.Cmd(cli.SYSTEM, TMUX, "switch-client", "-t", m.Option(SESSION)) - if m.Option(WINDOW) != "" { - m.Cmd(cli.SYSTEM, TMUX, "select-window", "-t", m.Option(SESSION)+":"+m.Option(WINDOW)) + if m.Option(WINDOW) != "" { // 切换窗口 + m.Cmd(cli.SYSTEM, TMUX, "select-window", "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW))) } - if m.Option(PANE) != "" { - m.Cmd(cli.SYSTEM, TMUX, "select-pane", "-t", m.Option(SESSION)+":"+m.Option(WINDOW)+"."+m.Option(PANE)) - } - }}, - mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - if m.Option(PANE) != "" { - m.Cmd(cli.SYSTEM, TMUX, "kill-pane", "-t", m.Option(SESSION)+":"+m.Option(WINDOW)+"."+m.Option(PANE)) - - } else if m.Option(WINDOW) != "" { - m.Cmd(cli.SYSTEM, TMUX, "kill-window", "-t", m.Option(SESSION)+":"+m.Option(WINDOW)) - - } else if m.Option(SESSION) != "" { - m.Cmd(cli.SYSTEM, TMUX, "kill-session", "-t", m.Option(SESSION)) - } - }}, - - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - switch arg[0] { - case kit.MDB_NAME: - m.Option(nfs.DIR_ROOT, m.Conf(web.DREAM, kit.META_PATH)) - m.Cmdy(nfs.DIR, "./", "name size time") - default: - m.Option(mdb.FIELDS, "name,type,text") - m.Cmdy(mdb.SELECT, SCRIPT, "", mdb.HASH) + if m.Option(PANE) != "" { // 切换终端 + m.Cmd(cli.SYSTEM, TMUX, "select-pane", "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE))) } }}, SCRIPT: {Name: "script name", Help: "脚本", Hand: func(m *ice.Message, arg ...string) { - m.Cmd(mdb.SELECT, SCRIPT, "", mdb.HASH, kit.MDB_NAME, m.Option(kit.MDB_NAME)).Table(func(index int, value map[string]string, head []string) { + m.Cmd(SCRIPT, m.Option(kit.MDB_NAME)).Table(func(index int, value map[string]string, head []string) { switch value[kit.MDB_TYPE] { case "shell": - for _, line := range kit.Split(value[kit.MDB_TEXT], "\n", "\n", "\n") { - m.Cmd(cli.SYSTEM, TMUX, "send-keys", "-t", m.Option(SESSION)+":"+m.Option(WINDOW)+"."+m.Option(PANE), line, "Enter") - } - case "tmux": - for _, line := range kit.Split(value[kit.MDB_TEXT], "\n", "\n", "\n") { - m.Cmd(cli.SYSTEM, TMUX, line) + for _, line := range kit.Split(value[kit.MDB_TEXT], ice.NL, ice.NL, ice.NL) { + m.Cmd(CMD, _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE)), line) } case "vim": + for _, line := range kit.Split(value[kit.MDB_TEXT], ice.NL, ice.NL, ice.NL) { + m.Cmd(CMD, _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE)), line) + } + case "tmux": + for _, line := range kit.Split(value[kit.MDB_TEXT], ice.NL, ice.NL, ice.NL) { + m.Cmd(cli.SYSTEM, TMUX, line) + } } }) + m.Sleep("100ms") }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) > 3 { // 执行命令 - target := arg[0] + ":" + arg[1] + "." + arg[2] - m.Cmd(cli.SYSTEM, TMUX, "send-keys", "-t", target, strings.Join(arg[3:], " "), "Enter") - m.Sleep("100ms") + m.Cmd(CMD, _tmux_key(arg[0], arg[1], arg[2]), arg[3:]) } if len(arg) > 2 { // 终端内容 - target := arg[0] + ":" + arg[1] + "." + arg[2] - m.Echo(strings.TrimSpace(m.Cmdx(VIEW, target))) + m.Echo(strings.TrimSpace(m.Cmdx(VIEW, _tmux_key(arg[0], arg[1], arg[2])))) return } - if len(arg) == 2 { // 终端列表 - m.Cmdy(PANE, arg[0]+":"+arg[1]) + if len(arg) > 1 { // 终端列表 + m.Cmdy(PANE, _tmux_key(arg[0], arg[1])) m.PushAction(mdb.SELECT, mdb.REMOVE) return } - if len(arg) == 1 { // 窗口列表 + if len(arg) > 0 { // 窗口列表 m.Cmdy(WINDOW, arg[0]) m.PushAction(mdb.SELECT, mdb.REMOVE) return } // 会话列表 - m.Split(m.Cmdx(cli.SYSTEM, TMUX, "list-session", "-F", m.Conf(m.Prefix(cmd), kit.Keym(FORMAT))), m.Conf(m.Prefix(cmd), kit.Keym(FIELDS)), ",", "\n") + m.Split(m.Cmdx(cli.SYSTEM, TMUX, "list-session", "-F", m.Config(FORMAT)), m.Config(FIELDS), ice.FS, ice.NL) m.Table(func(index int, value map[string]string, head []string) { switch value["tag"] { case "1": @@ -163,15 +176,17 @@ func init() { }) }}, WINDOW: {Name: "windows", Help: "窗口", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Split(m.Cmdx(cli.SYSTEM, TMUX, "list-windows", "-t", kit.Select("", arg, 0), - "-F", m.Conf(m.Prefix(cmd), kit.Keym(FORMAT))), m.Conf(m.Prefix(cmd), kit.Keym(FIELDS)), ",", "\n") + m.Split(m.Cmdx(cli.SYSTEM, TMUX, "list-windows", "-t", kit.Select("", arg, 0), "-F", m.Config(FORMAT)), m.Config(FIELDS), ice.FS, ice.NL) }}, PANE: {Name: "panes", Help: "终端", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Split(m.Cmdx(cli.SYSTEM, TMUX, "list-panes", "-t", kit.Select("", arg, 0), - "-F", m.Conf(m.Prefix(cmd), kit.Keym(FORMAT))), m.Conf(m.Prefix(cmd), kit.Keym(FIELDS)), ",", "\n") + m.Split(m.Cmdx(cli.SYSTEM, TMUX, "list-panes", "-t", kit.Select("", arg, 0), "-F", m.Config(FORMAT)), m.Config(FIELDS), ice.FS, ice.NL) }}, - VIEW: {Name: "view", Help: "终端", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + 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(ice.MSG_APPEND) }}, + CMD: {Name: "cmd", Help: "命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmd(cli.SYSTEM, TMUX, "send-keys", "-t", arg[0], strings.Join(arg[1:], ice.SP), "Enter") + m.Sleep("100ms") + }}, }}) } diff --git a/misc/tmux/tmux.go b/misc/tmux/tmux.go index 6795afc6..2c78ddef 100644 --- a/misc/tmux/tmux.go +++ b/misc/tmux/tmux.go @@ -15,7 +15,7 @@ var Index = &ice.Context{Name: TMUX, Help: "工作台", Configs: map[string]*ice cli.SOURCE, "http://mirrors.tencent.com/macports/distfiles/tmux/tmux-3.2.tar.gz", )}, }, Commands: map[string]*ice.Command{ - TMUX: {Name: "tmux path auto start order build download", Help: "服务", Action: ice.MergeAction(map[string]*ice.Action{ + TMUX: {Name: "tmux session window auto start order build download", Help: "服务", Action: ice.MergeAction(map[string]*ice.Action{ cli.START: {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { m.Optionv(code.PREPARE, func(p string) []string { return []string{"-S", kit.Path(m.Option(cli.CMD_DIR, p), "tmux.socket"), "new-session", "-dn", "miss"} @@ -23,7 +23,7 @@ var Index = &ice.Context{Name: TMUX, Help: "工作台", Configs: map[string]*ice m.Cmdy(code.INSTALL, cli.START, m.Config(cli.SOURCE), "bin/tmux") }}, }, code.InstallAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmdy(code.INSTALL, cli.SOURCE, m.Config(cli.SOURCE), arg) + m.Cmdy(SESSION, arg) }}, }} diff --git a/misc/tmux/tmux.shy b/misc/tmux/tmux.shy index 4d6bbeb7..ce4f3a9d 100644 --- a/misc/tmux/tmux.shy +++ b/misc/tmux/tmux.shy @@ -6,8 +6,8 @@ refer ` ` chapter "源码" -field tmux web.code.tmux.tmux -field tmux web.code.inner args `usr/install/tmux-3.2 cmd-bind-key.c` +field "下载" web.code.tmux.tmux +field "源码" web.code.inner args `usr/install/tmux-3.2/ cmd-bind-key.c` section "构建" spark shell `