forked from x/icebergs
opt vim
This commit is contained in:
parent
e377cc4521
commit
395b78ac26
@ -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 {
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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")
|
||||
|
@ -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
|
||||
|
||||
|
@ -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))
|
||||
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"))
|
||||
}},
|
||||
"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))
|
||||
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"))
|
||||
}},
|
||||
"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
|
||||
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))
|
||||
}},
|
||||
},
|
||||
}
|
||||
|
@ -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("<afile>")})
|
||||
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 <C-G><C-G> :call ShyGrep(expand("<cword>"))<CR>
|
||||
nnoremap <C-G><C-F> :call ShyFavor()<CR>
|
||||
nnoremap <C-G>f :call ShyFavors()<CR>
|
||||
" nnoremap <C-G><C-R> :call ShyCheck("cache")<CR>
|
||||
nnoremap <C-G><C-K> :call ShyComes("refresh")<CR>
|
||||
inoremap <C-K> <C-X><C-U>
|
||||
"}}}
|
||||
|
||||
|
86
misc/vim/favor.go
Normal file
86
misc/vim/favor.go
Normal file
@ -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)
|
||||
}
|
68
misc/vim/input.go
Normal file
68
misc/vim/input.go
Normal file
@ -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)
|
||||
}
|
49
misc/vim/sync.go
Normal file
49
misc/vim/sync.go
Normal file
@ -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)
|
||||
}
|
67
misc/vim/trash.vim
Normal file
67
misc/vim/trash.vim
Normal file
@ -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 <C-G><C-R> :call ShyCheck("cache")<CR>
|
||||
nnoremap <C-G><C-K> :call ShyComes("refresh")<CR>
|
@ -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{
|
||||
|
@ -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 "输入法"
|
||||
|
41
misc/zsh/bash.go
Normal file
41
misc/zsh/bash.go
Normal file
@ -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)
|
||||
}
|
28
misc/zsh/bash.shy
Normal file
28
misc/zsh/bash.shy
Normal file
@ -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
|
41
misc/zsh/download.go
Normal file
41
misc/zsh/download.go
Normal file
@ -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)
|
||||
}
|
40
misc/zsh/favor.go
Normal file
40
misc/zsh/favor.go
Normal file
@ -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)
|
||||
}
|
104
misc/zsh/input.go
Normal file
104
misc/zsh/input.go
Normal file
@ -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)
|
||||
}
|
76
misc/zsh/sync.go
Normal file
76
misc/zsh/sync.go
Normal file
@ -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)
|
||||
}
|
217
misc/zsh/zsh.go
217
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"
|
||||
)
|
||||
|
||||
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"))
|
||||
}},
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -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/
|
||||
|
Loading…
x
Reference in New Issue
Block a user