From 395b78ac26c7abbfd291f7163bc1e533b04e81b7 Mon Sep 17 00:00:00 2001 From: shaoying Date: Fri, 11 Sep 2020 21:37:49 +0800 Subject: [PATCH] opt vim --- base/mdb/mdb.go | 5 +- base/nfs/nfs.go | 2 +- base/web/route.go | 1 - core/code/install.go | 3 + misc/git/git.shy | 2 + misc/input/input.go | 112 ++++++++-------------- misc/vim/auto.vim | 153 ++++++------------------------ misc/vim/favor.go | 86 +++++++++++++++++ misc/vim/input.go | 68 ++++++++++++++ misc/vim/sync.go | 49 ++++++++++ misc/vim/trash.vim | 67 +++++++++++++ misc/vim/vim.go | 71 +------------- misc/vim/vim.shy | 11 ++- misc/zsh/bash.go | 41 ++++++++ misc/zsh/bash.shy | 28 ++++++ misc/zsh/download.go | 41 ++++++++ misc/zsh/favor.go | 40 ++++++++ misc/zsh/input.go | 104 ++++++++++++++++++++ misc/zsh/sync.go | 76 +++++++++++++++ misc/zsh/zsh.go | 219 +------------------------------------------ misc/zsh/zsh.shy | 25 ----- 21 files changed, 692 insertions(+), 512 deletions(-) create mode 100644 misc/vim/favor.go create mode 100644 misc/vim/input.go create mode 100644 misc/vim/sync.go create mode 100644 misc/vim/trash.vim create mode 100644 misc/zsh/bash.go create mode 100644 misc/zsh/bash.shy create mode 100644 misc/zsh/download.go create mode 100644 misc/zsh/favor.go create mode 100644 misc/zsh/input.go create mode 100644 misc/zsh/sync.go diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 5a05bc51..40a37e57 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -20,7 +20,7 @@ func _file_name(m *ice.Message, arg ...string) string { func _hash_insert(m *ice.Message, prefix, key string, arg ...string) string { m.Log_INSERT("prefix", prefix, arg[0], arg[1]) - return m.Rich(prefix, key, kit.Dict(arg)) + return m.Rich(prefix, key, kit.Data(arg)) } func _hash_delete(m *ice.Message, prefix, chain, field, value string) { @@ -30,6 +30,9 @@ func _hash_delete(m *ice.Message, prefix, chain, field, value string) { }) } func _hash_select(m *ice.Message, prefix, key, field, value string) { + if field == "hash" && value == "random" { + value = kit.MDB_RANDOMS + } fields := strings.Split(kit.Select("time,hash,type,name,text", m.Option(FIELDS)), ",") m.Richs(prefix, key, value, func(key string, val map[string]interface{}) { if field != "" && field != kit.MDB_HASH && value != val[field] && value != kit.MDB_FOREACH { diff --git a/base/nfs/nfs.go b/base/nfs/nfs.go index 0d0626e2..569ab10a 100644 --- a/base/nfs/nfs.go +++ b/base/nfs/nfs.go @@ -373,7 +373,7 @@ var Index = &ice.Context{Name: "nfs", Help: "存储模块", reg, _ := regexp.Compile(m.Option(DIR_REG)) _file_list(m, kit.Select("./", m.Option(DIR_ROOT)), kit.Select("", arg, 0), 0, m.Options(DIR_DEEP), kit.Select("both", m.Option(DIR_TYPE)), reg, - strings.Split(kit.Select("time size path", strings.Join(arg[1:], " ")), " ")) + kit.Split(kit.Select("time size path", strings.Join(arg[1:], " ")), " ")) m.Sort(kit.MDB_TIME, "time_r") }}, CAT: {Name: "cat file", Help: "查看", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { diff --git a/base/web/route.go b/base/web/route.go index 99a4d131..bfd1888a 100644 --- a/base/web/route.go +++ b/base/web/route.go @@ -49,7 +49,6 @@ func init() { Commands: map[string]*ice.Command{ ROUTE: {Name: "route route=auto cmd=@key auto 启动 添加", Help: "路由", Action: map[string]*ice.Action{ "invite": {Name: "invite", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy("web.code.install", "contexts", "tmux") m.Cmdy("web.code.install", "contexts", "base") }}, "inputs": {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { diff --git a/core/code/install.go b/core/code/install.go index 997b2aec..1be6b08a 100644 --- a/core/code/install.go +++ b/core/code/install.go @@ -91,6 +91,9 @@ func init() { // 占位 p := path.Join(m.Conf(INSTALL, kit.META_PATH), name) + if strings.Contains(p, "/") { + os.MkdirAll(path.Base(p), ice.MOD_DIR) + } m.Cmd(cli.SYSTEM, "touch", p) m.Option("_process", "_progress") diff --git a/misc/git/git.shy b/misc/git/git.shy index 889c7a48..f5b83031 100644 --- a/misc/git/git.shy +++ b/misc/git/git.shy @@ -12,6 +12,8 @@ field git web.code.inner args `[ usr/install/git-1.8.3.1/ shell.c 145 ]` section "构建" spark shell ` +yum install -y gcc make libcurl-devel.x86_64 openssl-devel.x86_64 + wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-1.8.3.1.tar.gz tar xvf git-1.8.3.1.tar.gz && cd git-1.8.3.1 diff --git a/misc/input/input.go b/misc/input/input.go index 658386d0..79d2f280 100644 --- a/misc/input/input.go +++ b/misc/input/input.go @@ -3,10 +3,11 @@ package input import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/cli" + "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/nfs" "github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/core/code" kit "github.com/shylinux/toolkits" - "github.com/shylinux/toolkits/task" "bufio" "bytes" @@ -15,21 +16,23 @@ import ( "os" "path" "strings" - "sync" ) func _input_list(m *ice.Message, lib string) { if lib == "" { m.Richs(INPUT, "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) { - m.Push(key, value[kit.MDB_META], []string{kit.MDB_ZONE, kit.MDB_COUNT, kit.MDB_STORE}) + m.Push(kit.MDB_TIME, kit.Value(value, "meta.time")) + m.Push(kit.MDB_ZONE, kit.Value(value, "meta.zone")) + m.Push(kit.MDB_COUNT, kit.Value(value, "meta.count")) + m.Push(kit.MDB_STORE, kit.Value(value, "meta.store")) }) return } + m.Option(nfs.DIR_DEEP, true) + m.Option(nfs.DIR_TYPE, nfs.FILE) m.Richs(INPUT, "", lib, func(key string, value map[string]interface{}) { - m.Grows(INPUT, kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) { - m.Push(key, value, []string{kit.MDB_ID, CODE, TEXT, WEIGHT}) - }) + m.Cmdy(nfs.DIR, kit.Value(value, "meta.store"), "time size line path") }) } func _input_push(m *ice.Message, lib, text, code, weight string) { @@ -70,11 +73,6 @@ func _input_find(m *ice.Message, method, word, limit string) { } else if len(line) < 3 { } else { - if method == WORD && i == 0 { - // 添加收藏 - // web.FavorInsert(m.Spawn(), "input.word", "input", line[2], line[4], "id", line[3], WEIGHT, line[6]) - } - // 输出词汇 m.Push(FILE, path.Base(line[0])) m.Push(kit.MDB_ID, line[3]) @@ -85,40 +83,6 @@ func _input_find(m *ice.Message, method, word, limit string) { } m.Sort(WEIGHT, "int_r") } -func _input_find2(m *ice.Message, method, word, limit string) { - list := []interface{}{} - files := map[string]bool{} - m.Richs(INPUT, "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) { - kit.Fetch(kit.Value(value, "meta.record"), func(index int, value map[string]interface{}) { - file := value["file"].(string) - if _, ok := files[file]; ok { - list = append(list, file) - } else { - files[file] = true - } - }) - }) - defer m.Cost("some") - - var mu sync.Mutex - task.Sync(list, func(task *task.Task, lock *task.Lock) error { - kit.CSV(kit.Format(task.Arg), 100000, func(index int, value map[string]string, head []string) { - if value["code"] != word { - return - } - mu.Lock() - defer mu.Unlock() - - m.Push(FILE, task.Arg) - m.Push(kit.MDB_ID, value[kit.MDB_ID]) - m.Push(CODE, value["code"]) - m.Push(TEXT, value["text"]) - m.Push(WEIGHT, value["weight"]) - m.Push(kit.MDB_TIME, value["time"]) - }) - return nil - }) -} func _input_save(m *ice.Message, file string, lib ...string) { if f, p, e := kit.Create(file); m.Assert(e) { defer f.Close() @@ -153,8 +117,6 @@ func _input_load(m *ice.Message, file string, libs ...string) { kit.MDB_ZONE, lib, ))) - // 缓存配置 - // 加载词库 for bio := bufio.NewScanner(f); bio.Scan(); { if strings.HasPrefix(bio.Text(), "#") { @@ -176,53 +138,53 @@ func _input_load(m *ice.Message, file string, libs ...string) { } } -const INPUT = "input" -const ( - WORD = "word" - LINE = "line" -) const ( FILE = "file" CODE = "code" TEXT = "text" WEIGHT = "weight" ) +const ( + WORD = "word" + LINE = "line" +) +const ( + INPUT = "input" + WUBI = "wubi" +) var Index = &ice.Context{Name: INPUT, Help: "输入法", Configs: map[string]*ice.Config{ INPUT: {Name: INPUT, Help: "输入法", Value: kit.Data( - "repos", "wubi-dict", kit.MDB_STORE, "usr/export/input", kit.MDB_FSIZE, "200000", kit.MDB_LIMIT, "5000", kit.MDB_LEAST, "1000", - kit.MDB_SHORT, "zone", + kit.MDB_SHORT, "zone", "repos", "wubi-dict", )}, }, Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() }}, ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save(INPUT) }}, - "list": {Name: "list [lib]", Help: "查看词库", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - _input_list(m, kit.Select("", arg, 0)) - }}, - "push": {Name: "push lib text code [weight]", Help: "添加字码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - _input_push(m, arg[0], arg[1], arg[2], kit.Select("90919495", arg, 3)) - }}, - "find": {Name: "find key [word|line [limit]]", Help: "查找字码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) == 0 { - web.FavorList(m, "input.word", "") - return + WUBI: {Name: "wubi path=auto auto 添加 导入", Help: "五笔", Action: map[string]*ice.Action{ + mdb.INSERT: {Name: "insert zone=person text= code= weight=", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + _input_push(m, kit.Select("person", m.Option("zone")), m.Option("text"), m.Option("code"), m.Option("weight")) + }}, + mdb.SELECT: {Name: "select method=word code= ", Help: "查找", Hand: func(m *ice.Message, arg ...string) { + _input_find(m, kit.Select("word", m.Option("method")), m.Option("code"), m.Option("cache.limit")) + }}, + mdb.EXPORT: {Name: "export file=usr/wubi-dict/person zone=person", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + // _input_save(m, kit.Select("usr/wubi-dict/person", m.Option("file")), m.Option("zone")) + }}, + mdb.IMPORT: {Name: "import file=usr/wubi-dict/person zone=", Help: "导入", Hand: func(m *ice.Message, arg ...string) { + _input_load(m, kit.Select("usr/wubi-dict/person", m.Option("file")), m.Option("zone")) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Option(nfs.DIR_ROOT, m.Conf(INPUT, "meta.store")) + if len(arg) > 0 && strings.HasSuffix(arg[0], "csv") { + m.CSV(m.Cmdx(nfs.CAT, arg[0])) + } else { + m.Cmdy(nfs.DIR, kit.Select("./", arg, 0)) } - _input_find(m, kit.Select(WORD, arg, 1), arg[0], kit.Select("100", arg, 2)) - }}, - "find2": {Name: "find2 key [word|line [limit]]", Help: "查找字码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - _input_find2(m, kit.Select(WORD, arg, 1), arg[0], kit.Select("100", arg, 2)) - }}, - - "save": {Name: "save file lib...", Help: "导出词库", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - _input_save(m, arg[0], arg[1:]...) - }}, - "load": {Name: "load file lib", Help: "导入词库", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - _input_load(m, kit.Select("usr/wubi-dict/wubi86", arg, 0)) }}, }, } diff --git a/misc/vim/auto.vim b/misc/vim/auto.vim index 7e5e9ff8..3113523d 100644 --- a/misc/vim/auto.vim +++ b/misc/vim/auto.vim @@ -1,44 +1,33 @@ +" 基础函数{{{ " 变量定义 func! ShyDefine(name, value) if !exists(a:name) | exec "let " . a:name . " = \"" . a:value . "\"" | endif endfunc -" 输出日志 -call ShyDefine("g:ShyLog", "/dev/null") -fun! ShyLog(...) - call writefile([strftime("%Y-%m-%d %H:%M:%S ") . join(a:000, " ")], g:ShyLog, "a") -endfun - " 后端通信 call ShyDefine("g:ctx_url", (len($ctx_dev) > 1? $ctx_dev: "http://127.0.0.1:9020") . "/code/vim/") fun! ShySend(cmd, arg) - if has_key(a:arg, "sub") && a:arg["sub"] != "" - let temp = tempname() + if has_key(a:arg, "sub") && a:arg["sub"] != "" | let temp = tempname() call writefile(split(a:arg["sub"], "\n"), temp, "b") let a:arg["sub"] = "@" . temp endif - let a:arg["pwd"] = getcwd() - let a:arg["buf"] = bufname("%") - let a:arg["row"] = line(".") - let a:arg["col"] = col(".") - let args = "" - for k in sort(keys(a:arg)) - let args = args . " -F '" . k . "=" . a:arg[k] . "' " - endfor + let a:arg["pwd"] = getcwd() | let a:arg["buf"] = bufname("%") | let a:arg["row"] = line(".") | let a:arg["col"] = col(".") + let args = "" | for k in sort(keys(a:arg)) | let args = args . " -F '" . k . "=" . a:arg[k] . "' " | endfor return system("curl -s " . g:ctx_url . a:cmd . args . " 2>/dev/null") endfun - +" }}} +" 功能函数{{{ " 数据同步 fun! ShySync(target) if bufname("%") == "ControlP" | return | end if a:target == "read" || a:target == "write" call ShySend("sync", {"cmds": a:target, "arg": expand("")}) - elseif a:target == "exec" - call ShySend("sync", {"cmds": a:target, "arg": getcmdline()}) elseif a:target == "insert" call ShySend("sync", {"cmds": a:target, "sub": getreg(".")}) + elseif a:target == "exec" + call ShySend("sync", {"cmds": a:target, "arg": getcmdline()}) else let cmd = {"bufs": "buffers", "regs": "registers", "marks": "marks", "tags": "tags", "fixs": "clist"} call ShySend("sync", {"cmds": a:target, "sub": execute(cmd[a:target])}) @@ -52,7 +41,7 @@ endfun fun! ShyComplete(firststart, base) if a:firststart | let line = getline('.') | let start = col('.') - 1 " 命令位置 - if match(line, '\s*ice ') == 0 | return match(line, "ice ") | endif + if match(line, '\s*ice ') >= 0 | return match(line, "ice ") | endif " 符号位置 if line[start-1] !~ '\a' | return start - 1 | end " 单词位置 @@ -64,32 +53,25 @@ fun! ShyComplete(firststart, base) if a:base == "," | return [",", ","] | end if a:base == "." | return ["。", "."] | end if a:base == "\\" | return ["、", "\\"] | end + " 单词转换 - let list = ShyInput(a:base) - call ShyLog("trans", a:base, list) - return list + return ShyInput(a:base) endfun set completefunc=ShyComplete -set encoding=utf-8 -colorscheme torte -highlight Pmenu ctermfg=cyan ctermbg=darkblue -highlight PmenuSel ctermfg=darkblue ctermbg=cyan -highlight Comment ctermfg=cyan ctermbg=darkblue " 收藏列表 -call ShyDefine("g:favor_tab", "") call ShyDefine("g:favor_note", "") -let shyList=["启动流程", "请求响应", "服务集群", "数据结构", "系统架构", "编译原理"] -let g:favor_prefix="" fun! ShyFavor() - " let g:favor_tab = input("tab: ", g:favor_tab) - let g:favor_tab = g:shyList[inputlist(g:shyList)-1] + let tab_list = split(ShySend("favor", {"cmds": "select"}), "\n") + let tab = tab_list[inputlist(tab_list)-1] let g:favor_note = input("note: ", g:favor_note) - call ShySend("favor", {"tab": g:favor_prefix . g:favor_tab, "note": g:favor_note, "arg": getline("."), "row": getpos(".")[1], "col": getpos(".")[2]}) + call ShySend("favor", {"cmds": "insert", "tab": tab, "note": g:favor_note, "arg": getline("."), "row": getpos(".")[1], "col": getpos(".")[2]}) endfun fun! ShyFavors() - " let res = split(ShySend("favor", {"tab": input("tab: ", g:favor_tab)}), "\n") - let res = split(ShySend("favor", {"tab": g:shyList[inputlist(g:shyList)-1]}), "\n") + let tab_list = split(ShySend("favor", {"cmds": "topic"}), "\n") + let tab = tab_list[inputlist(tab_list)-1] + + let res = split(ShySend("favor", {"tab": tab}), "\n") let page = "" | let note = "" for i in range(0, len(res)-1, 2) if res[i] != page @@ -101,21 +83,13 @@ fun! ShyFavors() if note != "" | lexpr note | let note = "" | endif let view = inputlist(["列表", "默认", "垂直", "水平"]) - - for i in range(0, len(res)-1, 2) - if i < 5 - if l:view == 4 - split | lnext - elseif l:view == 3 - vsplit | lnext - endif - endif - endfor - botright lopen - if l:view == 1 | only | endif + for i in range(0, len(res)-1, 2) | if i < 5 + if l:view == 4 | split | lnext | elseif l:view == 3 | vsplit | lnext | endif + endif | endfor + botright lopen | if l:view == 1 | only | endif endfun -" 搜索 +" 文件搜索 call ShyDefine("g:grep_dir", "./") fun! ShyGrep(word) let g:grep_dir = input("dir: ", g:grep_dir, "file") @@ -123,87 +97,18 @@ fun! ShyGrep(word) execute "grep -rn '\\<" . a:word . "\\>' " . g:grep_dir copen endfun - -" 自动刷新 -let ShyComeList = {} -fun! ShyCome(buf, row, action, extra) - " 低配命令 - if !exists("appendbufline") - execute a:extra["row"] - - if a:extra["count"] > 0 - execute "+1,+" . a:extra["count"] ."delete" - endif - - let a:extra["count"] = 0 - for line in reverse(split(ShySend("sync", {"cmds": "trans", "arg": getline(".")}), "\n")) - let a:extra["count"] += 1 - call append(".", line) - endfor - return - endif - if a:action == "refresh" - " 清空历史 - if a:extra["count"] > 0 | call deletebufline(a:buf, a:row+1, a:row+a:extra["count"]) | endif - let a:extra["count"] = 0 - endif - " 刷新命令 - for line in reverse(split(ShySend({"cmd": "trans", "arg": getbufline(a:buf, a:row)[0]}), "\n")) - call appendbufline(a:buf, a:row, line) - let a:extra["count"] += 1 - endfor - " 插入表头 - call appendbufline(a:buf, a:row, strftime(" ~~ %Y-%m-%d %H:%M:%S")) - let a:extra["count"] += 1 -endfun -fun! ShyUpdate(timer) - let what = g:ShyComeList[a:timer] - call ShyLog("timer", a:timer, what) - call ShyCome(what["buf"], what["row"], what["action"], what) -endfun -fun! ShyComes(action) - if !exists("b:timer") | let b:timer = -1 | endif - " 清除定时 - if b:timer > 0 | call timer_stop(b:timer) | let b:timer = -2 | return | endif - " 添加定时 - let b:timer = timer_start(1000, funcref('ShyUpdate'), {"repeat": -1}) - let g:ShyComeList[b:timer] = {"buf": bufname("."), "row": line("."), "pre": getline("."), "action": a:action, "count": 0} - call ShyLog("new timer", b:timer) -endfun -fun! ShyCheck(target) - if a:target == "cache" - call ShySync("bufs") - call ShySync("regs") - call ShySync("marks") - call ShySync("tags") - elseif a:target == "fixs" - let l = len(getqflist()) - if l > 0 - execute "copen " . (l > 10? 10: l + 1) - call ShySync("fixs") - else - cclose - end - end -endfun - -" 事件回调 +" }}} +" 事件回调{{{ autocmd! BufReadPost * call ShySync("bufs") autocmd! BufReadPost * call ShySync("read") autocmd! BufWritePre * call ShySync("write") -if exists("CmdlineLeave") - autocmd! CmdlineLeave * call ShySync("exec") -else - autocmd! CmdWinLeave * call ShySync("exec") -endif -" autocmd! QuickFixCmdPost * call ShyCheck("fixs") autocmd! InsertLeave * call ShySync("insert") - -" 按键映射 +autocmd! CmdlineLeave * call ShySync("exec") +"}}} +" 按键映射{{{ nnoremap :call ShyGrep(expand("")) nnoremap :call ShyFavor() nnoremap f :call ShyFavors() -" nnoremap :call ShyCheck("cache") -nnoremap :call ShyComes("refresh") inoremap +"}}} diff --git a/misc/vim/favor.go b/misc/vim/favor.go new file mode 100644 index 00000000..f676f5f7 --- /dev/null +++ b/misc/vim/favor.go @@ -0,0 +1,86 @@ +package vim + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/mdb" + kit "github.com/shylinux/toolkits" + + "strings" +) + +const FAVOR = "favor" + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{ + FAVOR: {Name: FAVOR, Help: "收藏夹", Value: kit.Data( + kit.MDB_SHORT, "topic", kit.MDB_FIELD, "time,id,type,name,text,file,line", + )}, + }, + Commands: map[string]*ice.Command{ + FAVOR: {Name: "favor topic=auto id=auto auto 创建 导出 导入", Help: "收藏夹", Action: map[string]*ice.Action{ + mdb.CREATE: {Name: "create topic", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), "", mdb.HASH, arg) + }}, + mdb.INSERT: {Name: "insert topic=数据结构 name=hi text=hello file=hi.c line=1", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Richs(m.Prefix(FAVOR), "", m.Option("topic"), func(key string, value map[string]interface{}) { + m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, arg) + }) + }}, + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + m.Richs(m.Prefix(FAVOR), "", m.Option("topic"), func(key string, value map[string]interface{}) { + m.Cmdy(mdb.MODIFY, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg) + }) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, m.Prefix(FAVOR), "", mdb.HASH, "topic", m.Option("topic")) + }}, + mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.EXPORT, m.Prefix(FAVOR), "", mdb.HASH) + }}, + mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.IMPORT, m.Prefix(FAVOR), "", mdb.HASH) + }}, + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + switch arg[0] { + case "topic": + m.Option(mdb.FIELDS, "time,count,topic") + m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), "", mdb.HASH) + } + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) > 0 { + m.Option(mdb.FIELDS, kit.Select(m.Conf(m.Prefix(FAVOR), kit.META_FIELD), mdb.DETAIL, len(arg) > 1)) + m.Richs(m.Prefix(FAVOR), "", arg[0], func(key string, value map[string]interface{}) { + m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, kit.MDB_ID, arg[1:]) + }) + return + } + m.Option(mdb.FIELDS, "time,count,topic") + m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), "", mdb.HASH) + m.PushAction("删除") + }}, + + "/favor": {Name: "/favor", Help: "收藏", Action: map[string]*ice.Action{ + "select": {Name: "select", Help: "主题", Hand: func(m *ice.Message, arg ...string) { + list := []string{} + m.Cmd(m.Prefix(FAVOR)).Table(func(index int, value map[string]string, head []string) { + list = append(list, value["topic"]) + }) + m.Render(ice.RENDER_RESULT, strings.Join(list, "\n")) + }}, + "insert": {Name: "insert", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(m.Prefix(FAVOR), mdb.INSERT, "topic", m.Option("tab"), + "name", m.Option("note"), "text", m.Option("arg"), "file", m.Option("buf"), "line", m.Option("row"), + ) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Render(ice.RENDER_RESULT) + m.Cmd(m.Prefix(FAVOR), m.Option("tab")).Table(func(index int, value map[string]string, head []string) { + m.Echo("%v\n", m.Option("tab")).Echo("%v:%v:%v:(%v): %v\n", + value["file"], value["line"], "1", value["name"], value["text"]) + }) + }}, + }, + }, nil) +} diff --git a/misc/vim/input.go b/misc/vim/input.go new file mode 100644 index 00000000..cab69134 --- /dev/null +++ b/misc/vim/input.go @@ -0,0 +1,68 @@ +package vim + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/cli" + "github.com/shylinux/icebergs/base/mdb" + kit "github.com/shylinux/toolkits" + + "strings" +) + +const INPUT = "input" + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{ + INPUT: {Name: INPUT, Help: "输入法", Value: kit.Data( + kit.MDB_FIELD, "time,id,type,name,text", + )}, + }, + Commands: map[string]*ice.Command{ + INPUT: {Name: "sync id=auto auto 导出 导入", Help: "同步流", Action: map[string]*ice.Action{ + mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.EXPORT, m.Prefix(INPUT), "", mdb.LIST) + }}, + mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.IMPORT, m.Prefix(INPUT), "", mdb.LIST) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Option(mdb.FIELDS, kit.Select(m.Conf(INPUT, kit.META_FIELD), mdb.DETAIL, len(arg) > 0)) + m.Cmdy(mdb.SELECT, m.Prefix(INPUT), "", mdb.LIST, kit.MDB_ID, arg) + }}, + "/input": {Name: "/input", Help: "补全", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Render(ice.RENDER_RESULT) + + if arg[0] = strings.TrimSpace(arg[0]); strings.HasPrefix(arg[0], "ice ") { + list := kit.Split(arg[0]) + switch list[1] { + case "add": + // ice add 想你 shwq [9999 [person]] + m.Cmd("web.code.input.wubi", "insert", "text", list[2], "code", list[3], + "weight", kit.Select("999999", list, 4), "zone", kit.Select("person", list, 5)) + arg[0] = list[3] + default: + // ice command + if m.Cmdy(list[1:]); strings.TrimSpace(m.Result()) == "" { + m.Table() + } + if strings.TrimSpace(m.Result()) == "" { + m.Cmdy(cli.SYSTEM, list[1:]) + } + m.Cmd(mdb.INSERT, m.Prefix(INPUT), "", mdb.LIST, kit.MDB_TYPE, "cmd", + kit.MDB_NAME, strings.TrimSpace(strings.Join(list[1:], " ")), kit.MDB_TEXT, m.Result()) + m.Echo("%s\n", arg[0]) + return + } + } + + // 词汇列表 + m.Cmd("web.code.input.wubi", "select", "code", arg[0]).Table(func(index int, value map[string]string, head []string) { + m.Echo("%s\n", value["text"]) + }) + + m.Cmd(mdb.INSERT, m.Prefix(INPUT), "", mdb.LIST, kit.MDB_TYPE, "wubi", kit.MDB_NAME, arg[0], kit.MDB_TEXT, m.Result()) + }}, + }, + }, nil) +} diff --git a/misc/vim/sync.go b/misc/vim/sync.go new file mode 100644 index 00000000..75ece96a --- /dev/null +++ b/misc/vim/sync.go @@ -0,0 +1,49 @@ +package vim + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/web" + kit "github.com/shylinux/toolkits" + + "io/ioutil" +) + +const SYNC = "sync" + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{ + SYNC: {Name: SYNC, Help: "同步流", Value: kit.Data( + kit.MDB_FIELD, "time,id,type,name,text", + )}, + }, + Commands: map[string]*ice.Command{ + web.LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if f, _, e := m.R.FormFile("sub"); e == nil { + defer f.Close() + if b, e := ioutil.ReadAll(f); e == nil { + m.Option("sub", string(b)) + } + } + }}, + + SYNC: {Name: "sync id=auto auto 导出 导入", Help: "同步流", Action: map[string]*ice.Action{ + mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.EXPORT, m.Prefix(SYNC), "", mdb.LIST) + }}, + mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.IMPORT, m.Prefix(SYNC), "", mdb.LIST) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Option(mdb.FIELDS, kit.Select(m.Conf(SYNC, kit.META_FIELD), mdb.DETAIL, len(arg) > 0)) + m.Cmdy(mdb.SELECT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_ID, arg) + }}, + "/sync": {Name: "/sync", Help: "同步", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Render(ice.RENDER_RESULT) + m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_TYPE, VIMRC, kit.MDB_NAME, arg[0], kit.MDB_TEXT, kit.Select(m.Option("arg"), m.Option("sub")), + "pwd", m.Option("pwd"), "buf", m.Option("buf"), "row", m.Option("row"), "col", m.Option("col")) + }}, + }, + }, nil) +} diff --git a/misc/vim/trash.vim b/misc/vim/trash.vim new file mode 100644 index 00000000..768bd37a --- /dev/null +++ b/misc/vim/trash.vim @@ -0,0 +1,67 @@ + +" 自动刷新 +let ShyComeList = {} +fun! ShyCome(buf, row, action, extra) + " 低配命令 + if !exists("appendbufline") + execute a:extra["row"] + + if a:extra["count"] > 0 + execute "+1,+" . a:extra["count"] ."delete" + endif + + let a:extra["count"] = 0 + for line in reverse(split(ShySend("sync", {"cmds": "trans", "arg": getline(".")}), "\n")) + let a:extra["count"] += 1 + call append(".", line) + endfor + return + endif + if a:action == "refresh" + " 清空历史 + if a:extra["count"] > 0 | call deletebufline(a:buf, a:row+1, a:row+a:extra["count"]) | endif + let a:extra["count"] = 0 + endif + " 刷新命令 + for line in reverse(split(ShySend({"cmd": "trans", "arg": getbufline(a:buf, a:row)[0]}), "\n")) + call appendbufline(a:buf, a:row, line) + let a:extra["count"] += 1 + endfor + " 插入表头 + call appendbufline(a:buf, a:row, strftime(" ~~ %Y-%m-%d %H:%M:%S")) + let a:extra["count"] += 1 +endfun +fun! ShyUpdate(timer) + let what = g:ShyComeList[a:timer] + call ShyLog("timer", a:timer, what) + call ShyCome(what["buf"], what["row"], what["action"], what) +endfun +fun! ShyComes(action) + if !exists("b:timer") | let b:timer = -1 | endif + " 清除定时 + if b:timer > 0 | call timer_stop(b:timer) | let b:timer = -2 | return | endif + " 添加定时 + let b:timer = timer_start(1000, funcref('ShyUpdate'), {"repeat": -1}) + let g:ShyComeList[b:timer] = {"buf": bufname("."), "row": line("."), "pre": getline("."), "action": a:action, "count": 0} + call ShyLog("new timer", b:timer) +endfun +fun! ShyCheck(target) + if a:target == "cache" + call ShySync("bufs") + call ShySync("regs") + call ShySync("marks") + call ShySync("tags") + elseif a:target == "fixs" + let l = len(getqflist()) + if l > 0 + execute "copen " . (l > 10? 10: l + 1) + call ShySync("fixs") + else + cclose + end + end +endfun + + +" nnoremap :call ShyCheck("cache") +nnoremap :call ShyComes("refresh") diff --git a/misc/vim/vim.go b/misc/vim/vim.go index a9638f40..233fc316 100644 --- a/misc/vim/vim.go +++ b/misc/vim/vim.go @@ -60,7 +60,12 @@ var Index = &ice.Context{Name: VIM, Help: "编辑器", m.Cmdy(code.INSTALL, path.Base(m.Conf(VIM, kit.META_SOURCE)), arg) }}, + ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Save() + }}, ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Load() + m.Conf(web.FAVOR, "meta.render.vimrc", m.AddCmd(&ice.Command{Name: "render favor id", Help: "渲染引擎", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { value := m.Optionv("value").(map[string]interface{}) switch value["name"] { @@ -85,72 +90,6 @@ var Index = &ice.Context{Name: VIM, Help: "编辑器", m.Cmd(mdb.RENDER, mdb.CREATE, VIMRC, VIM, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.PLUGIN, mdb.CREATE, VIM, VIM, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.RENDER, mdb.CREATE, VIM, VIM, c.Cap(ice.CTX_FOLLOW)) - - m.Cmd("web.spide_rewrite", "create", "from", "ftp://ftp.vim.org/pub/vim/unix/vim-8.1.tar.bz2", "to", "http://localhost:9020/publish/vim-8.1.tar.bz2") - m.Cmd("web.spide_rewrite", "create", "from", "https://raw.githubusercontent.com/shylinux/contexts/master/etc/conf/vimrc", "to", "http://localhost:9020/publish/vimrc") - m.Cmd("web.spide_rewrite", "create", "from", "https://raw.githubusercontent.com/shylinux/contexts/master/etc/conf/plug.vim", "to", "http://localhost:9020/publish/plug.vim") - m.Cmd("nfs.file_rewrite", "create", "from", "etc/conf/plug.vim", "to", "https://raw.githubusercontent.com/shylinux/contexts/master/etc/conf/plug.vim") - }}, - - "/sync": {Name: "/sync", Help: "同步", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Render(ice.RENDER_RESULT) - switch arg[0] { - case "read", "write", "exec", "insert": - m.Cmd(web.FAVOR, m.Conf(VIM, "meta.history"), web.TYPE_VIMRC, arg[0], kit.Select(m.Option("arg"), m.Option("sub")), - "pwd", m.Option("pwd"), "buf", m.Option("buf"), "row", m.Option("row"), "col", m.Option("col")) - case "trans": - if m.Cmdy(kit.Split(m.Option("arg"))); m.Result() == "" { - m.Table() - } - } - }}, - "/input": {Name: "/input", Help: "补全", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Render(ice.RENDER_RESULT) - arg[0] = strings.TrimSpace(arg[0]) - - if strings.HasPrefix(arg[0], "ice ") { - list := kit.Split(strings.TrimSpace(arg[0])) - switch list[1] { - case "add": - // ice add person 想你 shwq - m.Cmd("web.code.input.push", list[2:]) - arg[0] = list[4] - default: - // ice command - if m.Cmdy(list[1:]); m.Result() == "" { - m.Echo("%s\n", arg[0]) - m.Table() - } - return - } - } - - // 词汇列表 - m.Cmd("web.code.input.find", arg[0]).Table(func(index int, value map[string]string, head []string) { - m.Echo("%s\n", value["text"]) - }) - }}, - "/favor": {Name: "/favor", Help: "收藏", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Render(ice.RENDER_RESULT) - if m.Options("arg") { - // 添加收藏 - m.Cmdy(web.FAVOR, kit.Select(m.Conf("vim", "meta.history"), m.Option("tab")), - web.TYPE_VIMRC, m.Option("note"), m.Option("arg"), - "pwd", m.Option("pwd"), "buf", m.Option("buf"), "row", m.Option("row"), "col", m.Option("col")) - return - } - - // 查看收藏 - m.Richs(web.FAVOR, nil, m.Option("tab"), func(key string, val map[string]interface{}) { - m.Grows(web.FAVOR, kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) { - extra := value["extra"].(map[string]interface{}) - switch value[kit.MDB_TYPE] { - case web.TYPE_VIMRC: - m.Echo("%v\n", m.Option("tab")).Echo("%v:%v:%v:(%v): %v\n", - extra["buf"], extra["row"], extra["col"], value["name"], value["text"]) - } - }) - }) }}, }, Configs: map[string]*ice.Config{ diff --git a/misc/vim/vim.shy b/misc/vim/vim.shy index 68e078b9..7d9a50c1 100644 --- a/misc/vim/vim.shy +++ b/misc/vim/vim.shy @@ -25,7 +25,12 @@ spark shell ` cd ./install ./bin/vim ` -chapter "使用" + +chapter "应用" +field "同步流" web.code.vim.sync +field "输入法" web.code.vim.input +field "收藏夹" web.code.vim.favor +field "输入法" web.code.input.wubi chapter "配置" @@ -44,7 +49,3 @@ section "状态栏" refer ` 插件 https://github.com/vim-airline/vim-airline ` - -chapter "应用" -section "收藏夹" -section "输入法" diff --git a/misc/zsh/bash.go b/misc/zsh/bash.go new file mode 100644 index 00000000..7f935291 --- /dev/null +++ b/misc/zsh/bash.go @@ -0,0 +1,41 @@ +package zsh + +import ( + "path" + + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/cli" + "github.com/shylinux/icebergs/core/code" + kit "github.com/shylinux/toolkits" +) + +const BASH = "bash" + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{ + BASH: {Name: BASH, Help: "命令行", Value: kit.Data( + "source", "http://mirrors.aliyun.com/gnu/bash/bash-4.2.53.tar.gz", + )}, + }, + Commands: map[string]*ice.Command{ + BASH: {Name: "bash port=auto path=auto auto 启动:button 构建:button 下载:button", Help: "命令行", Action: map[string]*ice.Action{ + "download": {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(code.INSTALL, "download", m.Conf(BASH, kit.META_SOURCE)) + }}, + "build": {Name: "build", Help: "构建", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(code.INSTALL, "build", m.Conf(BASH, kit.META_SOURCE)) + }}, + "start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + m.Optionv("prepare", func(p string) []string { + m.Option(cli.CMD_DIR, p) + return []string{} + }) + m.Cmdy(code.INSTALL, "start", m.Conf(BASH, kit.META_SOURCE), "bin/bash") + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmdy(code.INSTALL, path.Base(m.Conf(BASH, kit.META_SOURCE)), arg) + }}, + }, + }, nil) +} diff --git a/misc/zsh/bash.shy b/misc/zsh/bash.shy new file mode 100644 index 00000000..c9d4ec09 --- /dev/null +++ b/misc/zsh/bash.shy @@ -0,0 +1,28 @@ +title "bash" +refer ` +官网 https://www.gnu.org/software/bash/ +源码 http://ftp.gnu.org/gnu/bash/ +文档 https://www.gnu.org/software/bash/manual/bash.html +` +chapter "源码" +field "bash" web.code.zsh.bash +field "bash" web.code.inner args `[ usr/install/bash-4.2.53/ input.c 625 ]` + +section "构建" +spark shell ` +wget http://mirrors.aliyun.com/gnu/bash/bash-4.2.53.tar.gz +tar xvf bash-4.2.53.tar.gz && cd bash-4.2.53 + +./configure --prefix=$PWD/install +make -j4 && make install +` + +section "使用体验" +spark shell ` +cd ./install +./bin/bash +` +chapter "应用" + +field "同步流" web.code.zsh.sync +field "同步流" web.favor diff --git a/misc/zsh/download.go b/misc/zsh/download.go new file mode 100644 index 00000000..346f376e --- /dev/null +++ b/misc/zsh/download.go @@ -0,0 +1,41 @@ +package zsh + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/web" + kit "github.com/shylinux/toolkits" +) + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{}, + Commands: map[string]*ice.Command{ + "/download": {Name: "/download", Help: "下载", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) == 0 || arg[0] == "" { + // 文件列表 + m.Cmdy(web.PROXY, m.Option("you"), web.STORY).Table() + return + } + + // 查找文件 + if m.Cmdy(web.STORY, "index", arg[0]).Append("text") == "" && m.Option("you") != "" { + // 上发文件 + m.Cmd(web.PROXY, m.Option("you"), web.STORY, "push", arg[0], "dev", arg[0]) + m.Cmdy(web.STORY, "index", arg[0]) + } + + // 下载文件 + m.Render(kit.Select(ice.RENDER_DOWNLOAD, ice.RENDER_RESULT, m.Append("file") == ""), m.Append("text")) + }}, + "/upload": {Name: "/upload", Help: "上传", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + // 缓存文件 + msg := m.Cmd(web.STORY, "upload") + m.Echo("data: %s\n", msg.Append("data")) + m.Echo("time: %s\n", msg.Append("time")) + m.Echo("type: %s\n", msg.Append("type")) + m.Echo("name: %s\n", msg.Append("name")) + m.Echo("size: %s\n", msg.Append("size")) + }}, + }, + }, nil) +} diff --git a/misc/zsh/favor.go b/misc/zsh/favor.go new file mode 100644 index 00000000..9cdf3f58 --- /dev/null +++ b/misc/zsh/favor.go @@ -0,0 +1,40 @@ +package zsh + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/web" + kit "github.com/shylinux/toolkits" +) + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{}, + Commands: map[string]*ice.Command{ + "/favor": {Name: "/favor", Help: "收藏", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) > 0 && arg[0] != "sh" { + // 添加收藏 + m.Cmdy(web.FAVOR, kit.Select(m.Conf("zsh", "meta.history"), m.Option("tab")), + kit.Select(web.TYPE_SHELL, m.Option("type")), m.Option("note"), arg[0]) + return + } + + if m.Option("tab") == "" { + // 收藏列表 + m.Cmdy(web.FAVOR).Table() + return + } + + m.Echo("#/bin/sh\n\n") + m.Cmd(web.PROXY, m.Option("you"), web.FAVOR, m.Option("tab")).Table(func(index int, value map[string]string, head []string) { + switch value["type"] { + case web.TYPE_SHELL: + // 查看收藏 + if m.Option("note") == "" || m.Option("note") == value["name"] { + m.Echo("# %v\n%v\n\n", value["name"], value["text"]) + } + } + }) + }}, + }, + }, nil) +} diff --git a/misc/zsh/input.go b/misc/zsh/input.go new file mode 100644 index 00000000..1dcfe68c --- /dev/null +++ b/misc/zsh/input.go @@ -0,0 +1,104 @@ +package zsh + +import ( + "strings" + "unicode" + + ice "github.com/shylinux/icebergs" + kit "github.com/shylinux/toolkits" +) + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{}, + Commands: map[string]*ice.Command{ + "/input": {Name: "/input", Help: "补全", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + list := kit.Split(m.Option("line"), m.Option("break")) + word := list[kit.Int(m.Option("index"))] + switch arg[0] { + case "shy": + m.Cmd("web.code.input.find", word).Table(func(index int, value map[string]string, head []string) { + m.Echo(value["text"]).Echo(" ") + }) + + case "line": + if strings.HasPrefix(m.Option("line"), "ice ") { + list := kit.Split(m.Option("line")) + switch list[1] { + case "add": + m.Cmd("web.code.input.push", list[2:]) + m.Option("line", list[4]) + m.Option("point", 0) + default: + m.Cmdy(list[1:]) + break + } + } + + line := []rune(m.Option("line")) + if begin := kit.Int(m.Option("point")); begin < len(line) { + m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) { + m.Echo(string(line[:begin])) + for i := begin; i < len(line); i++ { + if i-begin < 3 && i < len(line)-1 { + continue + } + // 编码转换 + for j := 0; j < 4; j++ { + code := string(line[begin : i+1-j]) + list := append(m.Cmd("web.code.input.find", code).Appendv("text"), code) + if len(list) > 1 { + m.Echo(kit.Select(code, list[0])) + m.Info("input %s->%s", code, list[0]) + i = i - j + break + } + } + // 输出编码 + begin = i + 1 + } + }) + break + } + fallthrough + case "end": + m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) { + last_text := kit.Format(kit.Value(value, "last.text")) + last_list := kit.Simple(kit.Value(value, "last.list")) + last_index := kit.Int(kit.Value(value, "last.index")) + + if last_text != "" && strings.HasSuffix(m.Option("line"), last_text) { + // 补全记录 + index := last_index + 1 + text := last_list[index%len(last_list)] + kit.Value(value, "last.index", index) + kit.Value(value, "last.text", text) + m.Echo(strings.TrimSuffix(m.Option("line"), last_text) + text) + m.Info("%d %v", index, last_list) + return + } + + line := []rune(m.Option("line")) + for i := len(line); i >= 0; i-- { + if i > 0 && len(line)-i < 4 && unicode.IsLower(line[i-1]) { + continue + } + + // 编码转换 + code := string(line[i:]) + list := append(m.Cmd("web.code.input.find", code).Appendv("text"), code) + value["last"] = kit.Dict("code", code, "text", list[0], "list", list, "index", 0) + + // 输出编码 + m.Echo(string(line[:i])) + m.Echo(kit.Select(code, list[0])) + m.Info("input %s->%s", code, list[0]) + break + } + }) + } + m.Info("trans: %v", m.Result()) + }}, + }, + }, nil) +} diff --git a/misc/zsh/sync.go b/misc/zsh/sync.go new file mode 100644 index 00000000..03646ca7 --- /dev/null +++ b/misc/zsh/sync.go @@ -0,0 +1,76 @@ +package zsh + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/web" + kit "github.com/shylinux/toolkits" + + "io/ioutil" + "strings" +) + +const SYNC = "sync" +const SHELL = "shell" + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{ + SYNC: {Name: SYNC, Help: "同步流", Value: kit.Data( + kit.MDB_FIELD, "time,id,type,name,text", + )}, + }, + Commands: map[string]*ice.Command{ + web.LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if f, _, e := m.R.FormFile("sub"); e == nil { + defer f.Close() + // 文件参数 + if b, e := ioutil.ReadAll(f); e == nil { + m.Option("sub", string(b)) + } + } + + m.Option("you", m.Conf("zsh", "meta.proxy")) + m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) { + // 查找空间 + m.Option("you", kit.Select(m.Conf("zsh", "meta.proxy"), value["you"])) + }) + + m.Option("arg", strings.ReplaceAll(m.Option("arg"), "%20", " ")) + m.Logs(ice.LOG_AUTH, "you", m.Option("you"), "url", m.Option(ice.MSG_USERURL), "cmd", m.Optionv("cmds"), "sub", m.Optionv("sub")) + m.Option(ice.MSG_OUTPUT, ice.RENDER_RESULT) + }}, + + SYNC: {Name: "sync id=auto auto 导出 导入", Help: "同步流", Action: map[string]*ice.Action{ + mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.EXPORT, m.Prefix(SYNC), "", mdb.LIST) + }}, + mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.IMPORT, m.Prefix(SYNC), "", mdb.LIST) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Option(mdb.FIELDS, kit.Select(m.Conf(SYNC, kit.META_FIELD), mdb.DETAIL, len(arg) > 0)) + m.Cmdy(mdb.SELECT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_ID, arg) + }}, + "/sync": {Name: "/sync", Help: "同步", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + switch arg[0] { + case "history": + vs := strings.SplitN(strings.TrimSpace(m.Option("arg")), " ", 4) + if strings.Contains(m.Option("SHELL"), "zsh") { + vs = []string{vs[0], m.Time("2006-01-02"), m.Time("15:04:05"), strings.Join(vs[1:], " ")} + } + m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_TYPE, SHELL, kit.MDB_NAME, vs[0], + kit.MDB_TEXT, kit.Select("", vs, 3), "pwd", m.Option("pwd"), kit.MDB_TIME, vs[1]+" "+vs[2]) + + default: + m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) { + kit.Value(value, kit.Keys("sync", arg[0]), kit.Dict( + "time", m.Time(), "text", m.Option("sub"), + "pwd", m.Option("pwd"), "cmd", arg[1:], + )) + }) + } + }}, + }, + }, nil) +} diff --git a/misc/zsh/zsh.go b/misc/zsh/zsh.go index f621a4ee..7fe85e0f 100644 --- a/misc/zsh/zsh.go +++ b/misc/zsh/zsh.go @@ -7,24 +7,16 @@ import ( "github.com/shylinux/icebergs/core/code" kit "github.com/shylinux/toolkits" - "io/ioutil" "net/url" - "os" "path" - "strings" - "unicode" ) const ( - BASH = "bash" - ZSH = "zsh" + ZSH = "zsh" ) var Index = &ice.Context{Name: ZSH, Help: "命令行", Configs: map[string]*ice.Config{ - BASH: {Name: BASH, Help: "命令行", Value: kit.Data( - "source", "http://mirrors.aliyun.com/gnu/bash/bash-4.2.53.tar.gz", - )}, ZSH: {Name: ZSH, Help: "命令行", Value: kit.Data( "source", "https://sourceforge.net/projects/zsh/files/zsh/5.8/zsh-5.8.tar.xz", @@ -36,23 +28,6 @@ var Index = &ice.Context{Name: ZSH, Help: "命令行", )}, }, Commands: map[string]*ice.Command{ - BASH: {Name: "bash port=auto path=auto auto 启动:button 构建:button 下载:button", Help: "命令行", Action: map[string]*ice.Action{ - "download": {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(code.INSTALL, "download", m.Conf(BASH, kit.META_SOURCE)) - }}, - "build": {Name: "build", Help: "构建", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(code.INSTALL, "build", m.Conf(BASH, kit.META_SOURCE)) - }}, - "start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { - m.Optionv("prepare", func(p string) []string { - m.Option(cli.CMD_DIR, p) - return []string{} - }) - m.Cmdy(code.INSTALL, "start", m.Conf(BASH, kit.META_SOURCE), "bin/bash") - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmdy(code.INSTALL, path.Base(m.Conf(BASH, kit.META_SOURCE)), arg) - }}, ZSH: {Name: "zsh port=auto path=auto auto 启动:button 构建:button 下载:button", Help: "命令行", Action: map[string]*ice.Action{ "download": {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(code.INSTALL, "download", m.Conf(ZSH, kit.META_SOURCE)) @@ -71,7 +46,11 @@ var Index = &ice.Context{Name: ZSH, Help: "命令行", m.Cmdy(code.INSTALL, path.Base(m.Conf(ZSH, kit.META_SOURCE)), arg) }}, + ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Save() + }}, ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Load() // m.Cmd("web.spide_rewrite", "create", "from", "https://sourceforge.net/projects/zsh/files/zsh/5.8/zsh-5.8.tar.xz", "to", "http://localhost:9020/publish/zsh-5.8.tar.gz") m.Conf(web.FAVOR, "meta.render.shell", m.AddCmd(&ice.Command{Name: "render type name text", Help: "渲染引擎", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { @@ -87,36 +66,6 @@ var Index = &ice.Context{Name: ZSH, Help: "命令行", m.Cmdy(cli.SYSTEM, "file", arg[2]) }})) }}, - code.PREPARE: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmd("web.code.git.repos", "shell", "usr/shell") - p := path.Join(os.Getenv("HOME"), ".ish") - m.Cmd(cli.SYSTEM, "rm", p) - m.Cmd(cli.SYSTEM, "ln", "-s", kit.Path("usr/shell"), p) - - list := kit.Simple(m.Confv("zsh", "meta.script")) - for i := 0; i < len(list); i += 2 { - m.Cmd("nfs.link", path.Join(os.Getenv("HOME"), list[i]), list[i+1]) - } - }}, - web.LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if f, _, e := m.R.FormFile("sub"); e == nil { - defer f.Close() - // 文件参数 - if b, e := ioutil.ReadAll(f); e == nil { - m.Option("sub", string(b)) - } - } - - m.Option("you", m.Conf("zsh", "meta.proxy")) - m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) { - // 查找空间 - m.Option("you", kit.Select(m.Conf("zsh", "meta.proxy"), value["you"])) - }) - - m.Option("arg", strings.ReplaceAll(m.Option("arg"), "%20", " ")) - m.Logs(ice.LOG_AUTH, "you", m.Option("you"), "url", m.Option(ice.MSG_USERURL), "cmd", m.Optionv("cmds"), "sub", m.Optionv("sub")) - m.Option(ice.MSG_OUTPUT, ice.RENDER_RESULT) - }}, "/help": {Name: "/help", Help: "帮助", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Cmdy("help") @@ -128,137 +77,6 @@ var Index = &ice.Context{Name: ZSH, Help: "命令行", m.Cmdy("login", "exit") }}, - "/sync": {Name: "/sync", Help: "同步", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - switch arg[0] { - case "history": - vs := strings.SplitN(strings.TrimSpace(m.Option("arg")), " ", 4) - if strings.Contains(m.Option("SHELL"), "zsh") { - vs = []string{vs[0], m.Time("2006-01-02"), m.Time("15:04:05"), strings.Join(vs[1:], " ")} - } - m.Cmd(web.FAVOR, m.Conf("zsh", "meta.history"), web.TYPE_SHELL, vs[0], kit.Select("", vs, 3), - "sid", m.Option("sid"), "pwd", m.Option("pwd"), "time", vs[1]+" "+vs[2]) - - default: - m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) { - kit.Value(value, kit.Keys("sync", arg[0]), kit.Dict( - "time", m.Time(), "text", m.Option("sub"), - "pwd", m.Option("pwd"), "cmd", arg[1:], - )) - }) - } - }}, - "/input": {Name: "/input", Help: "补全", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - list := kit.Split(m.Option("line"), m.Option("break")) - word := list[kit.Int(m.Option("index"))] - switch arg[0] { - case "shy": - m.Cmd("web.code.input.find", word).Table(func(index int, value map[string]string, head []string) { - m.Echo(value["text"]).Echo(" ") - }) - - case "line": - if strings.HasPrefix(m.Option("line"), "ice ") { - list := kit.Split(m.Option("line")) - switch list[1] { - case "add": - m.Cmd("web.code.input.push", list[2:]) - m.Option("line", list[4]) - m.Option("point", 0) - default: - m.Cmdy(list[1:]) - break - } - } - - line := []rune(m.Option("line")) - if begin := kit.Int(m.Option("point")); begin < len(line) { - m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) { - m.Echo(string(line[:begin])) - for i := begin; i < len(line); i++ { - if i-begin < 3 && i < len(line)-1 { - continue - } - // 编码转换 - for j := 0; j < 4; j++ { - code := string(line[begin : i+1-j]) - list := append(m.Cmd("web.code.input.find", code).Appendv("text"), code) - if len(list) > 1 { - m.Echo(kit.Select(code, list[0])) - m.Info("input %s->%s", code, list[0]) - i = i - j - break - } - } - // 输出编码 - begin = i + 1 - } - }) - break - } - fallthrough - case "end": - m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) { - last_text := kit.Format(kit.Value(value, "last.text")) - last_list := kit.Simple(kit.Value(value, "last.list")) - last_index := kit.Int(kit.Value(value, "last.index")) - - if last_text != "" && strings.HasSuffix(m.Option("line"), last_text) { - // 补全记录 - index := last_index + 1 - text := last_list[index%len(last_list)] - kit.Value(value, "last.index", index) - kit.Value(value, "last.text", text) - m.Echo(strings.TrimSuffix(m.Option("line"), last_text) + text) - m.Info("%d %v", index, last_list) - return - } - - line := []rune(m.Option("line")) - for i := len(line); i >= 0; i-- { - if i > 0 && len(line)-i < 4 && unicode.IsLower(line[i-1]) { - continue - } - - // 编码转换 - code := string(line[i:]) - list := append(m.Cmd("web.code.input.find", code).Appendv("text"), code) - value["last"] = kit.Dict("code", code, "text", list[0], "list", list, "index", 0) - - // 输出编码 - m.Echo(string(line[:i])) - m.Echo(kit.Select(code, list[0])) - m.Info("input %s->%s", code, list[0]) - break - } - }) - } - m.Info("trans: %v", m.Result()) - }}, - "/favor": {Name: "/favor", Help: "收藏", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) > 0 && arg[0] != "sh" { - // 添加收藏 - m.Cmdy(web.FAVOR, kit.Select(m.Conf("zsh", "meta.history"), m.Option("tab")), - kit.Select(web.TYPE_SHELL, m.Option("type")), m.Option("note"), arg[0]) - return - } - - if m.Option("tab") == "" { - // 收藏列表 - m.Cmdy(web.FAVOR).Table() - return - } - - m.Echo("#/bin/sh\n\n") - m.Cmd(web.PROXY, m.Option("you"), web.FAVOR, m.Option("tab")).Table(func(index int, value map[string]string, head []string) { - switch value["type"] { - case web.TYPE_SHELL: - // 查看收藏 - if m.Option("note") == "" || m.Option("note") == value["name"] { - m.Echo("# %v\n%v\n\n", value["name"], value["text"]) - } - } - }) - }}, "/ish": {Name: "/ish", Help: "命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if sub, e := url.QueryUnescape(m.Option("sub")); m.Assert(e) { m.Cmdy(kit.Split(sub)) @@ -267,33 +85,6 @@ var Index = &ice.Context{Name: ZSH, Help: "命令行", } } }}, - - "/download": {Name: "/download", Help: "下载", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) == 0 || arg[0] == "" { - // 文件列表 - m.Cmdy(web.PROXY, m.Option("you"), web.STORY).Table() - return - } - - // 查找文件 - if m.Cmdy(web.STORY, "index", arg[0]).Append("text") == "" && m.Option("you") != "" { - // 上发文件 - m.Cmd(web.PROXY, m.Option("you"), web.STORY, "push", arg[0], "dev", arg[0]) - m.Cmdy(web.STORY, "index", arg[0]) - } - - // 下载文件 - m.Render(kit.Select(ice.RENDER_DOWNLOAD, ice.RENDER_RESULT, m.Append("file") == ""), m.Append("text")) - }}, - "/upload": {Name: "/upload", Help: "上传", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - // 缓存文件 - msg := m.Cmd(web.STORY, "upload") - m.Echo("data: %s\n", msg.Append("data")) - m.Echo("time: %s\n", msg.Append("time")) - m.Echo("type: %s\n", msg.Append("type")) - m.Echo("name: %s\n", msg.Append("name")) - m.Echo("size: %s\n", msg.Append("size")) - }}, }, } diff --git a/misc/zsh/zsh.shy b/misc/zsh/zsh.shy index 998e37ae..5c0c090a 100644 --- a/misc/zsh/zsh.shy +++ b/misc/zsh/zsh.shy @@ -1,28 +1,3 @@ -title "bash" -refer ` -官网 https://www.gnu.org/software/bash/ -源码 http://ftp.gnu.org/gnu/bash/ -文档 https://www.gnu.org/software/bash/manual/bash.html -` -field "安装" web.code.zsh.bash -field "源码" web.code.inner args `[ usr/install/bash-4.2.53/ input.c 625 ]` - -chapter "安装" -section "编译安装" -spark shell ` -wget http://mirrors.aliyun.com/gnu/bash/bash-4.2.53.tar.gz -tar xvf bash-4.2.53.tar.gz && cd bash-4.2.53 -./configure --prefix=$PWD/install -make -j4 && make install -` - -section "使用体验" -spark shell ` -cd ./install -./bin/bash -` - - title "zsh" refer ` 官网 https://www.zsh.org/