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

mac add cli.alias.import

This commit is contained in:
shaoying 2018-07-21 12:45:47 +08:00
parent fb76f5016c
commit 3237834688
3 changed files with 100 additions and 27 deletions

View File

@ -1,6 +1,7 @@
source etc/local.shy ~shell1
~file1 history load etc/history.txt alias import nfs
return return
source etc/local.shy
return "hello" "world" return "hello" "world"
source etc/demo.shy source etc/demo.shy

View File

@ -19,7 +19,7 @@ import ( // {{{
type Frame struct { type Frame struct {
pos int pos int
key string key string
run string run bool
} }
type CLI struct { type CLI struct {
@ -27,7 +27,7 @@ type CLI struct {
alias map[string][]string alias map[string][]string
target *ctx.Context target *ctx.Context
stack []Frame stack []*Frame
*ctx.Context *ctx.Context
} }
@ -44,6 +44,7 @@ func (cli *CLI) Spawn(m *ctx.Message, c *ctx.Context, arg ...string) ctx.Server
s.target = c s.target = c
} }
s.target = cli.target s.target = cli.target
s.target = c
return s return s
} }
@ -61,6 +62,37 @@ func (cli *CLI) Begin(m *ctx.Message, arg ...string) ctx.Server { // {{{
cli.Caches["target"] = &ctx.Cache{Name: "操作目标", Value: cli.Name, Help: "命令操作的目标"} cli.Caches["target"] = &ctx.Cache{Name: "操作目标", Value: cli.Name, Help: "命令操作的目标"}
cli.Caches["level"] = &ctx.Cache{Name: "嵌套层级", Value: "0", Help: "嵌套层级"} cli.Caches["level"] = &ctx.Cache{Name: "嵌套层级", Value: "0", Help: "嵌套层级"}
cli.Caches["skip"] = &ctx.Cache{Name: "跳过执行", Value: "false", Help: "命令只解析不执行"} cli.Caches["skip"] = &ctx.Cache{Name: "跳过执行", Value: "false", Help: "命令只解析不执行"}
cli.Configs["ps_target"] = &ctx.Config{Name: "命令行提示符模块格式", Value: "name", Help: "命令行提示符时间格式"}
cli.Configs["ps_time"] = &ctx.Config{Name: "命令行提示符时间格式", Value: "[15:04:05]", Help: "命令行提示符时间格式"}
cli.Configs["prompt"] = &ctx.Config{Name: "命令行提示符(target/detail)", Value: "ps_time ps_target >", Help: "命令行提示符target:显示当前模块detail:显示详细信息", Hand: func(m *ctx.Message, x *ctx.Config, arg ...string) string {
if len(arg) > 0 { // {{{
return arg[0]
}
ps := make([]string, 0, 3)
if cli, ok := m.Target().Server.(*CLI); ok && cli.target != nil {
for _, v := range strings.Split(x.Value, " ") {
switch v {
case "ps_time":
if m.Confs("ps_time") {
ps = append(ps, time.Now().Format(m.Conf("ps_time")))
}
case "ps_target":
switch m.Conf("ps_target") {
case "name":
ps = append(ps, m.Target().Name)
case "module":
ps = append(ps, m.Target().Name)
}
default:
ps = append(ps, v)
}
}
}
ps = append(ps, " ")
return strings.Join(ps, "")
// }}}
}}
return cli return cli
} }
@ -181,7 +213,7 @@ func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{
} }
m.Options("scan_end", false) m.Options("scan_end", false)
m.Option("target", m.Target().Name) m.Option("prompt", m.Conf("prompt"))
yac = m.Sesss("yac") yac = m.Sesss("yac")
yac.Call(func(cmd *ctx.Message) *ctx.Message { yac.Call(func(cmd *ctx.Message) *ctx.Message {
if m.Caps("skip") { if m.Caps("skip") {
@ -190,6 +222,7 @@ func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{
cmd.Set("detail", "if", "0") cmd.Set("detail", "if", "0")
case "else": case "else":
case "end": case "end":
case "for":
default: default:
cmd.Hand = true cmd.Hand = true
return nil return nil
@ -197,7 +230,7 @@ func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{
} }
cmd.Cmd() cmd.Cmd()
m.Option("target", cli.target.Name) m.Option("prompt", cmd.Conf("prompt"))
if cmd.Has("return") { if cmd.Has("return") {
m.Options("scan_end", true) m.Options("scan_end", true)
m.Target().Close(m.Spawn()) m.Target().Close(m.Spawn())
@ -308,7 +341,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
m.Add("append", "return", arg[1:]) m.Add("append", "return", arg[1:])
}}, }},
"alias": &ctx.Command{ "alias": &ctx.Command{
Name: "alias [short [long...]]|[delete short]", Name: "alias [short [long...]]|[delete short]|[import module]",
Help: "查看、定义或删除命令别名, short: 命令别名, long: 命令原名, delete: 删除别名", Help: "查看、定义或删除命令别名, short: 命令别名, long: 命令原名, delete: 删除别名",
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
if cli, ok := m.Target().Server.(*CLI); m.Assert(ok) { // {{{ if cli, ok := m.Target().Server.(*CLI); m.Assert(ok) { // {{{
@ -320,12 +353,28 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
case 1: case 1:
m.Echo("%s: %v\n", arg[0], cli.alias[arg[0]]) m.Echo("%s: %v\n", arg[0], cli.alias[arg[0]])
default: default:
if arg[0] == "delete" { switch arg[0] {
case "delete":
m.Echo("delete: %s %v\n", arg[1], cli.alias[arg[1]]) m.Echo("delete: %s %v\n", arg[1], cli.alias[arg[1]])
delete(cli.alias, arg[1]) delete(cli.alias, arg[1])
} else { case "import":
msg := m.Find(arg[1], false)
if msg == nil {
msg = m.Find(arg[1], true)
}
if msg == nil {
m.Echo("%s not exist", arg[1])
return
}
m.Log("info", nil, "import %s", arg[1])
module := msg.Cap("module")
for k, _ := range msg.Target().Commands {
cli.alias[k] = []string{module + "." + k}
}
default:
cli.alias[arg[0]] = arg[1:] cli.alias[arg[0]] = arg[1:]
m.Echo("%s: %v\n", arg[0], cli.alias[arg[0]]) m.Echo("%s: %v\n", arg[0], cli.alias[arg[0]])
m.Log("info", nil, "%s: %v", arg[0], cli.alias[arg[0]])
} }
} }
} // }}} } // }}}
@ -606,9 +655,10 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
}}, }},
"if": &ctx.Command{Name: "if exp", Help: "条件语句, exp: 表达式", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "if": &ctx.Command{Name: "if exp", Help: "条件语句, exp: 表达式", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
if cli, ok := m.Target().Server.(*CLI); m.Assert(ok) { // {{{ if cli, ok := m.Target().Server.(*CLI); m.Assert(ok) { // {{{
cli.stack = append(cli.stack, Frame{pos: m.Optioni("file_pos"), key: key, run: arg[1]}) run := !m.Caps("skip") && ctx.Right(arg[1])
cli.stack = append(cli.stack, &Frame{pos: m.Optioni("file_pos"), key: key, run: run})
m.Capi("level", 1) m.Capi("level", 1)
m.Caps("skip", !ctx.Right(arg[1])) m.Caps("skip", !run)
} // }}} } // }}}
}}, }},
"else": &ctx.Command{Name: "else", Help: "条件语句", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "else": &ctx.Command{Name: "else", Help: "条件语句", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
@ -620,7 +670,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
m.Caps("skip", true) m.Caps("skip", true)
} else { } else {
frame := cli.stack[len(cli.stack)-2] frame := cli.stack[len(cli.stack)-2]
if ctx.Right(frame.run) { if frame.run {
m.Caps("skip", true) m.Caps("skip", true)
} }
} }
@ -631,7 +681,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
if cli, ok := m.Target().Server.(*CLI); m.Assert(ok) { // {{{ if cli, ok := m.Target().Server.(*CLI); m.Assert(ok) { // {{{
frame := cli.stack[len(cli.stack)-1] frame := cli.stack[len(cli.stack)-1]
if frame.key == "for" { if frame.key == "for" {
if ctx.Right(frame.run) { if frame.run {
m.Append("file_pos0", frame.pos) m.Append("file_pos0", frame.pos)
return return
} }
@ -639,7 +689,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
if cli.stack = cli.stack[:len(cli.stack)-1]; m.Capi("level", -1) > 0 { if cli.stack = cli.stack[:len(cli.stack)-1]; m.Capi("level", -1) > 0 {
frame := cli.stack[len(cli.stack)-1] frame := cli.stack[len(cli.stack)-1]
m.Caps("skip", !ctx.Right(frame.run)) m.Caps("skip", !frame.run)
} else { } else {
m.Caps("skip", false) m.Caps("skip", false)
} }
@ -647,16 +697,17 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
}}, }},
"for": &ctx.Command{Name: "for exp", Help: "循环语句, exp: 表达式", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "for": &ctx.Command{Name: "for exp", Help: "循环语句, exp: 表达式", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
if cli, ok := m.Target().Server.(*CLI); m.Assert(ok) { // {{{ if cli, ok := m.Target().Server.(*CLI); m.Assert(ok) { // {{{
run := !m.Caps("skip") && ctx.Right(arg[1])
if len(cli.stack) > 0 { if len(cli.stack) > 0 {
// frame := cli.stack[len(cli.stack)-1] frame := cli.stack[len(cli.stack)-1]
// if frame.pos == m.Optioni("pos") { if frame.key == "for" && frame.pos == m.Optioni("file_pos") {
// m.Caps("skip", !ctx.Right(arg[1])) frame.run = !m.Caps("skip", !ctx.Right(arg[1]))
// return return
// } }
} }
cli.stack = append(cli.stack, Frame{pos: m.Optioni("file_pos"), key: key, run: arg[1]}) cli.stack = append(cli.stack, &Frame{pos: m.Optioni("file_pos"), key: key, run: run})
m.Capi("level", 1) m.Capi("level", 1)
m.Caps("skip", !ctx.Right(arg[1])) m.Caps("skip", !run)
} // }}} } // }}}
}}, }},
@ -671,10 +722,30 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
detail = append(detail, arg...) detail = append(detail, arg...)
} }
msg := m.Spawn(cli.target).Cmd(detail) routes := strings.Split(detail[0], ".")
if msg.Hand { msg := m
if len(routes) > 1 {
target := cli.target
defer func() { cli.target = target }()
route := strings.Join(routes[:len(routes)-1], ".")
if msg = m.Find(route, false); msg == nil {
msg = m.Find(route, true)
}
if msg == nil {
m.Echo("%s not exist", route)
return
}
detail[0] = routes[len(routes)-1]
} else {
msg = m.Spawn(cli.target)
}
if msg.Cmd(detail); msg.Hand {
cli.target = msg.Target() cli.target = msg.Target()
m.Cap("target", cli.target.Name) m.Cap("target", msg.Cap("module"))
} else { } else {
msg.Hand = true msg.Hand = true
msg.Log("system", nil, "%v", msg.Meta["detail"]) msg.Log("system", nil, "%v", msg.Meta["detail"])
@ -735,7 +806,9 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
}}, }},
"target": &ctx.Command{Name: "taget", Help: "函数调用, name: 函数名, arg: 参数", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "target": &ctx.Command{Name: "taget", Help: "函数调用, name: 函数名, arg: 参数", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
if cli, ok := m.Target().Server.(*CLI); m.Assert(ok) { if cli, ok := m.Target().Server.(*CLI); m.Assert(ok) {
m.Put("append", "target", cli.target) msg := m.Find(arg[0])
cli.target = msg.Target()
m.Cap("target", msg.Cap("module"))
} }
}}, }},
"seed": &ctx.Command{Name: "seed", Help: "函数调用, name: 函数名, arg: 参数", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "seed": &ctx.Command{Name: "seed", Help: "函数调用, name: 函数名, arg: 参数", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {

View File

@ -16,7 +16,6 @@ import ( // {{{
"path" "path"
"strconv" "strconv"
"strings" "strings"
"time"
"unicode" "unicode"
) )
@ -205,7 +204,7 @@ func (nfs *NFS) prompt(arg ...string) string { // {{{
nfs.escape("2K").escape("G").escape("?25h") nfs.escape("2K").escape("G").escape("?25h")
} }
ps := fmt.Sprintf("[%s]%s> ", time.Now().Format("15:04:05"), nfs.Option("target")) ps := nfs.Option("prompt")
if len(nfs.pages) > 0 { if len(nfs.pages) > 0 {
nfs.pages = nfs.pages[:len(nfs.pages)-1] nfs.pages = nfs.pages[:len(nfs.pages)-1]
} }