1
0
mirror of https://shylinux.com/x/ContextOS synced 2025-04-26 09:14:06 +08:00

mac pro ctx

This commit is contained in:
shaoying 2018-07-29 15:13:38 +08:00
parent 72aa85d5a2
commit e5b42f1d22
3 changed files with 220 additions and 98 deletions

View File

@ -1,8 +1,8 @@
~file1
history load etc/history.txt
~shell1 ~shell1
alias import nfs alias import nfs
return return
~file1
history load etc/history.txt
source etc/local.shy source etc/local.shy
config debug on config debug on

View File

@ -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 { // {{{ func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{
cli.Message = m cli.Message = m
m.Sess("cli", m)
yac := m.Sess("yac") yac := m.Sess("yac")
if yac.Cap("status") != "start" { if yac.Cap("status") != "start" {
yac.Target().Start(yac) 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{", "-e", "-f", "-d", "}")
yac.Cmd("train", "op1", "op1", "mul{", "-", "+", "}") 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", "op2", "op2", "mul{", ">", ">=", "<", "<=", "==", "!=", "}") yac.Cmd("train", "op2", "op2", "mul{", ">", ">=", "<", "<=", "==", "!=", "}")
yac.Cmd("train", "val", "val", "opt{", "op1", "}", "mul{", "num", "key", "str", "tran", "}") yac.Cmd("train", "val", "val", "opt{", "op1", "}", "mul{", "num", "key", "str", "tran", "}")

View File

@ -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) { // {{{ func (m *Message) BackTrace(hand func(m *Message) bool, c ...*Context) { // {{{
target := m.target target := m.target
if len(c) > 0 { if len(c) > 0 {
@ -537,6 +552,9 @@ func (m *Message) Search(key string, root ...bool) []*Message { // {{{
for i := 0; i < len(cs); i++ { for i := 0; i < len(cs); i++ {
ms[i] = m.Spawn(cs[i]) ms[i] = m.Spawn(cs[i])
} }
if len(ms) == 0 {
ms = append(ms, nil)
}
return ms return ms
} }
@ -986,6 +1004,9 @@ func (m *Message) Insert(meta string, index int, arg ...interface{}) string { //
} }
str := Trans(arg...) str := Trans(arg...)
if m.Confs("insert_limit") {
index = (index+2)%(len(m.Meta[meta])+2) - 2
}
if index == -1 { if index == -1 {
index, m.Meta[meta] = 0, append(str, m.Meta[meta]...) 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_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: 当前模块"}, "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: "参数的索引"}, "detail_index": &Config{Name: "detail_index", Value: "0", Help: "参数的索引"},
"result_index": &Config{Name: "result_index", Value: "-2", Help: "返回值的索引"}, "result_index": &Config{Name: "result_index", Value: "-2", Help: "返回值的索引"},
@ -1766,18 +1788,23 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
Commands: map[string]*Command{ Commands: map[string]*Command{
"help": &Command{Name: "help topic", Help: "帮助", Hand: func(m *Message, c *Context, key string, arg ...string) { "help": &Command{Name: "help topic", Help: "帮助", Hand: func(m *Message, c *Context, key string, arg ...string) {
if len(arg) == 0 { // {{{ 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("^_^ Welcome to context world ^_^\n")
m.Echo("\n") m.Echo("Version: 1.0 A New Language, A New Framework\n")
m.Echo("Context is to be a distributed operating system, try to simple everything in work and life. ") m.Echo("More: github.com/shylinux/context/README.md\n")
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.Color(31, " c\n") m.Color(31, " c\n")
m.Color(31, " sh").Color(33, " go\n") m.Color(31, " sh").Color(33, " go\n")
m.Color(31, " vi").Color(32, " php").Color(32, " js\n") m.Color(31, " vi").Color(32, " php").Color(32, " js\n")
m.Echo(" ARM Linux HTTP\n") m.Echo(" ARM Linux HTTP\n")
m.Echo("\n")
m.Color(31, "Context ").Color(32, "Message\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, "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") 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] { switch arg[0] {
case "example":
case "context": 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) // {{{ msg := m.Sess("cli", false) // {{{
if len(arg) > 0 { if len(arg) > 0 {
if code, e := strconv.Atoi(arg[0]); e == nil { if code, e := strconv.Atoi(arg[0]); e == nil {
ms := []*Message{m.root} if msg = m.root.Tree(code); msg != nil {
for i := 0; i < len(ms); i++ { arg = arg[1:]
ms = append(ms, ms[i].messages...)
if ms[i].code == code {
msg, arg = ms[i], arg[1:]
break
}
} }
} }
} }
@ -1816,24 +1956,24 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
if len(arg) == 0 { if len(arg) == 0 {
m.Echo("%s\n", msg.Format()) m.Echo("%s\n", msg.Format())
if len(msg.Meta["option"]) > 0 { 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"] { for _, k := range msg.Meta["option"] {
if v, ok := msg.Data[k]; ok { if v, ok := msg.Data[k]; ok {
m.Echo(" %s: %v\n", k, v) m.Echo(" %s: %v\n", k, v)
} else { } 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 { 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"] { for _, k := range msg.Meta["append"] {
if v, ok := msg.Data[k]; ok { if v, ok := msg.Data[k]; ok {
m.Echo(" %s: %v\n", k, v) m.Echo(" %s: %v\n", k, v)
} else { } 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 { 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 { for i, v := range msg.messages {
if !all { if !all {
switch v.target.Name { switch v.target.Name {
case "log", "yac", "lex": case "lex", "yac", "log", "gdb":
continue continue
} }
} }
@ -1857,7 +1997,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
} }
if len(msg.sessions) > 0 { 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 { for k, v := range msg.sessions {
m.Echo(" %s %s\n", k, v.Format()) m.Echo(" %s %s\n", k, v.Format())
} }
@ -1867,8 +2007,22 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
switch arg[0] { switch arg[0] {
case "message": case "message":
for msg := m; msg != nil; msg = msg.message { for msg := msg; msg != nil; msg = msg.message {
m.Echo("%d: %s\n", msg.code, msg.Format()) 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: default:
sub := msg.Spawn().Cmd(arg) 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) { "session": &Command{Name: "session [key [cmd...]]", Help: "查看或添加会话", Hand: func(m *Message, c *Context, key string, arg ...string) {
msg := m.message // {{{ msg := m.message // {{{
if len(arg) == 0 { if len(arg) == 0 {
keys := []string{}
values := map[string]*Message{}
for msg = msg; msg != nil; msg = msg.message { for msg = msg; msg != nil; msg = msg.message {
for k, v := range msg.sessions { 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 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 len(arg) == 1 {
if sub != nil { if sub := msg.Sess(arg[0], false); sub != nil {
m.Echo("%d", sub.code) m.Echo("%d", sub.code)
} }
return 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) { "callback": &Command{Name: "callback", Help: "查看消息", Hand: func(m *Message, c *Context, key string, arg ...string) {
index := 0 msg := m.message // {{{
for msg := m.Sess("cli", false); msg != nil; msg = msg.message { // {{{ if len(arg) == 0 {
index-- for msg := msg; msg != nil; msg = msg.message {
switch len(arg) { m.Echo("%d: %p\n", msg.code, msg.callback)
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
}
} }
} }
// }}} // }}}
@ -2106,7 +2227,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
choice, arg = arg[0], arg[1:] 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 { switch choice {
case "first": case "first":
ms = append(ms, s[0]) ms = append(ms, s[0])
@ -2227,7 +2348,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
case 0: case 0:
m.Travel(func(m *Message, i int) bool { m.Travel(func(m *Message, i int) bool {
if m.Cap("status") == "start" { 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 return true
}, m.target.root) }, m.target.root)