diff --git a/base/cli/runtime.go b/base/cli/runtime.go index 951680ab..335999af 100644 --- a/base/cli/runtime.go +++ b/base/cli/runtime.go @@ -250,16 +250,6 @@ func init() { } m.StatusTimeCount() }}, - "stats": {Name: "stats", Help: "环境变量", Hand: func(m *ice.Message, arg ...string) { - var ms runtime.MemStats - runtime.ReadMemStats(&ms) - m.Echo("what %#v", ms) - m.Echo("what %#v", kit.FmtSize(int64(ms.Alloc))) - m.Echo("what %#v", kit.FmtSize(int64(ms.TotalAlloc))) - m.Echo("what %#v", kit.FmtSize(int64(ms.Sys))) - m.Echo("what %#v", kit.FmtSize(int64(ms.HeapAlloc))) - m.Echo("what %#v", kit.FmtSize(int64(ms.HeapSys))) - }}, MAKE_DOMAIN: {Name: "make.domain", Help: "编译主机", Hand: func(m *ice.Message, arg ...string) { if os.Getenv(CTX_DEV) == "" || os.Getenv(CTX_POD) == "" { m.Echo(m.Conf(RUNTIME, MAKE_DOMAIN)) diff --git a/base/cli/system.go b/base/cli/system.go index 4260e59d..0c55660a 100644 --- a/base/cli/system.go +++ b/base/cli/system.go @@ -104,7 +104,7 @@ func _system_exec(m *ice.Message, cmd *exec.Cmd) { defer func() { m.Push(CMD_OUT, out.String()) m.Push(CMD_ERR, err.String()) - if m.Echo(kit.Select(out.String(), err.String())); IsSuccess(m) && out.String() == "" { + if m.Echo(strings.TrimRight(kit.Select(out.String(), err.String()), ice.NL)); IsSuccess(m) && out.String() == "" { m.SetAppend() } }() diff --git a/base/ctx/command.go b/base/ctx/command.go index 89743e39..2348213c 100644 --- a/base/ctx/command.go +++ b/base/ctx/command.go @@ -155,20 +155,6 @@ func CmdAction(args ...ice.Any) ice.Actions { }}, } } -func ProcessFloat(m *ice.Message, arg ...string) { - m.Option(ice.MSG_PROCESS, "_float") - m.Option(ice.PROCESS_ARG, arg) - m.Cmdy(COMMAND, arg[0]) -} -func ProcessField(m *ice.Message, cmd string, args []string, arg ...string) { - if len(arg) > 0 && arg[0] == ice.RUN { - m.Cmdy(cmd, arg[1:]) - } else { - if m.Cmdy(COMMAND, cmd).ProcessField(m.ActionKey(), ice.RUN); len(args) > 0 { - m.Push(ARGS, kit.Format(args)) - } - } -} func PodCmd(m *ice.Message, arg ...ice.Any) bool { if pod := m.Option(ice.POD); pod != "" { if m.Option(ice.POD, ""); m.Option(ice.MSG_UPLOAD) != "" { diff --git a/base/ctx/option.go b/base/ctx/option.go index 4a72bd7d..587ef8c7 100644 --- a/base/ctx/option.go +++ b/base/ctx/option.go @@ -5,6 +5,7 @@ import ( "strings" ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/mdb" kit "shylinux.com/x/toolkits" ) @@ -58,3 +59,6 @@ func DisplayBase(m *ice.Message, file string, arg ...ice.Any) *ice.Message { m.Option(ice.MSG_DISPLAY, kit.MergeURL(ice.DisplayBase(file)[ice.DISPLAY], arg...)) return m } +func Toolkit(m *ice.Message, arg ...string) { + m.Option(ice.MSG_TOOLKIT, kit.Select(m.Config(mdb.TOOLS), kit.Fields(arg))) +} diff --git a/base/ctx/process.go b/base/ctx/process.go new file mode 100644 index 00000000..b6ca44f0 --- /dev/null +++ b/base/ctx/process.go @@ -0,0 +1,64 @@ +package ctx + +import ( + ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/aaa" + kit "shylinux.com/x/toolkits" +) + +const PROCESS = "process" + +var _process = map[string]ice.Any{} + +func AddProcess(key string, val ice.Any) { _process[key] = val } + +func Process(m *ice.Message, key string, args []string, arg ...string) { + switch cb := _process[key].(type) { + case func(*ice.Message, []string, ...string): + cb(m, args, arg...) + case string: + if len(arg) == 0 || arg[0] != PROCESS { + m.Cmdy(cb, PROCESS, args) + m.Optionv(ice.FIELD_PREFIX, kit.Simple(m.ActionKey(), m.Optionv(ice.FIELD_PREFIX))) + } else { + m.Cmdy(cb, arg) + } + default: + ProcessField(m, key, args, arg...) + } +} +func ProcessField(m *ice.Message, cmd string, args []string, arg ...string) { + cmd = kit.Select(m.PrefixKey(), cmd) + if len(arg) == 0 || arg[0] != ice.RUN { + if m.Cmdy(COMMAND, cmd).ProcessField(m.ActionKey(), ice.RUN); len(args) > 0 { + m.Push(ARGS, kit.Format(args)) + } + return + } + if aaa.Right(m, cmd, arg[1:]) { + m.Cmdy(cmd, arg[1:]) + } +} +func ProcessFloat(m *ice.Message, arg ...string) { + m.Option(ice.MSG_PROCESS, ice.PROCESS_FLOAT) + m.Option(ice.PROCESS_ARG, arg) + m.Cmdy(COMMAND, arg[0]) +} + +func ProcessHold(m *ice.Message, text ...ice.Any) { + m.Process(ice.PROCESS_HOLD, text...) +} +func ProcessRefresh(m *ice.Message) { + m.ProcessRefresh("300ms") +} + +func ProcessAction() ice.Actions { + return ice.Actions{ + ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { + AddProcess(m.CommandKey(), m.PrefixKey()) + }}, + PROCESS: {Name: "process", Help: "响应", Hand: func(m *ice.Message, arg ...string) { + ProcessField(m, m.PrefixKey(), arg, arg...) + }}, + } +} diff --git a/base/mdb/hash.go b/base/mdb/hash.go index da223eda..b66e6a6b 100644 --- a/base/mdb/hash.go +++ b/base/mdb/hash.go @@ -256,7 +256,7 @@ func HashSelect(m *ice.Message, arg ...string) *ice.Message { return m.StatusTime() } func HashPrunes(m *ice.Message, cb func(Maps) bool) *ice.Message { - expire := kit.Time(kit.Select(m.Time("-72h"), m.Option(EXPIRE))) + expire := kit.Time(kit.Select(m.Time("-72h"), m.Option("before"))) m.Cmd("", func(value Maps) { if kit.Time(value[TIME]) > expire { return diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index a53256c5..414f4392 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -151,6 +151,8 @@ const ( PAGE = "page" OFFEND = "offend" + TOOLS = "tools" + JSON = "json" CSV = "csv" ) diff --git a/base/web/option.go b/base/web/option.go index d10b97e5..a1c23056 100644 --- a/base/web/option.go +++ b/base/web/option.go @@ -119,6 +119,7 @@ func PushPodCmd(m *ice.Message, cmd string, arg ...string) { type Message interface { Option(key string, arg ...ice.Any) string + PrefixKey(arg ...ice.Any) string } func OptionAgentIs(m Message, arg ...string) bool { @@ -143,11 +144,11 @@ func MergePod(m Message, pod string, arg ...ice.Any) string { } func MergePodCmd(m Message, pod, cmd string, arg ...ice.Any) string { p := "/chat" - if pod != "" { - p += "/pod/" + kit.Keys(m.Option(ice.MSG_USERPOD), pod) - } - if cmd != "" { - p += "/cmd/" + cmd - } + p += "/pod/" + kit.Keys(m.Option(ice.MSG_USERPOD), pod) + p = kit.Select(p, "/chat/", p == "/chat/pod/") + p += "/cmd/" + kit.Select(m.PrefixKey(), cmd) return kit.MergeURL2(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), p, arg...) } +func ProcessWebsite(m *ice.Message, pod, cmd string, arg ...ice.Any) { + m.ProcessOpen(MergePodCmd(m, pod, cmd, arg...)) +} diff --git a/conf.go b/conf.go index e8d0431f..02d3be74 100644 --- a/conf.go +++ b/conf.go @@ -190,6 +190,7 @@ const ( // MSG MSG_PROCESS = "_process" MSG_DISPLAY = "_display" + MSG_TOOLKIT = "_toolkit" MSG_USERIP = "user.ip" MSG_USERUA = "user.ua" diff --git a/core/code/favor.go b/core/code/favor.go index 2e7010a1..d7cd2654 100644 --- a/core/code/favor.go +++ b/core/code/favor.go @@ -4,6 +4,7 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" + "shylinux.com/x/icebergs/base/nfs" kit "shylinux.com/x/toolkits" ) @@ -11,13 +12,20 @@ const FAVOR = "favor" func init() { Index.MergeCommands(ice.Commands{ - FAVOR: {Name: "favor zone id auto insert test page", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{ + FAVOR: {Name: "favor zone id auto insert page", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{ mdb.INSERT: {Name: "insert zone=数据结构 type=go name=hi text=hello path file line", Help: "添加"}, INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) { - ctx.ProcessCommand(m, INNER, m.OptionSplit("path,file,line"), arg...) + ctx.Process(m, m.ActionKey(), m.OptionSplit(nfs.PATH, nfs.FILE, nfs.LINE), arg...) }}, - }, mdb.ZoneAction(mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,id,type,name,text,path,file,line")), Hand: func(m *ice.Message, arg ...string) { - mdb.ZoneSelectPage(m, arg...).PushAction(kit.Select(mdb.REMOVE, INNER, len(arg) > 0)) + XTERM: {Name: "xterm", Help: "命令", Hand: func(m *ice.Message, arg ...string) { + ctx.Process(m, m.ActionKey(), append(m.OptionSimple(mdb.TYPE, mdb.NAME), ice.INIT, m.Option(mdb.TEXT)), arg...) + }}, + }, mdb.ZoneAction(mdb.FIELD, "time,id,type,name,text,path,file,line")), Hand: func(m *ice.Message, arg ...string) { + if mdb.ZoneSelectPage(m, arg...); len(arg) > 0 && arg[0] != "" { + m.Tables(func(value ice.Maps) { + m.PushButton(kit.Select(INNER, XTERM, value[mdb.TEXT] == "" || value[nfs.FILE] == "")) + }) + } }}, }) } diff --git a/core/code/go.go b/core/code/go.go index 940afe35..237c6b48 100644 --- a/core/code/go.go +++ b/core/code/go.go @@ -237,6 +237,10 @@ func init() { m.Cmd(mdb.SEARCH, mdb.CREATE, GODOC, m.Prefix(GO)) m.Cmd(mdb.ENGINE, mdb.CREATE, GO, m.Prefix(GO)) + m.Cmd(TEMPLATE, mdb.CREATE, GO, m.Prefix(GO)) + m.Cmd(COMPLETE, mdb.CREATE, GO, m.Prefix(GO)) + m.Cmd(NAVIGATE, mdb.CREATE, GO, m.Prefix(GO)) + LoadPlug(m, GO, MOD, SUM) for _, k := range []string{GO, MOD, SUM, GODOC} { m.Cmd(mdb.RENDER, mdb.CREATE, k, m.Prefix(k)) @@ -273,6 +277,57 @@ func init() { }}, mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _go_exec(m, arg...) }}, mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { _go_show(m, arg...) }}, + TEMPLATE: {Hand: func(m *ice.Message, arg ...string) { + if kit.Ext(m.Option(mdb.FILE)) != m.CommandKey() { + return + } + }}, + COMPLETE: {Hand: func(m *ice.Message, arg ...string) { + if arg[0] == mdb.FOREACH && arg[2] == nfs.SCRIPT { + return + } + + if m.Option("text") == "" { + m.Push(mdb.TEXT, kit.List("package", "import", "const", "type", "func", "var")) + return + } + if strings.HasSuffix(m.Option("text"), ".") { + key := kit.Slice(kit.Split(m.Option("text"), "\t ."), -1)[0] + switch key { + case "m", "msg": + key = "icebergs.Message" + case "kit": + key = "toolkits" + case "ice": + key = "icebergs" + } + + for _, l := range strings.Split(m.Cmdx("cli.system", "go", "doc", key), ice.NL) { + ls := kit.Split(l) + if len(ls) < 2 { + continue + } + switch ls[0] { + case "const", "var", "func": + m.Push(mdb.NAME, ls[1]) + m.Push(mdb.TEXT, l) + } + } + return + } + + m.Push(mdb.TEXT, "m") + m.Push(mdb.TEXT, "msg") + m.Push(mdb.TEXT, "ice") + m.Push(mdb.TEXT, "kit") + for _, l := range strings.Split(m.Cmdx("cli.system", "go", "list", "std"), ice.NL) { + m.Push(mdb.TEXT, kit.Slice(kit.Split(l, ice.PS), -1)[0]) + } + }}, + NAVIGATE: {Hand: func(m *ice.Message, arg ...string) { + m.Option("text", kit.Slice(kit.Split(m.Option("text"), "."), -1)[0]) + _inner_tags(m, "", m.Option("text")) + }}, }, PlugAction())}, }, Configs: ice.Configs{ MOD: {Name: MOD, Help: "模块", Value: kit.Data(PLUG, kit.Dict( diff --git a/core/code/inner.go b/core/code/inner.go index 1fab662a..928af4f3 100644 --- a/core/code/inner.go +++ b/core/code/inner.go @@ -81,7 +81,7 @@ func _inner_tags(m *ice.Message, dir string, value string) { for i := 1; bio.Scan(); i++ { if i == line || bio.Text() == text { if dir == "" { - m.PushRecord(kit.Dict(nfs.PATH, path.Dir(file), nfs.FILE, path.Base(file), nfs.LINE, kit.Format(i), mdb.TEXT, bio.Text())) + m.PushRecord(kit.Dict(nfs.PATH, path.Dir(file)+ice.PS, nfs.FILE, path.Base(file), nfs.LINE, kit.Format(i), mdb.TEXT, bio.Text())) } else { m.PushRecord(kit.Dict(nfs.PATH, dir, nfs.FILE, strings.TrimPrefix(file, nfs.PWD), nfs.LINE, kit.Format(i), mdb.TEXT, bio.Text())) } @@ -176,6 +176,9 @@ func init() { _inner_make(m, m.Cmd(cli.SYSTEM, cli.MAKE, arg)) }}, FAVOR: {Name: "favor", Help: "收藏"}, + NAVIGATE: {Name: "navigate", Help: "跳转", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(NAVIGATE, kit.Ext(m.Option(mdb.FILE)), m.Option(nfs.FILE), m.Option(nfs.PATH)) + }}, }, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) { if arg[0] = strings.Split(arg[0], ice.FS)[0]; !strings.HasSuffix(arg[0], ice.PS) { arg[1] = kit.Slice(strings.Split(arg[0], ice.PS), -1)[0] diff --git a/core/code/install.go b/core/code/install.go index 2b2d6621..8e0a093f 100644 --- a/core/code/install.go +++ b/core/code/install.go @@ -8,6 +8,7 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/cli" + "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/gdb" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" @@ -202,7 +203,7 @@ func init() { _install_stop(m, arg...) }}, gdb.DEBUG: {Name: "debug", Help: "调试", Hand: func(m *ice.Message, arg ...string) { - ProcessXterm(m, []string{mdb.TYPE, "gdb"}) + ctx.Process(m, XTERM, []string{mdb.TYPE, "gdb"}, arg...) }}, nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) { _install_trash(m, arg...) diff --git a/core/code/js.go b/core/code/js.go index 110f524a..2d50f348 100644 --- a/core/code/js.go +++ b/core/code/js.go @@ -69,12 +69,38 @@ func init() { Index.Register(&ice.Context{Name: JS, Help: "前端", Commands: ice.Commands{ JS: {Name: "js", Help: "前端", Actions: ice.MergeActions(ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { - for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} { + for _, cmd := range []string{ + TEMPLATE, COMPLETE, NAVIGATE, + mdb.PLUGIN, mdb.RENDER, mdb.ENGINE, mdb.SEARCH, + } { m.Cmd(cmd, mdb.CREATE, JSON, m.PrefixKey()) m.Cmd(cmd, mdb.CREATE, JS, m.PrefixKey()) } LoadPlug(m, JS) }}, + TEMPLATE: {Hand: func(m *ice.Message, arg ...string) { + if kit.Ext(m.Option(mdb.FILE)) != m.CommandKey() { + return + } + m.Echo(` +Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) { + msg.Echo("hello world") + msg.Dump(can) +}}) +`) + }}, + 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)) + return + } + Complete(m, m.Option("text"), kit.Dict( + "", kit.List("function", "if"), + "msg", kit.List("Push", "Echo"), + )) + }}, + NAVIGATE: {Hand: func(m *ice.Message, arg ...string) { + }}, mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { key := ctx.GetFileCmd(kit.Replace(path.Join(arg[2], arg[1]), ".js", ".go")) if key == "" { diff --git a/core/code/py.go b/core/code/py.go index 8333127f..21bf7383 100644 --- a/core/code/py.go +++ b/core/code/py.go @@ -5,6 +5,7 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/cli" + "shylinux.com/x/icebergs/base/gdb" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" kit "shylinux.com/x/toolkits" @@ -39,6 +40,15 @@ func init() { }) m.Cmd(mdb.ENGINE, mdb.CREATE, PY, m.PrefixKey()) m.Cmd(mdb.RENDER, mdb.CREATE, PY, m.PrefixKey()) + gdb.Watch(m, VIMER_TEMPLATE) + }}, + VIMER_TEMPLATE: {Hand: func(m *ice.Message, arg ...string) { + if kit.Ext(m.Option(mdb.FILE)) != m.CommandKey() { + return + } + m.Echo(` +print "hello world" +`) }}, mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _py_main_script(m, arg...) diff --git a/core/code/sh.go b/core/code/sh.go index 18b53665..2d29ad71 100644 --- a/core/code/sh.go +++ b/core/code/sh.go @@ -6,6 +6,7 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/ctx" + "shylinux.com/x/icebergs/base/gdb" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" kit "shylinux.com/x/toolkits" @@ -66,6 +67,15 @@ func init() { m.Cmd(cmd, mdb.CREATE, m.CommandKey(), m.PrefixKey()) } LoadPlug(m, m.CommandKey()) + gdb.Watch(m, VIMER_TEMPLATE) + }}, + VIMER_TEMPLATE: {Hand: func(m *ice.Message, arg ...string) { + if kit.Ext(m.Option(mdb.FILE)) != m.CommandKey() { + return + } + m.Echo(` +_list +`) }}, mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { if arg[0] == mdb.FOREACH { diff --git a/core/code/shy.go b/core/code/shy.go index cdd07d64..3a610636 100644 --- a/core/code/shy.go +++ b/core/code/shy.go @@ -7,6 +7,7 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/ctx" + "shylinux.com/x/icebergs/base/gdb" "shylinux.com/x/icebergs/base/mdb" kit "shylinux.com/x/toolkits" ) @@ -41,6 +42,15 @@ func init() { m.Cmd(cmd, mdb.CREATE, SHY, m.PrefixKey()) } LoadPlug(m, SHY) + gdb.Watch(m, VIMER_TEMPLATE) + }}, + VIMER_TEMPLATE: {Hand: func(m *ice.Message, arg ...string) { + if kit.Ext(m.Option(mdb.FILE)) != m.CommandKey() { + return + } + m.Echo(` +chapter "hi" +`) }}, mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { ctx.ProcessCommand(m, "web.wiki.word", kit.Simple(path.Join(arg[2], arg[1]))) diff --git a/core/code/template.go b/core/code/template.go index b23430dc..365a632d 100644 --- a/core/code/template.go +++ b/core/code/template.go @@ -10,9 +10,10 @@ import ( kit "shylinux.com/x/toolkits" ) -const TEMPLATE = "template" +// const TEMPLATE = "template" func init() { + return Index.MergeCommands(ice.Commands{ TEMPLATE: {Name: "template name auto", Help: "模板", Actions: ice.MergeActions(ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { diff --git a/core/code/vimer.go b/core/code/vimer.go index 6d74270d..2dc7325f 100644 --- a/core/code/vimer.go +++ b/core/code/vimer.go @@ -7,6 +7,7 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/ctx" + "shylinux.com/x/icebergs/base/gdb" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/web" @@ -14,59 +15,6 @@ import ( kit "shylinux.com/x/toolkits" ) -func _vimer_defs(m *ice.Message, ext string) string { - defs := kit.Dict( - nfs.SH, ` -_list -`, - nfs.SHY, ` -chapter "hi" -`, - nfs.PY, ` -print "hello world" -`, - nfs.JS, ` -Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) { - msg.Echo("hello world") - msg.Dump(can) -}}) -`, - nfs.ZML, ` -{ - username - 系统 - 命令 index cli.system - 共享 index cli.qrcode - 代码 - 趋势 index web.code.git.trend args icebergs action auto - 状态 index web.code.git.status args icebergs - 脚本 - 终端 index hi/hi.sh - 文档 index hi/hi.shy - 数据 index hi/hi.py - 后端 index hi/hi.go - 前端 index hi/hi.js -} -`, - nfs.IML, ` -系统 - 命令 - cli.system - 环境 - cli.runtime -开发 - 模块 - hi/hi.go - 脚本 - hi/hi.sh - hi/hi.shy - hi/hi.py - hi/hi.go - hi/hi.js -`, - ) - return kit.Format(defs[ext]) -} 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))) } @@ -107,39 +55,6 @@ func _vimer_inputs(m *ice.Message, arg ...string) { } } } -func _vimer_complete(m *ice.Message, arg ...string) { - switch left := kit.Select("", kit.Slice(kit.Split(m.Option(mdb.TEXT), "\t \n`"), -1), 0); kit.Ext(m.Option(nfs.FILE)) { - case nfs.ZML: - switch left { - 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") - m.Push(mdb.NAME, "push") - m.Push(mdb.NAME, "open") - - default: - if strings.HasSuffix(m.Option(mdb.TEXT), " ") { - m.Push(mdb.NAME, "index") - m.Push(mdb.NAME, "action") - m.Push(mdb.NAME, "args") - m.Push(mdb.NAME, "type") - } else if m.Option(mdb.TEXT) == "" { - m.Push(mdb.NAME, "head") - m.Push(mdb.NAME, "left") - m.Push(mdb.NAME, "main") - m.Push(mdb.NAME, "foot") - } - } - default: - m.Cmdy(mdb.ENGINE, kit.Ext(m.Option(nfs.FILE)), m.Option(nfs.FILE), m.Option(nfs.PATH)) - } -} func _vimer_go_complete(m *ice.Message, name string, arg ...string) *ice.Message { kit.Fetch(kit.Split(m.Cmdx(cli.SYSTEM, GO, "doc", name), ice.NL, ice.NL, ice.NL), func(index int, value string) { if ls := kit.Split(value); len(ls) > 1 { @@ -160,9 +75,6 @@ func _vimer_go_complete(m *ice.Message, name string, arg ...string) *ice.Message const ( VIMER_TEMPLATE = "vimer.template" VIMER_COMPLETE = "vimer.complete" - - COMPLETE = "complete" - // TEMPLATE = "template" ) const VIMER = "vimer" @@ -174,18 +86,15 @@ func init() { m.PushSearch(mdb.TYPE, "go", mdb.NAME, "src/main.go", mdb.TEXT, chat.MergeCmd(m, "")) } }}, - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - _vimer_inputs(m, arg...) - }}, - nfs.SAVE: {Name: "save type file path", Help: "保存", Hand: func(m *ice.Message, arg ...string) { - m.Option(nfs.CONTENT, kit.Select(_vimer_defs(m, kit.Ext(m.Option(nfs.FILE))), m.Option(nfs.CONTENT))) + if m.Option(nfs.CONTENT) == "" { + m.Option(nfs.CONTENT, gdb.Event(m.Spawn(), VIMER_TEMPLATE).Result()) + } m.Cmdy(nfs.SAVE, path.Join(m.Option(nfs.PATH), m.Option(nfs.FILE))) }}, nfs.TRASH: {Name: "trash path", Help: "删除", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.TRASH, arg[0]) }}, - 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) { m.Cmd(UPGRADE, cli.RESTART) @@ -197,11 +106,12 @@ func init() { m.Cmdy(AUTOGEN, mdb.CREATE, arg) }}, nfs.SCRIPT: {Name: "script file=hi/hi.js", Help: "脚本", Hand: func(m *ice.Message, arg ...string) { - m.Option(mdb.TEXT, strings.TrimSpace(kit.Select(_vimer_defs(m, kit.Ext(m.Option(nfs.FILE))), m.Option(mdb.TEXT)))) - m.Cmdy(TEMPLATE, nfs.DEFS) + 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(mdb.TEXT, strings.TrimSpace(kit.Select(_vimer_defs(m, kit.Ext(m.Option(nfs.FILE))), m.Option(mdb.TEXT)))) + if m.Option(mdb.TEXT) == "" { + m.Option(mdb.TEXT, gdb.Event(m.Spawn(), VIMER_TEMPLATE).Result()) + } m.Option(nfs.FILE, path.Join(web.WEBSITE, m.Option(nfs.FILE))) m.Cmdy(TEMPLATE, nfs.DEFS) }}, @@ -215,12 +125,20 @@ func init() { m.Cmdy(PUBLISH, ice.CONTEXTS) }}, + 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)) + } + _vimer_inputs(m, arg...) + }}, TEMPLATE: {Name: "template", Help: "模板", Hand: func(m *ice.Message, arg ...string) { - // _vimer_template(m, arg...) + 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) { - _vimer_complete(m, arg...) + m.Cmdy(COMPLETE, kit.Ext(m.Option(mdb.FILE)), m.Option(nfs.FILE), m.Option(nfs.PATH)) }}, + "listTags": {Name: "listTags", Help: "索引", Hand: func(m *ice.Message, arg ...string) { m.Cmdy("web.code.vim.tags", "listTags", arg) }}, @@ -255,3 +173,57 @@ func init() { func ProcessVimer(m *ice.Message, path, file, line string, arg ...string) { ctx.ProcessField(m, Prefix(VIMER), kit.Simple(path, file, line), arg...) } + +const TEMPLATE = "template" +const COMPLETE = "complete" +const NAVIGATE = "navigate" + +func Complete(m *ice.Message, text string, data ice.Map) { + if strings.HasSuffix(text, ".") { + key := kit.Slice(kit.Split(text, " ."), -1)[0] + m.Push(mdb.TEXT, kit.Simple(data[key])) + } else { + m.Push(mdb.TEXT, data[""]) + for k := range data { + m.Push(mdb.TEXT, k) + } + } + return + + if strings.TrimSpace(text) == "" { + m.Push(mdb.TEXT, kit.Simple(data[""])) + return + } + + name := kit.Slice(kit.Split(text), -1)[0] + if name == "" { + m.Push(mdb.TEXT, kit.Simple(data[""])) + return + } + + key := kit.Slice(kit.Split(name, "."), -1)[0] + if strings.HasSuffix(name, ".") { + m.Push(mdb.TEXT, kit.Simple(data[key])) + } else { + for k := range data { + if strings.HasPrefix(k, key) { + m.Push(mdb.TEXT, key) + } + } + list := kit.Simple(data[key]) + for i, v := range list { + list[i] = "." + v + } + m.Push(mdb.TEXT, list) + } +} + +func init() { + Index.MergeCommands(ice.Commands{COMPLETE: {Name: "complete type name text auto", Help: "补全", Actions: mdb.RenderAction()}}) +} +func init() { + Index.MergeCommands(ice.Commands{TEMPLATE: {Name: "template type name text auto", Help: "模板", Actions: mdb.RenderAction()}}) +} +func init() { + Index.MergeCommands(ice.Commands{NAVIGATE: {Name: "navigate type name text auto", Help: "跳转", Actions: mdb.RenderAction()}}) +} diff --git a/core/code/xterm.go b/core/code/xterm.go index 2aaf25bc..e93c061a 100644 --- a/core/code/xterm.go +++ b/core/code/xterm.go @@ -22,9 +22,20 @@ type _xterm struct { *os.File } -func (s _xterm) Close() error { s.Cmd.Process.Kill(); return nil } +func (s _xterm) Setsize(rows, cols string) error { + return pty.Setsize(s.File, &pty.Winsize{Rows: uint16(kit.Int(rows)), Cols: uint16(kit.Int(cols))}) +} +func (s _xterm) Write(data string) (int, error) { + return s.File.Write([]byte(data)) +} +func (s _xterm) Close() error { + return s.Cmd.Process.Kill() +} func _xterm_get(m *ice.Message, h string) _xterm { + h = kit.Select(m.Option(mdb.HASH), h) + m.Assert(h != "") + t := mdb.HashSelectField(m, m.Option(mdb.HASH, h), mdb.TYPE) mdb.HashModify(m, mdb.TEXT, m.Option(ice.MSG_DAEMON)) return mdb.HashTarget(m, h, func() ice.Any { @@ -35,6 +46,9 @@ func _xterm_get(m *ice.Message, h string) _xterm { m.Assert(err) m.Go(func() { + defer mdb.HashSelectUpdate(m, h, func(value ice.Map) { delete(value, mdb.TARGET) }) + defer tty.Close() + m.Option("log.disable", ice.TRUE) buf := make([]byte, ice.MOD_BUFS) for { @@ -55,7 +69,13 @@ const XTERM = "xterm" func init() { Index.MergeCommands(ice.Commands{ - XTERM: {Name: "xterm hash auto", Help: "终端", Actions: ice.MergeActions(ice.Actions{ + XTERM: {Name: "xterm hash auto", Help: "命令行", Actions: ice.MergeActions(ice.Actions{ + ctx.PROCESS: {Name: "process", Help: "响应", Hand: func(m *ice.Message, arg ...string) { + if len(arg) == 0 || arg[0] != ice.RUN { + arg = []string{m.Cmdx("", mdb.CREATE, arg)} + } + ctx.ProcessField(m, "", arg, arg...) + }}, mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { switch mdb.HashInputs(m, arg); arg[0] { case mdb.TYPE: @@ -64,40 +84,34 @@ func init() { m.Push(arg[0], ice.Info.HostName, path.Base(m.Option(mdb.TYPE))) } }}, - mdb.CREATE: {Name: "create type=sh name", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - mdb.HashCreate(m, mdb.NAME, kit.Split(m.Option(mdb.TYPE))[0], m.OptionSimple(mdb.TYPE, mdb.NAME)) - m.ProcessRefresh3ms() + mdb.CREATE: {Name: "create type=sh name init", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + mdb.HashCreate(m, mdb.NAME, kit.Split(m.Option(mdb.TYPE))[0], m.OptionSimple(mdb.TYPE, mdb.NAME, ice.INIT)) + ctx.ProcessRefresh(m) }}, "resize": {Name: "resize", Help: "大小", Hand: func(m *ice.Message, arg ...string) { - pty.Setsize(_xterm_get(m, m.Option(mdb.HASH)).File, &pty.Winsize{Rows: uint16(kit.Int(m.Option("rows"))), Cols: uint16(kit.Int(m.Option("cols")))}) + _xterm_get(m, "").Setsize(m.Option("rows"), m.Option("cols")) }}, "input": {Name: "input", Help: "输入", Hand: func(m *ice.Message, arg ...string) { if b, e := base64.StdEncoding.DecodeString(strings.Join(arg, "")); !m.Warn(e) { - _xterm_get(m, m.Option(mdb.HASH)).Write(b) + _xterm_get(m, "").Write(string(b)) } }}, INSTALL: {Name: "install", Help: "安装", Hand: func(m *ice.Message, arg ...string) { - _xterm_get(m, kit.Select(m.Option(mdb.HASH), arg, 0)).Write([]byte(m.Cmdx(PUBLISH, ice.CONTEXTS, INSTALL) + ice.NL)) - m.ProcessHold() + _xterm_get(m, kit.Select("", arg, 0)).Write(m.Cmdx(PUBLISH, ice.CONTEXTS, INSTALL) + ice.NL) + ctx.ProcessHold(m) }}, web.WEBSITE: {Name: "website", Help: "打开", Hand: func(m *ice.Message, arg ...string) { - m.ProcessOpen(web.MergePodCmd(m, "", m.PrefixKey(), mdb.HASH, m.Option(mdb.HASH))) + web.ProcessWebsite(m, "", "", m.OptionSimple(mdb.HASH)) }}, - }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text")), Hand: func(m *ice.Message, arg ...string) { + }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,init", 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) ctx.DisplayLocal(m, "") + ctx.Toolkit(m) } }}, }) } - -func ProcessXterm(m *ice.Message, args []string, arg ...string) { - if len(arg) == 0 || arg[0] != ice.RUN { - args = []string{m.Cmdx(Prefix(XTERM), mdb.CREATE, args)} - } - ctx.ProcessField(m, Prefix(XTERM), args, arg...) -} diff --git a/core/code/zml.go b/core/code/zml.go index 54c6a174..144ba30a 100644 --- a/core/code/zml.go +++ b/core/code/zml.go @@ -5,9 +5,12 @@ import ( "strings" ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/ctx" + "shylinux.com/x/icebergs/base/gdb" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/core/chat" + kit "shylinux.com/x/toolkits" ) func _website_url(m *ice.Message, file string) string { @@ -25,6 +28,75 @@ func init() { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(mdb.RENDER, mdb.CREATE, nfs.ZML, m.PrefixKey()) m.Cmd(mdb.ENGINE, mdb.CREATE, nfs.ZML, m.PrefixKey()) + gdb.Watch(m, VIMER_TEMPLATE) + gdb.Watch(m, VIMER_COMPLETE) + }}, + VIMER_TEMPLATE: {Hand: func(m *ice.Message, arg ...string) { + switch kit.Ext(m.Option(mdb.FILE)) { + case ZML: + m.Echo(` +{ + username + 系统 + 命令 index cli.system + 共享 index cli.qrcode + 代码 + 趋势 index web.code.git.trend args icebergs action auto + 状态 index web.code.git.status args icebergs + 脚本 + 终端 index hi/hi.sh + 文档 index hi/hi.shy + 数据 index hi/hi.py + 后端 index hi/hi.go + 前端 index hi/hi.js +} +`) + case nfs.IML: + m.Echo(` +系统 + 命令 + cli.system + 环境 + cli.runtime +开发 + 模块 + hi/hi.go + 脚本 + hi/hi.sh + hi/hi.shy + hi/hi.py + hi/hi.go + hi/hi.js +`) + } + }}, + VIMER_COMPLETE: {Hand: func(m *ice.Message, arg ...string) { + 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") + m.Push(mdb.NAME, "push") + m.Push(mdb.NAME, "open") + + default: + if strings.HasSuffix(m.Option(mdb.TEXT), " ") { + m.Push(mdb.NAME, "index") + m.Push(mdb.NAME, "action") + m.Push(mdb.NAME, "args") + m.Push(mdb.NAME, "type") + } else if m.Option(mdb.TEXT) == "" { + m.Push(mdb.NAME, "head") + m.Push(mdb.NAME, "left") + m.Push(mdb.NAME, "main") + m.Push(mdb.NAME, "foot") + } + } }}, mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { m.EchoIFrame(_website_url(m, strings.TrimPrefix(path.Join(arg[2], arg[1]), SRC_WEBSITE))) diff --git a/data.go b/data.go index 9ceea38f..4cc89a45 100644 --- a/data.go +++ b/data.go @@ -12,8 +12,8 @@ func (m *Message) ActionKey() string { func (m *Message) CommandKey() string { return strings.TrimSuffix(strings.TrimPrefix(m._key, PS), PS) } -func (m *Message) PrefixKey(arg ...string) string { - return kit.Keys(m.Prefix(m.CommandKey()), arg) +func (m *Message) PrefixKey(arg ...Any) string { + return kit.Keys(m.Prefix(m.CommandKey()), kit.Keys(arg)) } func (m *Message) Prefix(arg ...string) string { return m.Target().PrefixKey(arg...) diff --git a/misc/git/status.go b/misc/git/status.go index a8d2f953..4e445efd 100644 --- a/misc/git/status.go +++ b/misc/git/status.go @@ -169,7 +169,7 @@ func _status_list(m *ice.Message) (files, adds, dels int, last time.Time) { default: m.Push(TAGS, "") if strings.Contains(vs[0], "??") { - list = append(list, ADD) + list = append(list, ADD, nfs.TRASH) } else { list = append(list, COMMIT) } @@ -305,6 +305,9 @@ func init() { code.PUBLISH: {Name: "publish", Help: "发布", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(code.PUBLISH, ice.CONTEXTS, ice.MISC, ice.CORE) }}, + nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(nfs.TRASH, path.Join(_repos_path(m.Option(REPOS)), m.Option(nfs.FILE))) + }}, code.BINPACK: {Name: "binpack", Help: "发布模式", Hand: func(m *ice.Message, arg ...string) { m.Cmd(nfs.LINK, ice.GO_SUM, path.Join(ice.SRC_RELEASE, ice.GO_SUM)) m.Cmd(nfs.LINK, ice.GO_MOD, path.Join(ice.SRC_RELEASE, ice.GO_MOD)) diff --git a/misc/tmux/session.go b/misc/tmux/session.go index 8cb9abc7..0fda4bc7 100644 --- a/misc/tmux/session.go +++ b/misc/tmux/session.go @@ -158,7 +158,7 @@ func init() { }}, code.XTERM: {Name: "xterm", Help: "终端", Hand: func(m *ice.Message, arg ...string) { - code.ProcessXterm(m, []string{mdb.TYPE, "tmux attach -t " + m.Option(SESSION)}, arg...) + ctx.Process(m, code.XTERM, []string{mdb.TYPE, "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) { diff --git a/misc/vim/vim.shy b/misc/vim/vim.shy index 0c5c24b8..f8b25098 100644 --- a/misc/vim/vim.shy +++ b/misc/vim/vim.shy @@ -2,13 +2,209 @@ title "vim" refer ` 官网 https://www.vim.org 源码 https://github.com/vim/vim -文档 http://vimdoc.sourceforge.net/htmldoc/usr_toc.html +文档 http://vimdoc.sourceforge.net/htmldoc/help.html ` chapter "源码" -field "安装" web.code.vim.vim -field "源码" web.code.inner args `usr/install/vim-vim-12be734/ src/main.c 110` +field "编辑器" web.code.vim.vim +field "源代码" web.code.ctags.inner args `usr/install/vim-vim-12be734/ src/main.c 110` +field "计数" web.code.git.count args `usr/install/vim-vim-12be734/src/` +web.code.ctags.chain ` +syntax.c +buffer.c +window.c +screen.c +session.c +quickfix.c +popupmenu.c +popupwin.c +autocmd.c +mouse.c +pty.c +undo.c +menu.c +message.c +message_test.c +move.c +fold.c +term.c +term.h +terminal.c +termlib.c +alloc.h +arabic.c +arglist.c +ascii.h +auto +beval.c +beval.h +bigvim64.bat +bigvim.bat +blob.c +blowfish.c +bufwrite.c +change.c +channel.c +charset.c +cindent.c +clientserver.c +clipboard.c +cmdexpand.c +cmdhist.c +config.h.in +config.mk.dist +config.mk.in +configure +configure.ac +create_cmdidxs.vim +crypt.c +crypt_zip.c +debugger.c +dehqx.py +dict.c +diff.c +digraph.c +dimm.idl +dlldata.c +dosinst.c +dosinst.h +drawline.c +drawscreen.c +edit.c +errors.h +evalbuffer.c +eval.c +evalfunc.c +evalvars.c +evalwindow.c +ex_cmdidxs.h +ex_cmds2.c +ex_cmds.c +ex_cmds.h +ex_docmd.c +ex_eval.c +ex_getln.c +feature.h +fileio.c +filepath.c +findfile.c +getchar.c +glbl_ime.cpp +glbl_ime.h +globals.h +GvimExt +gvimtutor +hardcopy.c +hashtab.c +help.c +highlight.c +iid_ole.c +indent.c +infplist.xml +insexpand.c +iscygpty.c +iscygpty.h +job.c +json.c +json_test.c +keymap.h +kword_test.c +libvterm +link.390 +link.sh +list.c +locale.c +macros.h +main.c +map.c +mark.c +match.c +mbyte.c +memfile.c +memfile_test.c +memline.c +misc1.c +misc2.c +mysign +nbdebug.c +nbdebug.h +netbeans.c +normal.c +ops.c +option.c +optiondefs.h +option.h +optionstr.c +osdef1.h.in +osdef2.h.in +osdef.sh +pathdef.sh +profiler.c +proto +protodef.h +proto.h +README.md +regexp_bt.c +regexp.c +regexp.h +regexp_nfa.c +register.c +scriptfile.c +search.c +sha256.c +sign.c +sound.c +spell.c +spellfile.c +spell.h +spellsuggest.c +structs.h +tag.c +tearoff.bmp +testing.c +textformat.c +textobject.c +textprop.c +time.c +toolbar.phi +toolcheck +tools.bmp +typemap +typval.c +ui.c +uninstall.c +usercmd.c +userfunc.c +version.c +version.h +vim9compile.c +vim9execute.c +vim9.h +vim9script.c +vim9type.c +vim_alert.ico +vim.def +vim_error.ico +vim.h +vim.ico +vim_icon.xbm +viminfo.c +vim_info.ico +vim_mask.xbm +vim_quest.ico +vim.rc +vimrun.c +vim.tlb +vimtutor +VisVim +which.sh +winclip.c +xdiff +xpm_w32.c +xpm_w32.h + +` section "构建" shell ` yum install -y wget make gcc