From 03b1438e0b5664af0bd871b0dd97596f4d8d5719 Mon Sep 17 00:00:00 2001 From: shaoying Date: Mon, 23 Apr 2018 19:17:51 +0800 Subject: [PATCH] =?UTF-8?q?tce=20add=20nfs.Read.KeyTab=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0Tab=E8=A1=A5=E5=85=A8=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/contexts/cli/cli.go | 5 +++++ src/contexts/lex/lex.go | 4 ++++ src/contexts/nfs/nfs.go | 40 +++++++++++++++++++++++++++++++++++++--- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/contexts/cli/cli.go b/src/contexts/cli/cli.go index 487fa6ba..a4419c05 100644 --- a/src/contexts/cli/cli.go +++ b/src/contexts/cli/cli.go @@ -726,6 +726,11 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", fun := m.Find("nfs.file1." + arg[0]) // {{{ fun.Target().Start(fun) // }}} }}, + "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) { + m.Put("append", "target", cli.target) + } + }}, }, } diff --git a/src/contexts/lex/lex.go b/src/contexts/lex/lex.go index c9debda0..d45fdfaf 100644 --- a/src/contexts/lex/lex.go +++ b/src/contexts/lex/lex.go @@ -230,6 +230,10 @@ func (lex *LEX) parse(page int, line []byte) (hash int, rest []byte, word []byte pos++ c = lex.charset(line[pos])[0] } + if c > 127 { + word = append(word, c) + continue + } state := lex.mat[s][c] lex.Log("debug", nil, "(%d,%d): %v", s, c, state) diff --git a/src/contexts/nfs/nfs.go b/src/contexts/nfs/nfs.go index eb3c4fba..b2a3d8f4 100644 --- a/src/contexts/nfs/nfs.go +++ b/src/contexts/nfs/nfs.go @@ -70,23 +70,27 @@ func (nfs *NFS) Read(p []byte) (n int, err error) { his := len(nfs.buf) buf := make([]rune, 0, 1024) back := buf + tab := []string{} + tabi := 0 for { switch ev := termbox.PollEvent(); ev.Type { case termbox.EventKey: switch ev.Key { - case termbox.KeyCtrlC: + case termbox.KeyCtrlC, termbox.KeyCtrlD: termbox.Close() os.Exit(1) case termbox.KeyCtrlJ, termbox.KeyEnter: + tab = tab[:0] + buf = append(buf, '\n') nfs.print("\n") nfs.y++ b := []byte(string(buf[:len(buf)])) n = len(b) - nfs.Log("fuck", nil, "%d %v", n, b) copy(p, b) + nfs.Log("info", nil, "get %d %d %s", len(b), len(p), p) return case termbox.KeyCtrlP: his = (his + len(nfs.buf) - 1) % len(nfs.buf) @@ -115,6 +119,7 @@ func (nfs *NFS) Read(p []byte) (n int, err error) { nfs.y = 0 nfs.clear(string(buf)) case termbox.KeyCtrlU: + tab = tab[:0] nfs.clear("") if len(buf) > 0 { back = buf @@ -125,12 +130,41 @@ func (nfs *NFS) Read(p []byte) (n int, err error) { buf = back n = len(buf) nfs.clear(string(buf)) + case termbox.KeyTab: + if len(tab) == 0 { + tab = tab[:0] + tabi = 0 + msg := nfs.Message.Spawn(nfs.cli.Target()) + target := msg.Cmd("target").Data["target"].(*ctx.Context) + msg.Spawn(target).BackTrace(func(msg *ctx.Message) bool { + for k, _ := range msg.Target().Commands { + if strings.HasPrefix(k, string(buf)) { + tab = append(tab, k) + nfs.Log("info", nil, "add %s", k) + } + } + return true + }) + } + + if tabi >= 0 && tabi < len(tab) { + nfs.Log("info", nil, "get %d %d %s", len(tab), tabi, tab[tabi]) + buf = buf[:len(tab[tabi])] + n := copy(buf, []rune(tab[tabi])) + buf = buf[:n] + nfs.clear(string(buf)) + tabi = (tabi + 1) % len(tab) + } + case termbox.KeySpace: + tab = tab[:0] nfs.print(" ") buf = append(buf, ' ') n++ default: - print(string(ev.Ch)) + tab = tab[:0] + nfs.Log("fuck", nil, "%v", ev.Ch) + nfs.print(string(ev.Ch)) buf = append(buf, ev.Ch) n++ }