diff --git a/Makefile b/Makefile index 12972512..b1cc3cda 100644 --- a/Makefile +++ b/Makefile @@ -17,6 +17,16 @@ prepare: @go get github.com/skip2/go-qrcode @go get gopkg.in/gomail.v2 +gotags: + gotags -f golang.tags -R $(GOROOT)/src +tags: + gotags -f ctx.tags -R src +tool: + go get github.com/nsf/gocode + go get github.com/jstemmer/gotags + go get github.com/bradfitz/goimports + go get github.com/Go-zh/tools/cmd/gopls + linux: GOPATH=$(PWD):$(GOPATH) GOOS=linux $(BUILD)$(TARGET).linux.$(shell go env GOARCH) $(BENCH) linux_arm: diff --git a/etc/conf/auto.vim b/etc/conf/auto.vim index 0f8f58c7..2bfa29bc 100644 --- a/etc/conf/auto.vim +++ b/etc/conf/auto.vim @@ -4,21 +4,33 @@ let ctx_head = "Content-Type: application/json" let ctx_sid = "" fun! ShyPost(arg) + let a:arg["buf"] = bufname("%") let a:arg["pwd"] = getcwd() let a:arg["sid"] = g:ctx_sid - return system("curl -s '" . g:ctx_url . "' -H '" . g:ctx_head . "' -d '" . json_encode(a:arg) . "' 2>/dev/null") + for k in keys(a:arg) + let a:arg[k] = substitute(a:arg[k], "'", "XXXXXsingleXXXXX", "g") + endfor + + let data = json_encode(a:arg) + return system("curl -s '" . g:ctx_url . "' -H '" . g:ctx_head . "' -d '" . data . "' 2>/dev/null") +endfun + +fun! ShySync(target) + if bufname("%") == "ControlP" + return + end + if a:target == "exec" + call ShyPost({"cmd": "exec", "arg": getcmdline()}) + elseif a:target == "insert" + call ShyPost({"cmd": "insert", "arg": getreg("."), "row": line("."), "col": col(".")}) + else + let cmd = {"marks": "marks", "tags": "tags", "fixs": "clist", "bufs": "buffers", "regs": "registers"} + call ShyPost({"cmd": "sync", "arg": a:target, "sub": execute(cmd[a:target])}) + endif endfun fun! Shy(action, target) - if g:ctx_sid == "" - call ShyLogin() - endif let arg = {"arg": a:target, "cmd": a:action} - if a:action == "sync" - let cmd = {"tags": "tags", "fixs": "clist", "bufs": "buffers", "regs": "registers", "marks": "marks"} - let arg[a:target] = execute(cmd[a:target]) - endif - let cmd = ShyPost(arg) if cmd != "" let arg["res"] = execute(cmd) @@ -26,6 +38,26 @@ fun! Shy(action, target) endif endfun +fun! ShyCheck(target) + if a:target == "exec" + let cmd = getcmdline() + if cmd != "" + call ShySync("exec") + if getcmdline() == "w" + call ShySync("tags") + call ShySync("regs") + call ShySync("marks") + endif + endif + elseif a:target == "fixs" + if len(getqflist()) > 1 + copen + call ShySync("fixs") + else + cclose + end + end +endfun fun! ShyLogout() call Shy("logout", "") endfun @@ -33,23 +65,41 @@ fun! ShyLogin() let arg = {"cmd": "login", "pid": getpid(), "pane": $TMUX_PANE, "hostname": hostname(), "username": $USER} let g:ctx_sid = ShyPost(arg) endfun -autocmd VimEnter * call ShyLogin() + +call ShyLogin() autocmd VimLeave * call ShyLogout() +autocmd InsertLeave * call ShySync("insert") +autocmd CmdlineLeave * call ShyCheck("exec") +autocmd QuickFixCmdPost * call ShyCheck("fixs") -autocmd BufReadPost * call Shy("read", expand("")) +autocmd BufReadPost * call Shy("read", expand("")) | call ShySync("bufs") autocmd BufWritePre * call Shy("write", expand("")) -autocmd BufUnload * call Shy("close", expand("")) +" autocmd BufUnload * call Shy("close", expand("")) | call ShySync("bufs") +" autocmd CmdlineLeave * +call ShySync("tags") -autocmd BufWritePost * call Shy("sync", "tags") -autocmd BufWritePost * call Shy("sync", "fixs") -autocmd BufWritePost * call Shy("sync", "bufs") -autocmd BufWritePost * call Shy("sync", "regs") +" autocmd CompleteDone * call Shy("sync", "regs") +" autocmd InsertEnter * call Shy("sync", "regs") +" autocmd CmdlineEnter * call Shy("sync", "regs") " autocmd BufWinEnter * call Shy("enter", expand("")) " autocmd WinEnter * call Shy("enter", expand("")) " autocmd WinLeave * call Shy("leave", expand("")) -" -" autocmd InsertEnter * call Shy("line", getcurpos()[1]) " autocmd CursorMoved * call Shy("line", getcurpos()[1]) - " autocmd InsertCharPre * call Shy("char", v:char) +" +" let g:colorscheme=1 +" let g:colorlist = [ "ron", "torte", "darkblue", "peachpuff" ] +" function! ColorNext() +" if g:colorscheme >= len(g:colorlist) +" let g:colorscheme = 0 +" endif +" let g:scheme = g:colorlist[g:colorscheme] +" exec "colorscheme " . g:scheme +" let g:colorscheme = g:colorscheme+1 +" endfunction +" call ColorNext() +" command! NN call ColorNext() +" command! RR wa | source ~/.vimrc |e +" command! SS mksession! etc/session.vim + diff --git a/etc/conf/vimrc b/etc/conf/vimrc index 663fc319..23075304 100644 --- a/etc/conf/vimrc +++ b/etc/conf/vimrc @@ -7,143 +7,103 @@ "}}} "加载插件"{{{ call plug#begin() -Plug 'vim-scripts/tComment' -Plug 'tpope/vim-fugitive' -Plug 'airblade/vim-gitgutter' +" Plug 'vim-scripts/matrix.vim--Yang' Plug 'vim-airline/vim-airline' -Plug 'vim-airline/vim-airline-themes' -Plug 'ntpeters/vim-better-whitespace' -Plug 'easymotion/vim-easymotion' - -Plug 'gcmt/taboo.vim' -set sessionoptions+=tabpages,globals - -" Plug 'vim-scripts/taglist.vim' -let g:Tlist_WinWidth=45 -let g:Tlist_Exit_OnlyWindow=1 -let g:Tlist_Enable_Fold_Column=0 -nnoremap :TlistToggle - +Plug 'airblade/vim-gitgutter' Plug 'scrooloose/nerdtree' let g:NERDTreeWinPos="right" -nnoremap :NERDTreeToggle - +Plug 'mbbill/echofunc' Plug 'kien/ctrlp.vim' let g:ctrlp_cmd='CtrlPBuffer' - -Plug 'rking/ag.vim' -nnoremap :Ag =expand("") - -Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } -nnoremap :FZF -q =expand("") - -Plug 'benmills/vimux' -let mapleader=";" -nnoremap ; :VimuxPromptCommand -" nnoremap j :VimuxZoomRunner -" nnoremap l :VimuxRunLastCommand -" nnoremap vx :VimuxInterruptRunner +Plug 'vim-scripts/tComment' +Plug 'tpope/vim-fugitive' +Plug 'gcmt/taboo.vim' Plug 'fatih/vim-go' +Plug 'fatih/vim-go' +let g:go_version_warning=0 Plug 'chr4/nginx.vim' Plug 'othree/html5.vim' -Plug 'godlygeek/tabular' Plug 'plasticboy/vim-markdown' -Plug 'vim-scripts/python.vim' -Plug 'mbbill/echofunc' -Plug 'vim-syntastic/syntastic' -let g:syntastic_quiet_messages = { "regex": [ - \ "Missing module docstring", - \ "Missing class docstring", - \ "Missing method docstring", - \ "Missing function docstring", - \ "Invalid class name", - \ "Invalid method name", - \ "Invalid function name", - \ "Invalid constant name", - \ "Invalid variable name", - \ "Method could be a function", - \ "Too many instance attributes", - \ "Wrong continued indentation", - \ "Too many lines in module", - \ "Too many arguments", - \ "Too many local variables", - \ "Too many branches", - \ "Too many statements", - \ "Too many return statements", - \ "Line Too Long", - \ "defined outside __init__", - \ "Catching too general exception Exception", - \ ] } - -Plug 'Valloric/YouCompleteMe' -let g:ycm_confirm_extra_conf=1 -let g:syntastic_enable_signs=1 -let g:ycm_python_binary_path='/usr/bin/python' -nnoremap gd :YcmCompleter GoToDeclaration -nnoremap gD :YcmCompleter GoToReferences - -Plug 'vim-scripts/matrix.vim--Yang' +" Plug 'vim-airline/vim-airline-themes' +" Plug 'ntpeters/vim-better-whitespace' +" Plug 'easymotion/vim-easymotion' +" +" set sessionoptions+=tabpages,globals +" +" let g:Tlist_WinWidth=45 +" let g:Tlist_Exit_OnlyWindow=1 +" let g:Tlist_Enable_Fold_Column=0 +" nnoremap :TlistToggle +" +" Plug 'rking/ag.vim' +" nnoremap :Ag =expand("") +" +" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } +" nnoremap :FZF -q =expand("") +" +" Plug 'godlygeek/tabular' +" Plug 'vim-scripts/python.vim' +" +" Plug 'vim-syntastic/syntastic' +" Plug 'Valloric/YouCompleteMe' +" let g:ycm_confirm_extra_conf=1 +" let g:syntastic_enable_signs=1 +" let g:ycm_python_binary_path='/usr/bin/python' +" nnoremap gd :YcmCompleter GoToDeclaration +" nnoremap gD :YcmCompleter GoToReferences +" call plug#end() "}}} " 基本配置"{{{ +set cc=80 +set nowrap set number set relativenumber set cursorline set cursorcolumn -set ruler -set showcmd -set showmode -set cc=80 -set nowrap set scrolloff=3 -set tabstop=4 -set shiftwidth=4 -set cindent -set expandtab -set backspace=indent,eol,start +set t_Co=256 +set mouse=a -set showmatch -set matchtime=2 -set foldenable -set foldmethod=marker +" 缓存 +set hidden +set autowrite +set encoding=utf-8 +" 搜索 set hlsearch set incsearch set nowrapscan set smartcase set ignorecase -set hidden -set autowrite -set encoding=utf-8 -set mouse=a +set showmatch +set matchtime=2 -" colorscheme darkblue -" colorscheme default -set t_Co=256 +" 缩进 +set cindent +set expandtab +set tabstop=4 +set shiftwidth=4 +set backspace=indent,eol,start + +" 折叠 +set foldenable +set foldmethod=marker "}}} "快捷键映射"{{{ nnoremap h nnoremap j nnoremap k nnoremap l -" nnoremap :make nnoremap : -nnoremap j gj -nnoremap k gk - -" nnoremap :make -" inoremap :makei - -nnoremap df :FZF -inoremap df _ -inoremap jk cnoremap jk cnoremap wa wa +inoremap jk "}}} " 编程配置{{{ set keywordprg=man\ -a @@ -155,6 +115,8 @@ function! Config(type) if a:type == "go" set foldmethod=syntax set foldnestmax=3 + set tags+=ctx.tags,golang.tags + " autocmd BufWritePost *.go !goimports -w elseif a:type == "shy" set filetype=shy set commentstring=#%s @@ -178,8 +140,6 @@ function! Config(type) endif endfunction -autocmd BufReadPost * normal `" - autocmd BufNewFile,BufReadPost *.go call Config("go") autocmd BufNewFile,BufReadPost *.shy call Config("shy") autocmd BufNewFile,BufReadPost *.tmpl call Config("tmpl") @@ -191,36 +151,17 @@ autocmd BufNewFile,BufReadPost *.wxss call Config("css") autocmd BufNewFile,BufReadPost *.txt call Config("txt") autocmd BufNewFile,BufReadPost *.js call Config("js") -command! RR wa | source ~/.vimrc |e -command! SS mksession! etc/session.vim +autocmd BufReadPost * normal `" + +source ~/context/etc/conf/auto.vim if filereadable("~/.vim_local") source ~/.vim_local endif -let g:colorscheme=1 -let g:colorlist = [ "ron", "torte", "darkblue", "peachpuff" ] -function! ColorNext() - if g:colorscheme >= len(g:colorlist) - let g:colorscheme = 0 - endif - let g:scheme = g:colorlist[g:colorscheme] - exec "colorscheme " . g:scheme - let g:colorscheme = g:colorscheme+1 -endfunction -call ColorNext() -command! NN call ColorNext() +cnoremap RR :source ~/.vimrc +nnoremap :copen :grep -rn -function! BenchCode(cmd, arg) - let l:line = "web.code." . a:cmd . " " . join(a:arg, " ") - exe "silent !bench " l:line -endfunction - -highlight Comment cterm=reverse ctermfg=yellow - -source ~/context/etc/conf/auto.vim - - -" autocmd BufReadPost * call BenchCode("counter", ["nopen", 1]) -" autocmd BufWritePost * call BenchCode("counter", ["nsave", 1]) +colorscheme torte +highlight Comment cterm=reverse ctermfg=yellow "}}} diff --git a/src/contexts/ctx/misc.go b/src/contexts/ctx/misc.go index 9c8fc244..29591126 100644 --- a/src/contexts/ctx/misc.go +++ b/src/contexts/ctx/misc.go @@ -1,14 +1,14 @@ package ctx import ( + "encoding/csv" "fmt" "os" "regexp" "runtime" + "sort" "strings" "time" - - "sort" "toolkit" ) @@ -503,3 +503,78 @@ func (m *Message) ToHTML(style string) string { } return strings.Join(result, "") } + +func (m *Message) Grow(key string, args interface{}, data interface{}) interface{} { + cache := m.Confm(key, args) + if cache == nil { + cache = map[string]interface{}{} + } + meta, ok := cache["meta"].(map[string]interface{}) + if !ok { + meta = map[string]interface{}{} + } + list, _ := cache["list"].([]interface{}) + + list = append(list, data) + if len(list) > kit.Int(kit.Select(m.Conf("cache", "limit"), meta["limit"])) { + offset := kit.Int(meta["offset"]) + least := kit.Int(kit.Select(m.Conf("cache", "least"), meta["least"])) + + name := kit.Select(m.Option("cache.store"), meta["store"]) + f, e := os.OpenFile(name, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666) + m.Assert(e) + defer f.Close() + s, e := f.Stat() + m.Assert(e) + + keys := []string{} + w := csv.NewWriter(f) + if s.Size() == 0 { + for k := range list[0].(map[string]interface{}) { + keys = append(keys, k) + } + sort.Strings(keys) + w.Write(keys) + w.Flush() + s, e = f.Stat() + } else { + r := csv.NewReader(f) + keys, e = r.Read() + } + + record, _ := meta["record"].([]interface{}) + meta["record"] = append(record, map[string]interface{}{ + "time": m.Time(), + "offset": offset, + "position": s.Size(), + }) + + end := len(list) - least + for i, v := range list { + if i >= end { + break + } + + val := v.(map[string]interface{}) + + values := []string{} + for _, k := range keys { + values = append(values, kit.Format(val[k])) + } + w.Write(values) + + if i < least { + list[i] = list[end+i] + } + } + + m.Log("info", "save %s offset %v+%v", name, offset, end) + meta["offset"] = offset + end + list = list[:least] + w.Flush() + } + cache["meta"] = meta + cache["list"] = list + m.Conf(key, args, cache) + return list +} diff --git a/src/contexts/ctx/type.go b/src/contexts/ctx/type.go index 4f33889c..8d65b737 100644 --- a/src/contexts/ctx/type.go +++ b/src/contexts/ctx/type.go @@ -329,7 +329,6 @@ func (m *Message) Sort(key string, arg ...string) *Message { } func (m *Message) Split(str string, arg ...string) *Message { c := byte(kit.Select(" ", arg, 0)[0]) - lines := strings.Split(str, "\n") pos := []int{} diff --git a/src/contexts/nfs/nfs.go b/src/contexts/nfs/nfs.go index e3119a23..3fd7768b 100644 --- a/src/contexts/nfs/nfs.go +++ b/src/contexts/nfs/nfs.go @@ -1,10 +1,8 @@ package nfs import ( - "contexts/ctx" - "toolkit" - "bufio" + "contexts/ctx" "crypto/md5" "crypto/sha1" "encoding/csv" @@ -21,6 +19,7 @@ import ( "sort" "strings" "time" + "toolkit" ) type NFS struct { diff --git a/src/examples/code/code.go b/src/examples/code/code.go index 6a44c7b1..71a3fc5e 100644 --- a/src/examples/code/code.go +++ b/src/examples/code/code.go @@ -3,6 +3,7 @@ package code import ( "contexts/ctx" "contexts/web" + "fmt" "os" "os/exec" "path" @@ -27,7 +28,7 @@ CMD sh bin/boot.sh var Index = &ctx.Context{Name: "code", Help: "代码中心", Caches: map[string]*ctx.Cache{}, Configs: map[string]*ctx.Config{ - "login": &ctx.Config{Name: "login", Value: map[string]interface{}{"check": false, "local": true, "expire": "720h"}, Help: "用户登录"}, + "login": {Name: "login", Value: map[string]interface{}{"check": false, "local": true, "expire": "720h"}, Help: "用户登录"}, "prefix": {Name: "prefix", Help: "外部命令", Value: map[string]interface{}{ "zsh": []interface{}{"cli.system", "zsh"}, "tmux": []interface{}{"cli.system", "tmux"}, @@ -56,6 +57,11 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", "terminal": map[string]interface{}{}, "history": map[string]interface{}{}, }}, + "cache": {Name: "flow", Help: "记录", Value: map[string]interface{}{ + "store": "hi.csv", + "limit": 6, + "least": 3, + }}, }, Commands: map[string]*ctx.Command{ "/zsh": {Name: "/zsh", Help: "终端", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { @@ -82,9 +88,10 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", return case "historys": + m.Option("cache.store", "hi.csv") name := m.Option("sid") vs := strings.SplitN(strings.TrimSpace(m.Option("arg")), " ", 2) - m.Conf("zsh", []string{"history", name, "-2"}, map[string]interface{}{ + m.Grow("zsh", []string{"history", name}, map[string]interface{}{ "sid": name, "time": m.Time(), "index": vs[0], @@ -93,13 +100,14 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", }) case "history": + m.Option("cache.store", "hi.csv") switch path.Base(m.Option("SHELL")) { case "zsh": m.Option("arg", strings.SplitN(m.Option("arg"), ";", 2)[1]) } name := m.Option("sid") - m.Conf("zsh", []string{"history", name, "-2"}, map[string]interface{}{ + m.Grow("zsh", []string{"history", name}, map[string]interface{}{ "sid": name, "time": m.Time(), "cmd": m.Option("arg"), @@ -115,13 +123,25 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", Help: "终端", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { p, arg := kit.Select(".", arg[0]), arg[1:] switch arg[0] { + case "prune": + ps := []string{} + m.Confm("zsh", []string{"terminal"}, func(key string, value map[string]interface{}) { + if kit.Format(value["status"]) == "logout" { + ps = append(ps, key) + } + }) + for _, v := range ps { + m.Log("info", "prune zsh %v %v", v, kit.Formats(m.Conf("zsh", []string{"terminal", v}))) + m.Confv("zsh", []string{"terminal", v}, "") + } + fallthrough case "terminal": m.Confm("zsh", "terminal", func(key string, value map[string]interface{}) { m.Push([]string{"time", "sid", "status", "pwd", "pid", "pane", "hostname", "username"}, value) }) m.Sort("time", "time_r").Table() case "history": - m.Confm("zsh", "history", func(key string, index int, value map[string]interface{}) { + m.Confm("zsh", "history", func(key string, meta map[string]interface{}, index int, value map[string]interface{}) { if len(arg) > 1 && !strings.HasPrefix(key, arg[1]) { return } @@ -135,17 +155,6 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", } else { m.Sort("time", "time_r").Table() } - case "prune": - ps := []string{} - m.Confm("zsh", []string{"terminal"}, func(key string, value map[string]interface{}) { - if kit.Format(value["status"]) == "logout" { - ps = append(ps, key) - } - }) - for _, v := range ps { - m.Log("info", "prune zsh %v %v", v, kit.Formats(m.Conf("zsh", []string{"terminal", v}))) - m.Confv("zsh", []string{"terminal", v}, "") - } case "init": m.Cmd("cli.system", m.Confv("package", "upadte")) @@ -439,7 +448,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", } return }}, - "git": {Name: "git init|diff|status|commit|branch|pull|push|sum", Help: "版本", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { + "git": {Name: "git init|diff|status|commit|branch|remote|pull|push|sum", Help: "版本", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { prefix, arg := append(kit.Trans(m.Confv("prefix", "git")), "cmd_dir", kit.Select(".", arg[0])), arg[1:] switch arg[0] { @@ -474,7 +483,6 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", } for _, v := range strings.Split(m.Cmdx(prefix, "branch", "-v"), "\n") { if len(v) > 0 { - m.Log("fuck", "waht %v --", v) m.Push("tags", v[:2]) vs := strings.SplitN(strings.TrimSpace(v[2:]), " ", 2) m.Push("branch", vs[0]) @@ -484,6 +492,9 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", } } m.Table() + case "remote": + m.Cmdy(prefix, "remote", "-v", "cmd_parse", "cut", " ", "3", "remote url tag") + case "push": m.Cmdy(prefix, "push") case "sum": @@ -563,8 +574,21 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", } return }}, + "tags": {Name: "tags", Help: "代码索引", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { + m.Cmdy("cli.system", "gotags", "-f", kit.Select("tags", arg, 1), "-R", kit.Select("src", arg, 0)) + return + }}, "vim": {Name: "vim", Help: "编辑器", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { switch arg[0] { + case "ctag": + if f, p, e := kit.Create("etc/conf/tags"); m.Assert(e) { + defer f.Close() + for k, _ := range c.Commands { + fmt.Fprintf(f, "%s\t%s\t/\"%s\": {Name/\n", k, "../../src/examples/code/code.go", k) + } + m.Echo(p) + } + case "editor": m.Confm("vim", "editor", func(key string, value map[string]interface{}) { m.Push([]string{"time", "sid", "status", "pwd", "pid", "pane", "hostname", "username"}, value) @@ -584,12 +608,24 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", } }) for _, v := range ps { - for _, k := range []string{"editor", "tag", "fix", "buffer", "register"} { + for _, k := range []string{"editor", "exec", "tag", "fix", "buffer", "register"} { m.Log("info", "prune vim %v %v %v", k, v, kit.Formats(m.Conf("vim", []string{k, v}))) m.Confv("vim", []string{k, v}, "") } } + case "cmds": + m.Confm("vim", "exec", func(meta map[string]interface{}, index int, value map[string]interface{}) { + value["sid"] = kit.Format(value["sid"])[:6] + m.Push([]string{"time", "sid", "cmd", "file", "pwd"}, value) + }) + m.Sort("time", "time_r").Table() + case "txts": + m.Confm("vim", "insert", func(meta map[string]interface{}, index int, value map[string]interface{}) { + value["sid"] = kit.Format(value["sid"])[:6] + m.Push([]string{"time", "sid", "text", "line", "col", "file", "pwd"}, value) + }) + m.Sort("time", "time_r").Table() case "tags": m.Confm("vim", "tag", func(key string, index int, value map[string]interface{}) { m.Push("sid", key[:6]).Push([]string{"tag", "line", "file"}, value) @@ -597,23 +633,30 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", m.Table() case "fixs": m.Confm("vim", "fix", func(key string, index int, value map[string]interface{}) { - m.Push("sid", key[:6]).Push([]string{"id", "file", "line", "text"}, value) + m.Push("sid", key[:6]).Push([]string{"fix", "file", "line", "text"}, value) }) m.Table() case "bufs": m.Confm("vim", "buffer", func(key string, index int, value map[string]interface{}) { - m.Push("sid", key[:6]).Push([]string{"id", "tag", "name", "line"}, value) + m.Push("sid", key[:6]).Push([]string{"buf", "tag", "file", "line"}, value) }) m.Table() case "regs": m.Confm("vim", "register", func(key string, index int, value map[string]interface{}) { - m.Push("sid", key[:6]).Push([]string{"name", "text"}, value) + m.Push("sid", key[:6]).Push([]string{"reg", "text"}, value) + }) + m.Table() + case "marks": + m.Confm("vim", "mark", func(key string, index int, value map[string]interface{}) { + m.Push("sid", key[:6]).Push([]string{"mark", "line", "col", "file"}, value) }) m.Table() } return }}, "/vim": {Name: "/vim", Help: "编辑器", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { + m.Option("arg", strings.Replace(m.Option("arg"), "XXXXXsingleXXXXX", "'", -1)) + m.Option("sub", strings.Replace(m.Option("sub"), "XXXXXsingleXXXXX", "'", -1)) if !m.Has("res") { switch m.Option("cmd") { case "login": @@ -650,16 +693,36 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", m.Conf("vim", []string{"opens", name, "pwd"}, m.Option("pwd")) m.Conf("vim", []string{"opens", name, "sid"}, m.Option("sid")) return + case "insert": + m.Option("cache.store", "he.csv") + m.Grow("vim", "insert", map[string]interface{}{ + "time": m.Time(), + "sid": m.Option("sid"), + "text": m.Option("arg"), + "line": m.Option("row"), + "col": m.Option("col"), + "file": m.Option("buf"), + "pwd": m.Option("pwd"), + }) + case "exec": + m.Option("cache.store", "he.csv") + m.Grow("vim", "exec", map[string]interface{}{ + "time": m.Time(), + "sid": m.Option("sid"), + "cmd": m.Option("arg"), + "file": m.Option("buf"), + "pwd": m.Option("pwd"), + }) case "sync": switch m.Option("arg") { case "fixs": - if m.Conf("vim", []string{"fix", m.Option("sid")}, ""); strings.HasPrefix(m.Option("fixs"), "\nError") { + if m.Conf("vim", []string{"fix", m.Option("sid")}, ""); strings.HasPrefix(m.Option("sub"), "\nError") { break } - m.Split(strings.TrimPrefix(m.Option("fixs"), "\n"), " ", "3", "id file text").Table(func(index int, value map[string]string) { + m.Split(strings.TrimPrefix(m.Option("sub"), "\n"), " ", "3", "id file text").Table(func(index int, value map[string]string) { vs := strings.Split(kit.Format(value["file"]), ":") m.Conf("vim", []string{"fix", m.Option("sid"), "-2"}, map[string]interface{}{ - "id": value["id"], + "fix": value["id"], "file": vs[0], "line": vs[1], "text": value["text"], @@ -668,7 +731,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", m.Set("append").Set("result") case "tags": m.Conf("vim", []string{"tag", m.Option("sid")}, "") - m.Split(strings.TrimPrefix(m.Option("tags"), "\n"), " ", "6").Table(func(index int, value map[string]string) { + m.Split(strings.TrimPrefix(m.Option("sub"), "\n"), " ", "6").Table(func(index int, value map[string]string) { m.Conf("vim", []string{"tag", m.Option("sid"), "-2"}, map[string]interface{}{ "tag": value["tag"], "line": value["line"], @@ -678,24 +741,34 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", m.Set("append").Set("result") case "bufs": m.Conf("vim", []string{"buffer", m.Option("sid")}, "") - m.Split(strings.TrimSpace(m.Option("bufs")), " ", "5", "id tag name some line").Table(func(index int, value map[string]string) { + m.Split(strings.TrimSpace(m.Option("sub")), " ", "5", "id tag name some line").Table(func(index int, value map[string]string) { m.Conf("vim", []string{"buffer", m.Option("sid"), "-2"}, map[string]interface{}{ - "id": value["id"], + "buf": value["id"], "tag": value["tag"], - "name": value["name"], + "file": value["name"], "line": value["line"], }) }) m.Set("append").Set("result") case "regs": m.Conf("vim", []string{"register", m.Option("sid")}, "") - m.Split(strings.TrimPrefix(m.Option("regs"), "\n--- Registers ---\n"), " ", "2", "name text").Table(func(index int, value map[string]string) { + m.Split(strings.TrimPrefix(m.Option("sub"), "\n--- Registers ---\n"), " ", "2", "name text").Table(func(index int, value map[string]string) { m.Conf("vim", []string{"register", m.Option("sid"), "-2"}, map[string]interface{}{ "text": strings.Replace(strings.Replace(value["text"], "^I", "\t", -1), "^J", "\n", -1), - "name": strings.TrimPrefix(value["name"], "\""), + "reg": strings.TrimPrefix(value["name"], "\""), }) }) m.Set("append").Set("result") + case "marks": + m.Conf("vim", []string{"mark", m.Option("sid")}, "") + m.Split(strings.TrimPrefix(m.Option("sub"), "\n"), " ", "4").Table(func(index int, value map[string]string) { + m.Conf("vim", []string{"mark", m.Option("sid"), "-2"}, map[string]interface{}{ + "mark": value["mark"], + "line": value["line"], + "col": value["col"], + "file": value["file/text"], + }) + }) } return default: diff --git a/src/plugin/docker/index.shy b/src/plugin/docker/index.shy index d667d55a..7cc5de1b 100644 --- a/src/plugin/docker/index.shy +++ b/src/plugin/docker/index.shy @@ -1,13 +1,19 @@ -kit shell "命令行" private "ssh._route" _ "context" "find" "web.code" "zsh" \ +kit dir "目录" private "ssh._route" _ "context" "find" "web.code" "zsh" \ text "" name pod imports plugin_pod \ text "" name dir imports plugin_path action auto \ - select "terminal" name cmd values list values find values tail values grep values init values terminal values history \ + select "" name cmd values list values find values tail values grep values init action auto \ exports path path \ text "" name txt \ feature display editor \ button "搜索" action auto \ button "返回" cb Last +kit cli "命令行" private "web.code.zsh" \ + text "" name dir imports plugin_path action auto \ + select "terminal" values terminal values history action auto \ + feature detail "prune" "复制" "下载" \ + button "查看" action auto + kit clip "粘贴板" private "web.code.tmux" "" "" "" "buffer" \ text "" name tag imports plugin_buffer action auto \ text "" name txt \ @@ -57,12 +63,12 @@ kit container "容器" private "web.code.docker" "container" \ kit git "记录" private "ssh._route" _ "web.code.git" \ text "" name pod imports plugin_pod \ text "" name dir imports plugin_path action auto \ - select "status" name cmd values diff values status values commit values branch values pull values push values sum values init \ + select "status" name cmd values diff values status values commit values branch values remote values pull values push values sum values init \ exports branch branch \ button "查看" action auto kit vim "编辑器" private "ssh._route" _ "web.code.vim" \ text "" name pod imports plugin_pod \ - select "bufs" name cmd values editor values opens values tags values fixs values bufs values regs \ + select "bufs" name cmd values editor values opens values cmds values txts values tags values fixs values bufs values regs values marks \ button "查看" action auto diff --git a/src/toolkit/core.go b/src/toolkit/core.go index cf1360fd..46ce4abc 100644 --- a/src/toolkit/core.go +++ b/src/toolkit/core.go @@ -317,6 +317,15 @@ func Map(v interface{}, random string, args ...interface{}) map[string]interface fun(i, val) } } + case func(map[string]interface{}, int, map[string]interface{}): + meta := value["meta"].(map[string]interface{}) + list := value["list"].([]interface{}) + + for i := 0; i < len(list); i++ { + if val, ok := list[i].(map[string]interface{}); ok { + fun(meta, i, val) + } + } case func(string, []interface{}): for k, v := range value { if val, ok := v.([]interface{}); ok { @@ -368,6 +377,23 @@ func Map(v interface{}, random string, args ...interface{}) map[string]interface } } } + case func(string, map[string]interface{}, int, map[string]interface{}): + keys := make([]string, 0, len(value)) + for k, _ := range value { + keys = append(keys, k) + } + sort.Strings(keys) + + for _, k := range keys { + v := value[k].(map[string]interface{}) + meta := v["meta"].(map[string]interface{}) + list := v["list"].([]interface{}) + for i, v := range list { + if val, ok := v.(map[string]interface{}); ok { + fun(k, meta, i, val) + } + } + } } return value } diff --git a/src/toolkit/misc.go b/src/toolkit/misc.go index bb3358ec..f36ba1b5 100644 --- a/src/toolkit/misc.go +++ b/src/toolkit/misc.go @@ -12,6 +12,7 @@ import ( "os" "path" "strings" + "unicode" ) type TERM interface { @@ -51,11 +52,11 @@ func Create(p string) (*os.File, string, error) { func Split(str string, c byte, n int) []string { res := []string{} for i, j := 0, 0; i < len(str); i++ { - if str[i] == c { + if str[i] == c || c == ' ' && unicode.IsSpace(rune(str[i])) { continue } for j = i; j < len(str); j++ { - if str[j] == c { + if str[j] == c || c == ' ' && unicode.IsSpace(rune(str[j])) { break } } diff --git a/usr/librarys/example.js b/usr/librarys/example.js index a333b9ba..216a2c5d 100644 --- a/usr/librarys/example.js +++ b/usr/librarys/example.js @@ -1493,7 +1493,7 @@ function Output(plugin, type, msg, cb, target, option) { }, true) return } - }}}]).input, text.focus(), text.setSelectionRange(0, -1)): output[meta[item]]? output[meta[item]](event): plugin.Run(event, [line[exports[1]].trim(), meta[item]||item], function(msg) { + }}}]).input, text.focus(), text.setSelectionRange(0, -1)): output[meta[item]]? output[meta[item]](event): plugin.Run(event, [(line[exports[1]]||"").trim(), meta[item]||item], function(msg) { console.log(msg) })