diff --git a/core/chat/keyboard.go b/core/chat/keyboard.go new file mode 100644 index 00000000..5382ca28 --- /dev/null +++ b/core/chat/keyboard.go @@ -0,0 +1,42 @@ +package chat + +import ( + ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/ctx" + "shylinux.com/x/icebergs/base/mdb" + "shylinux.com/x/icebergs/base/web" + kit "shylinux.com/x/toolkits" +) + +const KEYBOARD = "keyboard" + +func init() { + Index.MergeCommands(ice.Commands{ + KEYBOARD: {Name: "keyboard hash@keyboard auto", Help: "键盘", Actions: ice.MergeActions(ice.Actions{ + "_refresh": {Name: "refresh", Help: "刷新", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(web.SPACE, m.Option("space"), "refresh") + }}, + "inputs": {Name: "refresh", Help: "刷新", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(web.SPACE, m.Option("space"), "refresh") + }}, + }, mdb.HashAction(mdb.SHORT, "", mdb.FIELD, "time,hash,space,index,input")), Hand: func(m *ice.Message, arg ...string) { + if len(arg) > 0 && arg[0] == ctx.ACTION { + m.Cmd(web.SPACE, m.Option("space"), arg) + return + } + mdb.HashSelect(m, arg...) + if len(arg) > 0 && arg[0] != "" { + meta := kit.UnMarshal(m.Cmd(ctx.COMMAND, m.Append("index")).Append("meta")) + list := []string{} + kit.Fetch(meta, func(key string, value ice.Any) { + if key == "_trans" { + return + } + list = append(list, key) + }) + m.PushAction(kit.Join(list)) + m.Option("meta", kit.Format(meta)) + } + }}, + }) +} diff --git a/core/code/go.go b/core/code/go.go index 08a00c7f..cf0353be 100644 --- a/core/code/go.go +++ b/core/code/go.go @@ -286,7 +286,7 @@ func init() { } }}, COMPLETE: {Hand: func(m *ice.Message, arg ...string) { - if arg[0] == mdb.FOREACH && arg[2] == nfs.SCRIPT { + if len(arg) > 0 && arg[0] == mdb.FOREACH { return } diff --git a/core/code/inner.go b/core/code/inner.go index 1a3f5869..7e7c8f4e 100644 --- a/core/code/inner.go +++ b/core/code/inner.go @@ -14,23 +14,23 @@ import ( kit "shylinux.com/x/toolkits" ) -func _inner_list(m *ice.Message, ext, file, dir string, arg ...string) { +func _inner_list(m *ice.Message, ext, file, dir string) { if aaa.Right(m, dir, file) { if nfs.IsSourceFile(m, ext) { m.Cmdy(nfs.CAT, path.Join(dir, file)) } else { - _inner_show(m, ext, file, dir, arg...) + _inner_show(m, ext, file, dir) } } } -func _inner_show(m *ice.Message, ext, file, dir string, arg ...string) { +func _inner_show(m *ice.Message, ext, file, dir string) { if aaa.Right(m, dir, file) { - m.Cmdy(mdb.RENDER, ext, file, dir, arg) + m.Cmdy(mdb.RENDER, ext, file, dir) } } -func _inner_exec(m *ice.Message, ext, file, dir string, arg ...string) { +func _inner_exec(m *ice.Message, ext, file, dir string) { if aaa.Right(m, dir, file) { - m.Cmdy(mdb.ENGINE, ext, file, dir, arg) + m.Cmdy(mdb.ENGINE, ext, file, dir) } } func _inner_make(m *ice.Message, dir string, msg *ice.Message) { @@ -73,7 +73,7 @@ func _inner_tags(m *ice.Message, dir string, value string) { } else { m.PushRecord(kit.Dict(nfs.PATH, dir, nfs.FILE, strings.TrimPrefix(file, nfs.PWD), nfs.LINE, kit.Format(i), mdb.TEXT, bio.Text())) } - return + break } } } @@ -167,21 +167,12 @@ func init() { return } - list := kit.Simple() - for k, v := range ice.Info.File { - if strings.HasPrefix(k, path.Dir(path.Join(m.Option(nfs.PATH), m.Option(nfs.FILE)))) { - list = append(list, v) - } - } - m.Option("keys", list) - m.Option("module", ice.Info.Make.Module) + arg[1] = strings.Split(arg[1], ice.FS)[0] + _inner_list(m, kit.Ext(arg[1]), arg[1], arg[0]) m.Option("tabs", m.Config("show.tabs")) m.Option("plug", m.Config("show.plug")) m.Option("exts", m.Config("show.exts")) - - arg[1] = strings.Split(arg[1], ice.FS)[0] - _inner_list(m, kit.Ext(arg[1]), arg[1], arg[0]) ctx.DisplayLocal(m, "") }}, }}) diff --git a/core/code/js.go b/core/code/js.go index 2d50f348..9f8f60a8 100644 --- a/core/code/js.go +++ b/core/code/js.go @@ -90,8 +90,12 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) { `) }}, COMPLETE: {Hand: func(m *ice.Message, arg ...string) { - if arg[0] == mdb.FOREACH && arg[2] == nfs.SCRIPT { - m.Push(nfs.FILE, strings.ReplaceAll(arg[1], ice.PT+kit.Ext(arg[1]), ice.PT+JS)) + if len(arg) > 0 && arg[0] == mdb.FOREACH { + switch m.Option(ctx.ACTION) { + case nfs.SCRIPT: + m.Push(nfs.PATH, strings.ReplaceAll(arg[1], ice.PT+kit.Ext(arg[1]), ice.PT+JS)) + m.Cmdy(nfs.DIR, nfs.PWD, kit.Dict(nfs.DIR_ROOT, "src/", nfs.DIR_REG, `.*.(sh|py|shy|js)`, nfs.DIR_DEEP, ice.TRUE), nfs.PATH) + } return } Complete(m, m.Option("text"), kit.Dict( diff --git a/core/code/shy.go b/core/code/shy.go index a7c1c067..876d72f8 100644 --- a/core/code/shy.go +++ b/core/code/shy.go @@ -22,7 +22,6 @@ func _shy_exec(m *ice.Message, arg ...string) { switch kit.Select("", kit.Split(m.Option(mdb.TEXT)), 0) { case "field": m.Cmdy(ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, "", "", ice.OptionFields("index,name,text")) - _vimer_list(m, ice.SRC, ctx.INDEX) case "chain": m.Push(mdb.NAME, cli.FG) diff --git a/core/code/vimer.go b/core/code/vimer.go index 966ecf03..b57accaf 100644 --- a/core/code/vimer.go +++ b/core/code/vimer.go @@ -14,78 +14,25 @@ import ( kit "shylinux.com/x/toolkits" ) -func _vimer_list(m *ice.Message, dir string, arg ...string) { // field - m.Copy(m.Cmd(nfs.DIR, nfs.PWD, kit.Dict(nfs.DIR_ROOT, dir, nfs.DIR_DEEP, ice.TRUE)).Cut(nfs.PATH).RenameAppend(nfs.PATH, kit.Select(mdb.NAME, arg, 0))) -} -func _vimer_inputs(m *ice.Message, arg ...string) { - switch m.Option(ctx.ACTION) { - case nfs.SCRIPT: - switch arg[0] { - case nfs.FILE: - file, ext := m.Option(nfs.FILE), kit.Ext(m.Option(nfs.FILE)) - for _, t := range []string{nfs.SH, nfs.SHY, nfs.PY, nfs.JS} { - m.Push(nfs.FILE, strings.ReplaceAll(file, ice.PT+ext, ice.PT+t)) - } - } - case web.WEBSITE: - switch arg[0] { - case nfs.FILE: - name := kit.TrimExt(kit.Select("hi.zml", arg, 1), "") - m.Push(nfs.FILE, name+".zml") - m.Push(nfs.FILE, name+".iml") - } - case web.DREAM: - m.Cmdy(web.DREAM, mdb.INPUTS, arg) - case AUTOGEN: - m.Cmdy(AUTOGEN, mdb.INPUTS, arg) - case XTERM: - m.Cmdy(XTERM, mdb.INPUTS, arg) - default: - switch arg[0] { - case ctx.INDEX: - m.OptionFields(ctx.INDEX) - m.Cmdy(ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, kit.Select("", arg, 1), "") - case nfs.FILE: - p := kit.Select(nfs.PWD, arg, 1) - m.Option(nfs.DIR_ROOT, m.Option(nfs.PATH)) - m.Option(nfs.DIR_DEEP, strings.HasPrefix(m.Option(nfs.PATH), ice.SRC)) - m.Cmdy(nfs.DIR, kit.Select(path.Dir(p), p, strings.HasSuffix(p, ice.FS))+ice.PS, nfs.DIR_CLI_FIELDS) - m.ProcessAgain() - } - } -} - const VIMER = "vimer" func init() { Index.MergeCommands(ice.Commands{ - VIMER: {Name: "vimer path=src/ file=main.go line=1 list", Help: "编辑器", Actions: ice.Actions{ + VIMER: {Name: "vimer path=src/ file=main.go line=1@keyboard list", Help: "编辑器", Actions: ice.Actions{ mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - switch arg[0] { - case nfs.FILE: - m.Cmdy(COMPLETE, mdb.FOREACH, arg[1], m.Option(ctx.ACTION)) - } - if m.Option(ctx.ACTION) == web.WEBSITE { - switch arg[0] { - case nfs.FILE: - m.Cmdy(nfs.DIR, nfs.PWD, nfs.DIR_CLI_FIELDS, kit.Dict(nfs.DIR_ROOT, "src/website/")).ProcessAgain() - } - return - } - - switch arg[0] { - case cli.MAIN: - m.Cmdy(nfs.DIR, ice.SRC, nfs.DIR_CLI_FIELDS, kit.Dict(nfs.DIR_REG, `.*\.go`)).ProcessAgain() - case mdb.ZONE: - m.Cmdy(nfs.DIR, nfs.PWD, mdb.NAME, kit.Dict(nfs.DIR_ROOT, ice.SRC, nfs.DIR_TYPE, nfs.DIR)).RenameAppend(mdb.NAME, mdb.ZONE) - case "url": - m.Option(nfs.DIR_ROOT, "usr/volcanos/plugin/local/code/") - m.Cmdy(nfs.DIR, nfs.PWD, nfs.DIR_CLI_FIELDS, kit.Dict(nfs.DIR_DEEP, ice.TRUE)).ProcessAgain() + switch m.Option(ctx.ACTION) { + case AUTOGEN, web.DREAM, XTERM: + m.Cmdy(m.Option(ctx.ACTION), mdb.INPUTS, arg) default: - _vimer_inputs(m, arg...) + switch arg[0] { + case ctx.INDEX: + m.OptionFields(ctx.INDEX) + m.Cmdy(ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, kit.Select("", arg, 1), "") + default: + m.Cmdy(COMPLETE, mdb.FOREACH, arg[1], m.Option(ctx.ACTION)) + } } }}, - nfs.SAVE: {Name: "save type file path", Help: "保存", Hand: func(m *ice.Message, arg ...string) { if m.Option(nfs.CONTENT) == "" { m.Option(nfs.CONTENT, m.Cmdx(TEMPLATE, m.Option(mdb.TYPE), m.Option(nfs.FILE), m.Option(nfs.PATH))) @@ -99,28 +46,46 @@ func init() { m.Cmdy(nfs.DEFS, path.Join(m.Option(nfs.PATH), m.Option(nfs.FILE)), m.Cmdx(TEMPLATE, kit.Ext(m.Option(nfs.FILE)), m.Option(nfs.FILE), m.Option(nfs.PATH))) }}, web.WEBSITE: {Name: "website file=hi.zml", Help: "网页", Hand: func(m *ice.Message, arg ...string) { + m.Option(nfs.PATH, "src/website/") m.Cmdy(nfs.DEFS, path.Join(m.Option(nfs.PATH), m.Option(nfs.FILE)), m.Cmdx(TEMPLATE, kit.Ext(m.Option(nfs.FILE)), m.Option(nfs.FILE), m.Option(nfs.PATH))) }}, web.DREAM: {Name: "dream name=hi repos", Help: "空间", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(web.DREAM, cli.START, arg) }}, - - AUTOGEN: {Name: "create name=hi help=示例 type=Zone,Hash,Data,Code main=main.go zone key", Help: "模块", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(AUTOGEN, mdb.CREATE, arg) + XTERM: {Name: "xterm type=sh name text", Help: "终端", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(XTERM, mdb.CREATE, arg) }}, + + TEMPLATE: {Name: "template", Help: "模板", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(TEMPLATE, kit.Ext(m.Option(mdb.FILE)), m.Option(nfs.FILE), m.Option(nfs.PATH)) + }}, + COMPLETE: {Name: "complete", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(COMPLETE, kit.Ext(m.Option(mdb.FILE)), m.Option(nfs.FILE), m.Option(nfs.PATH)) + }}, + + "keyboard": {Name: "keyboard", Help: "远程控制", Hand: func(m *ice.Message, arg ...string) { + hash := m.Cmdx("web.chat.keyboard", mdb.CREATE, "space", m.Option(ice.MSG_DAEMON), "index", m.Option("index"), "input", "") + link := web.MergePodCmd(m, "", "web.chat.keyboard", mdb.HASH, hash) + m.PushQRCode(mdb.TEXT, link) + m.Push(mdb.NAME, link) + }}, + DEVPACK: {Name: "devpack", Help: "开发模式", Hand: func(m *ice.Message, arg ...string) { m.Cmd(nfs.LINK, ice.GO_SUM, path.Join(ice.SRC_DEBUG, ice.GO_SUM)) m.Cmd(nfs.LINK, ice.GO_MOD, path.Join(ice.SRC_DEBUG, ice.GO_MOD)) m.Cmdy(nfs.CAT, ice.GO_MOD) m.Cmdy(WEBPACK, mdb.REMOVE) - m.ProcessInner() web.ToastSuccess(m) + m.ProcessInner() }}, BINPACK: {Name: "binpack", Help: "打包模式", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(WEBPACK, mdb.CREATE) m.Cmdy(AUTOGEN, BINPACK) - m.ProcessInner() web.ToastSuccess(m) + m.ProcessInner() + }}, + AUTOGEN: {Name: "create name=hi help=示例 type=Zone,Hash,Data,Code main=main.go zone key", Help: "模块", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(AUTOGEN, mdb.CREATE, arg) }}, COMPILE: {Name: "compile", Help: "编译", Hand: func(m *ice.Message, arg ...string) { if msg := m.Cmd(COMPILE, ice.SRC_MAIN_GO, ice.BIN_ICE_BIN); cli.IsSuccess(msg) { @@ -132,24 +97,12 @@ func init() { PUBLISH: {Name: "publish", Help: "发布", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(PUBLISH, ice.CONTEXTS) }}, - - TEMPLATE: {Name: "template", Help: "模板", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(TEMPLATE, kit.Ext(m.Option(mdb.FILE)), m.Option(nfs.FILE), m.Option(nfs.PATH)) - }}, - COMPLETE: {Name: "complete", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(COMPLETE, kit.Ext(m.Option(mdb.FILE)), m.Option(nfs.FILE), m.Option(nfs.PATH)) - }}, - XTERM: {Name: "xterm type=sh name", Help: "终端", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(XTERM, mdb.CREATE, arg) - }}, }, Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(INNER, arg) - m.Option("tabs", m.Config("show.tabs")) - m.Option("plug", m.Config("show.plug")) - m.Option("exts", m.Config("show.exts")) - - if arg[0] != ctx.ACTION { + if m.Cmdy(INNER, arg); arg[0] != ctx.ACTION { m.Action(nfs.SAVE, COMPILE, AUTOGEN, nfs.SCRIPT, chat.WEBSITE, web.DREAM, XTERM) + m.Option("tabs", m.Config("show.tabs")) + m.Option("plug", m.Config("show.plug")) + m.Option("exts", m.Config("show.exts")) ctx.DisplayLocal(m, "") } }}, diff --git a/core/code/xterm.go b/core/code/xterm.go index 5a2a87d4..616a7e2e 100644 --- a/core/code/xterm.go +++ b/core/code/xterm.go @@ -77,9 +77,9 @@ func init() { ctx.ProcessField(m, "", arg, arg...) }}, mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - switch mdb.HashInputs(m, arg); arg[0] { + switch mdb.HashInputs(m, arg).Cmdy(FAVOR, "_xterm").Cut(arg[0]); arg[0] { case mdb.TYPE: - m.Cmdy(FAVOR, "_xterm").Cut(mdb.TYPE).Push(arg[0], "bash", "sh") + m.Push(arg[0], "bash", "sh") case mdb.NAME: m.Push(arg[0], ice.Info.HostName, path.Base(m.Option(mdb.TYPE))) } @@ -103,12 +103,12 @@ func init() { web.WEBSITE: {Name: "website", Help: "打开", Hand: func(m *ice.Message, arg ...string) { web.ProcessWebsite(m, "", "", m.OptionSimple(mdb.HASH)) }}, - }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,view", mdb.TOOLS, FAVOR), ctx.ProcessAction()), Hand: func(m *ice.Message, arg ...string) { + }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,view", mdb.TOOLS, FAVOR), ctx.CmdAction(), ctx.ProcessAction()), Hand: func(m *ice.Message, arg ...string) { if mdb.HashSelect(m, arg...); len(arg) == 0 { m.PushAction(web.WEBSITE, mdb.REMOVE) m.Action(mdb.CREATE, mdb.PRUNES) } else { - m.Action("full", INSTALL) + m.Action("波浪线", "反引号", "refresh", "full", INSTALL) ctx.DisplayLocal(m, "") ctx.Toolkit(m) } diff --git a/core/code/zml.go b/core/code/zml.go index 7e83a50a..cc6b64f0 100644 --- a/core/code/zml.go +++ b/core/code/zml.go @@ -8,6 +8,7 @@ import ( "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" + "shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/core/chat" kit "shylinux.com/x/toolkits" ) @@ -30,6 +31,8 @@ func init() { m.Cmd(TEMPLATE, mdb.CREATE, m.CommandKey(), m.PrefixKey()) m.Cmd(COMPLETE, mdb.CREATE, m.CommandKey(), m.PrefixKey()) }}, + mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { + }}, TEMPLATE: {Hand: func(m *ice.Message, arg ...string) { switch kit.Ext(m.Option(mdb.FILE)) { case ZML: @@ -70,13 +73,20 @@ func init() { } }}, COMPLETE: {Hand: func(m *ice.Message, arg ...string) { + if len(arg) > 0 && arg[0] == mdb.FOREACH { + switch m.Option(ctx.ACTION) { + case web.WEBSITE: + m.Cmdy(nfs.DIR, nfs.PWD, kit.Dict(nfs.DIR_ROOT, "src/website/"), nfs.PATH) + } + return + } + switch kit.Select("", kit.Slice(kit.Split(m.Option(mdb.TEXT), "\t \n`"), -1), 0) { case mdb.TYPE: m.Push(mdb.NAME, "menu") case ctx.INDEX: m.Cmdy(ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, "", "", ice.OptionFields("index,name,text")) - _vimer_list(m, ice.SRC, ctx.INDEX) case ctx.ACTION: m.Push(mdb.NAME, "auto")