diff --git a/etc/init.shy b/etc/init.shy index f33b842f..5bfc4319 100644 --- a/etc/init.shy +++ b/etc/init.shy @@ -1,8 +1,8 @@ +~file1 + history load etc/history.txt ~shell1 alias import nfs return -~file1 - history load etc/history.txt source etc/local.shy config debug on diff --git a/src/contexts/cli/cli.go b/src/contexts/cli/cli.go index 61480c91..6ad0a1e1 100644 --- a/src/contexts/cli/cli.go +++ b/src/contexts/cli/cli.go @@ -90,6 +90,7 @@ func (cli *CLI) Begin(m *ctx.Message, arg ...string) ctx.Server { // {{{ // }}} func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{ cli.Message = m + m.Sess("cli", m) yac := m.Sess("yac") if yac.Cap("status") != "start" { yac.Target().Start(yac) @@ -106,7 +107,7 @@ func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{ yac.Cmd("train", "op1", "op1", "mul{", "-e", "-f", "-d", "}") yac.Cmd("train", "op1", "op1", "mul{", "-", "+", "}") yac.Cmd("train", "op2", "op2", "mul{", "=", "+=", "}") - yac.Cmd("train", "op2", "op2", "mul{", "+", "-", "*", "/", "}") + yac.Cmd("train", "op2", "op2", "mul{", "+", "-", "*", "/", "%", "}") yac.Cmd("train", "op2", "op2", "mul{", ">", ">=", "<", "<=", "==", "!=", "}") yac.Cmd("train", "val", "val", "opt{", "op1", "}", "mul{", "num", "key", "str", "tran", "}") diff --git a/src/contexts/ctx.go b/src/contexts/ctx.go index 08884cc9..50da02b7 100644 --- a/src/contexts/ctx.go +++ b/src/contexts/ctx.go @@ -432,6 +432,21 @@ func (m *Message) TryCatch(msg *Message, safe bool, hand ...func(msg *Message)) // }}} +func (m *Message) Instance(msg *Message, source ...bool) bool { // {{{ + c := m.target + if len(source) > 0 && source[0] == true { + c = m.source + } + + for s := c; s != nil; s = s.context { + if s == msg.target { + return true + } + } + return false +} + +// }}} func (m *Message) BackTrace(hand func(m *Message) bool, c ...*Context) { // {{{ target := m.target if len(c) > 0 { @@ -537,6 +552,9 @@ func (m *Message) Search(key string, root ...bool) []*Message { // {{{ for i := 0; i < len(cs); i++ { ms[i] = m.Spawn(cs[i]) } + if len(ms) == 0 { + ms = append(ms, nil) + } return ms } @@ -986,6 +1004,9 @@ func (m *Message) Insert(meta string, index int, arg ...interface{}) string { // } str := Trans(arg...) + if m.Confs("insert_limit") { + index = (index+2)%(len(m.Meta[meta])+2) - 2 + } if index == -1 { index, m.Meta[meta] = 0, append(str, m.Meta[meta]...) @@ -1758,6 +1779,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心", "search_action": &Config{Name: "search_action(list/switch)", Value: "switch", Help: "搜索操作, list: 输出模块列表, switch: 模块切换"}, "search_root": &Config{Name: "search_root(true/false)", Value: "true", Help: "搜索起点, true: 根模块, false: 当前模块"}, + "insert_limit": &Config{Name: "insert_limit(true/false)", Value: "true", Help: "参数的索引"}, "detail_index": &Config{Name: "detail_index", Value: "0", Help: "参数的索引"}, "result_index": &Config{Name: "result_index", Value: "-2", Help: "返回值的索引"}, @@ -1766,18 +1788,23 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Commands: map[string]*Command{ "help": &Command{Name: "help topic", Help: "帮助", Hand: func(m *Message, c *Context, key string, arg ...string) { if len(arg) == 0 { // {{{ + m.Echo("usage: help context [module [command|config|cache name]]\n") + m.Echo(" : 查看模块信息, module: 模块名, command: 模块命令, config: 模块配置, cache: 模块缓存, name: 模块参数\n") + m.Echo("usage: help command [name]\n") + m.Echo(" : 查看当前环境下命令, name: 命令名\n") + m.Echo("usage: help config [name]\n") + m.Echo(" : 查看当前环境下配置, name: 配置名\n") + m.Echo("usage: help cache [name]\n") + m.Echo(" : 查看当前环境下缓存, name: 缓存名\n") + m.Echo("\n") + m.Echo("^_^ Welcome to context world ^_^\n") - m.Echo("\n") - m.Echo("Context is to be a distributed operating system, try to simple everything in work and life. ") - m.Echo("In context you will find all kinds of tools, and you can also make new tool in a quick and easy way.\n") - m.Echo("Here is just a simple introduce, you can look github.com/shylinux/context/README.md for more information.\n") - m.Echo("\n") + m.Echo("Version: 1.0 A New Language, A New Framework\n") + m.Echo("More: github.com/shylinux/context/README.md\n") m.Color(31, " c\n") m.Color(31, " sh").Color(33, " go\n") m.Color(31, " vi").Color(32, " php").Color(32, " js\n") m.Echo(" ARM Linux HTTP\n") - m.Echo("\n") - m.Color(31, "Context ").Color(32, "Message\n") m.Color(32, "ctx ").Color(33, "cli ").Color(31, "aaa ").Color(33, "web\n") m.Color(32, "lex ").Color(33, "yac ").Color(31, "log ").Color(33, "gdb\n") @@ -1787,9 +1814,127 @@ var Index = &Context{Name: "ctx", Help: "模块中心", } switch arg[0] { - case "example": case "context": - case "message": + switch len(arg) { + case 1: + keys := []string{} + values := map[string]*Context{} + m.Travel(func(m *Message, i int) bool { + if _, ok := values[m.Cap("module")]; !ok { + keys = append(keys, m.Cap("module")) + values[m.Cap("module")] = m.Target() + } + return true + }, m.Target().root) + sort.Strings(keys) + for _, k := range keys { + m.Echo("%s: %s %s\n", k, values[k].Name, values[k].Help) + } + break + case 2: + if msg := m.Find(arg[1]); msg != nil { + m.Echo("%s: %s %s\n", arg[1], msg.Target().Name, msg.Target().Help) + m.Echo("commands:\n") + for k, v := range msg.Target().Commands { + m.Echo(" %s: %s\n", k, v.Name) + } + m.Echo("configs:\n") + for k, v := range msg.Target().Configs { + m.Echo(" %s: %s\n", k, v.Name) + } + m.Echo("caches:\n") + for k, v := range msg.Target().Caches { + m.Echo(" %s: %s\n", k, v.Name) + } + } + default: + if msg := m.Find(arg[1]); msg != nil { + m.Echo("%s: %s %s\n", arg[1], msg.Target().Name, msg.Target().Help) + switch arg[2] { + case "command": + for k, v := range msg.Target().Commands { + if k == arg[3] { + m.Echo("%s: %s\n %s\n", k, v.Name, v.Help) + } + } + case "config": + for k, v := range msg.Target().Configs { + if k == arg[3] { + m.Echo("%s: %s\n %s\n", k, v.Name, v.Help) + } + } + case "cache": + for k, v := range msg.Target().Caches { + if k == arg[3] { + m.Echo("%s: %s\n %s\n", k, v.Name, v.Help) + } + } + } + } + } + case "command": + keys := []string{} + values := map[string]*Command{} + for s := m.Target(); s != nil; s = s.context { + for k, v := range s.Commands { + if _, ok := values[k]; ok { + continue + } + if len(arg) > 1 && k == arg[1] { + m.Echo("%s: %s\n %s\n", k, v.Name, v.Help) + for k, v := range v.Form { + m.Echo(" option: %s(%d)\n", k, v) + } + return + } + keys = append(keys, k) + values[k] = v + } + } + sort.Strings(keys) + for _, k := range keys { + m.Echo("%s: %s\n", k, values[k].Name) + } + case "config": + keys := []string{} + values := map[string]*Config{} + for s := m.Target(); s != nil; s = s.context { + for k, v := range s.Configs { + if _, ok := values[k]; ok { + continue + } + if len(arg) > 1 && k == arg[1] { + m.Echo("%s(%s): %s %s\n", k, v.Value, v.Name, v.Help) + return + } + keys = append(keys, k) + values[k] = v + } + } + sort.Strings(keys) + for _, k := range keys { + m.Echo("%s(%s): %s\n", k, values[k].Value, values[k].Name) + } + case "cache": + keys := []string{} + values := map[string]*Cache{} + for s := m.Target(); s != nil; s = s.context { + for k, v := range s.Caches { + if _, ok := values[k]; ok { + continue + } + if len(arg) > 1 && k == arg[1] { + m.Echo("%s(%s): %s %s\n", k, v.Value, v.Name, v.Help) + return + } + keys = append(keys, k) + values[k] = v + } + } + sort.Strings(keys) + for _, k := range keys { + m.Echo("%s(%s): %s\n", k, values[k].Value, values[k].Name) + } } // }}} }}, @@ -1797,13 +1942,8 @@ var Index = &Context{Name: "ctx", Help: "模块中心", msg := m.Sess("cli", false) // {{{ if len(arg) > 0 { if code, e := strconv.Atoi(arg[0]); e == nil { - ms := []*Message{m.root} - for i := 0; i < len(ms); i++ { - ms = append(ms, ms[i].messages...) - if ms[i].code == code { - msg, arg = ms[i], arg[1:] - break - } + if msg = m.root.Tree(code); msg != nil { + arg = arg[1:] } } } @@ -1816,24 +1956,24 @@ var Index = &Context{Name: "ctx", Help: "模块中心", if len(arg) == 0 { m.Echo("%s\n", msg.Format()) if len(msg.Meta["option"]) > 0 { - m.Color(31, "option: %v\n", msg.Meta["option"]) + m.Color(31, "option(%d): %v\n", len(msg.Meta["option"]), msg.Meta["option"]) for _, k := range msg.Meta["option"] { if v, ok := msg.Data[k]; ok { m.Echo(" %s: %v\n", k, v) } else { - m.Echo(" %s: %v\n", k, msg.Meta[k]) + m.Echo(" %s(%d): %v\n", k, len(msg.Meta[k]), msg.Meta[k]) } } } - m.Color(31, "result: %v\n", msg.Meta["result"]) + m.Color(31, "result(%d): %v\n", len(msg.Meta["result"]), msg.Meta["result"]) if len(msg.Meta["append"]) > 0 { - m.Color(31, "append: %v\n", msg.Meta["append"]) + m.Color(31, "append(%d): %v\n", len(msg.Meta["append"]), msg.Meta["append"]) for _, k := range msg.Meta["append"] { if v, ok := msg.Data[k]; ok { m.Echo(" %s: %v\n", k, v) } else { - m.Echo(" %s: %v\n", k, msg.Meta[k]) + m.Echo(" %s(%d): %v\n", k, len(msg.Meta[k]), msg.Meta[k]) } } } @@ -1844,11 +1984,11 @@ var Index = &Context{Name: "ctx", Help: "模块中心", } if len(msg.messages) > 0 { - m.Color(31, "messages:\n") + m.Color(31, "messages(%d):\n", len(msg.messages)) for i, v := range msg.messages { if !all { switch v.target.Name { - case "log", "yac", "lex": + case "lex", "yac", "log", "gdb": continue } } @@ -1857,7 +1997,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心", } if len(msg.sessions) > 0 { - m.Color(31, "sessions:\n") + m.Color(31, "sessions(%d):\n", len(msg.sessions)) for k, v := range msg.sessions { m.Echo(" %s %s\n", k, v.Format()) } @@ -1867,8 +2007,22 @@ var Index = &Context{Name: "ctx", Help: "模块中心", switch arg[0] { case "message": - for msg := m; msg != nil; msg = msg.message { - m.Echo("%d: %s\n", msg.code, msg.Format()) + for msg := msg; msg != nil; msg = msg.message { + m.Echo("%s\n", msg.Format()) + } + case "messages": + ms := []*Message{msg} + for i := 0; i < len(ms); i++ { + ms = append(ms, ms[i].messages...) + if ms[i].Instance(m.root.Sess("lex", false), true) || + ms[i].Instance(m.root.Sess("yac", false), true) || + ms[i].Instance(m.root.Sess("log", false), true) || + ms[i].Instance(m.root.Sess("lex", false)) || + ms[i].Instance(m.root.Sess("yac", false)) || + ms[i].Instance(m.root.Sess("log", false)) { + continue + } + m.Echo("%s\n", ms[i].Format()) } default: sub := msg.Spawn().Cmd(arg) @@ -1978,89 +2132,56 @@ var Index = &Context{Name: "ctx", Help: "模块中心", "session": &Command{Name: "session [key [cmd...]]", Help: "查看或添加会话", Hand: func(m *Message, c *Context, key string, arg ...string) { msg := m.message // {{{ if len(arg) == 0 { + keys := []string{} + values := map[string]*Message{} + for msg = msg; msg != nil; msg = msg.message { for k, v := range msg.sessions { - m.Echo("%s: %d(%s->%s) %v %v\n", k, v.code, v.source.Name, v.target.Name, v.Meta["detail"], v.Meta["option"]) + if _, ok := values[k]; ok { + continue + } + keys = append(keys, k) + values[k] = v } } + sort.Strings(keys) + for _, k := range keys { + m.Echo("%s: %s\n", k, values[k].Format()) + + } return } - var sub *Message - for m := msg; m != nil; m = m.message { - for k, v := range m.sessions { - if k == arg[0] { - sub = v - } - } - } - if len(arg) == 1 { - if sub != nil { + if sub := msg.Sess(arg[0], false); sub != nil { m.Echo("%d", sub.code) } return } - if sub == nil { - sub = msg + sub := msg + root := m.Confx("search_root", arg, 3) + switch m.Confx("search_method", arg, 2) { + case "find": + sub = msg.Find(arg[1], Right(root)) + case "search": + sub = msg.Search(arg[1], Right(root))[0] + default: + sub = nil + } + if msg.sessions == nil { + msg.sessions = map[string]*Message{} + } + if sub != nil { + msg.sessions[arg[0]] = sub } - - cmd := msg.Spawn(sub.target).Cmd(arg[1:]) - m.Copy(cmd, "result").Copy(cmd, "append") - msg.sessions[arg[0]] = cmd // }}} }}, - "callback": &Command{Name: "callback index", Help: "查看消息", Hand: func(m *Message, c *Context, key string, arg ...string) { - index := 0 - for msg := m.Sess("cli", false); msg != nil; msg = msg.message { // {{{ - index-- - switch len(arg) { - case 0: - if msg.callback == nil { - return - } - - m.Echo("%d: %v\n", index, msg.callback) - case 1: - if msg.callback == nil { - return - } - - if i, e := strconv.Atoi(arg[0]); e == nil && i == index { - m.Echo("%v", msg.callback) - } - default: - if i, e := strconv.Atoi(arg[0]); e == nil && i == index { - msg.callback = func(msg *Message) *Message { - return msg - } - m.Echo("%v", msg.callback) - } - return - } - continue - - if len(arg) == 0 { - m.Echo("msg(%s->%s): %d(%s) %v\n", msg.source.Name, msg.target.Name, msg.code, msg.time.Format("15:04:05"), msg.Meta["detail"]) - if msg.callback != nil { - m.Echo(" hand: %v\n", msg.callback) - } - } else { - switch arg[0] { - case "del": - msg.message.callback = nil - case "add": - msg.message.callback = func(msg *Message) *Message { - msg.Log("info", "callback default") - return msg - } - return - default: - m.Result(0, arg) - msg.message.Back(m) - return - } + "callback": &Command{Name: "callback", Help: "查看消息", Hand: func(m *Message, c *Context, key string, arg ...string) { + msg := m.message // {{{ + if len(arg) == 0 { + for msg := msg; msg != nil; msg = msg.message { + m.Echo("%d: %p\n", msg.code, msg.callback) } } // }}} @@ -2106,7 +2227,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心", choice, arg = arg[0], arg[1:] } - if s := m.Search(arg[0], root); len(s) > 0 { + if s := m.Search(arg[0], root); len(s) > 0 && s[0] != nil { switch choice { case "first": ms = append(ms, s[0]) @@ -2227,7 +2348,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心", case 0: m.Travel(func(m *Message, i int) bool { if m.Cap("status") == "start" { - m.Echo("%s(%s): %s\n", m.target.Name, m.Cap("stream"), m.target.Help) + m.Echo("%s(%s): %s\n", m.Cap("module"), m.Cap("stream"), m.target.Help) } return true }, m.target.root)