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:
parent
fb76f5016c
commit
3237834688
@ -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
|
||||||
|
@ -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) {
|
||||||
|
@ -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]
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user