diff --git a/base/yac/stack.go b/base/yac/stack.go index 762410e8..05ca28df 100644 --- a/base/yac/stack.go +++ b/base/yac/stack.go @@ -13,6 +13,7 @@ import ( type Func struct { line int arg []string + res []string } type Frame struct { key string @@ -66,7 +67,7 @@ func (s *Stack) value(key string, arg ...ice.Any) ice.Any { kit.If(len(arg) > 0, func() { f.value[key] = arg[0] }) return f.value[key] } -func (s *Stack) runable() bool { return s.peekf().status > -1 } +func (s *Stack) runable() bool { return s.peekf().status > DISABLE } func (s *Stack) parse(m *ice.Message, p string) *Stack { nfs.Open(m, p, func(r io.Reader) { s.key, s.peekf().key = p, p @@ -78,6 +79,15 @@ func (s *Stack) parse(m *ice.Message, p string) *Stack { } for s.rest = kit.Split(text, "\t ", "+-*/;"); len(s.rest) > 0; { ls, rest := _parse_rest(BEGIN, s.rest...) + if ls[0] == END { + if f := s.peekf(); f.pop == nil { + s.last = s.popf() + } else { + f.pop() + } + s.rest = ls[1:] + continue + } kit.If(len(rest) == 0, func() { ls, rest = _parse_rest(END, ls...) }) switch s.rest = []string{}; v := s.value(ls[0]).(type) { case *Func: @@ -104,16 +114,14 @@ func (s *Stack) show() (res []string) { res = append(res, "") for i, f := range s.frame { res = append(res, kit.Format("frame: %v line: %v %v %v", i, f.line, f.key, f.status)) - kit.For(f.value, func(k string, v ice.Any) { res = append(res, kit.Format("frame: %v %v: %v", i, k, v)) }) + kit.For(f.value, func(k string, v ice.Any) { res = append(res, kit.Format(" %v %v: %v", i, k, v)) }) } return } func NewStack() *Stack { return &Stack{} } -func _parse_stack(m *ice.Message) *Stack { return m.Optionv(STACK).(*Stack) } -func _parse_frame(m *ice.Message) (*Stack, *Frame) { - return _parse_stack(m), _parse_stack(m).peekf() -} +func _parse_stack(m *ice.Message) *Stack { return m.Optionv(STACK).(*Stack) } +func _parse_frame(m *ice.Message) (*Stack, *Frame) { return _parse_stack(m), _parse_stack(m).peekf() } func _parse_rest(split string, arg ...string) ([]string, []string) { if i := kit.IndexOf(arg, split); i == -1 { return arg, nil @@ -177,14 +185,6 @@ func init() { f := s.peekf() f.status = DISABLE }}, - END: {Name: END, Hand: func(m *ice.Message, arg ...string) { - s := _parse_stack(m) - if f := s.peekf(); f.pop == nil { - s.last = s.popf() - } else { - f.pop() - } - }}, PWD: {Name: "pwd", Hand: func(m *ice.Message, arg ...string) { s := _parse_stack(m) kit.If(s.runable(), func() { @@ -198,9 +198,9 @@ func init() { return } m.SetResult() - m.Echo(ice.NL).Echo("output:" + ice.NL) + m.Echo(ice.NL).Echo("output: %s\n", arg[0]) s := NewStack().parse(m, path.Join(nfs.SRC, path.Join(arg...))) - m.Echo(ice.NL).Echo("script:" + ice.NL) + m.Echo(ice.NL).Echo("script: %s\n", arg[0]) m.Echo(strings.Join(s.show(), ice.NL)) }}, EXPR: {Name: "expr a = 1", Hand: func(m *ice.Message, arg ...string) { diff --git a/core/code/inner.go b/core/code/inner.go index 2ff9f7f8..aca0d4bb 100644 --- a/core/code/inner.go +++ b/core/code/inner.go @@ -93,7 +93,9 @@ func init() { case ctx.INDEX: m.Cmdy(ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, ice.OptionFields(ctx.INDEX)) case ctx.ARGS: - kit.If(m.Option(ctx.INDEX) != "", func() { m.Cmdy(m.Option(ctx.INDEX)) }) + kit.If(m.Option(ctx.INDEX) != "", func() { + m.Cmdy(m.Option(ctx.INDEX)).Search(m.Option(ctx.INDEX), func(key string, cmd *ice.Command) { m.Cut(kit.Format(kit.Value(cmd.List, "0.name"))) }) + }) case nfs.PATH: m.Cmdy(nfs.DIR, p, nfs.DIR_CLI_FIELDS) kit.If(strings.HasPrefix(p, bind[0]), func() { m.Cmdy(nfs.DIR, strings.Replace(p, bind[0], bind[1], 1), nfs.DIR_CLI_FIELDS) }) diff --git a/meta.go b/meta.go index 0db54c9f..2f70f1eb 100644 --- a/meta.go +++ b/meta.go @@ -285,7 +285,7 @@ func (m *Message) Sort(key string, arg ...string) *Message { if m.FieldsIsDetail() { return m } - keys, cmps := kit.Split(kit.Select(key, "type,name,text")), kit.Simple() + keys, cmps := kit.Split(kit.Select("type,name,text", key)), kit.Simple() for i, k := range keys { cmp := kit.Select("", arg, i) if cmp == "" {