1
0
forked from x/icebergs

opt xterm

This commit is contained in:
shylinux@163.com 2022-09-17 22:42:24 +08:00
parent 276c97a050
commit 1b21938136
25 changed files with 594 additions and 165 deletions

View File

@ -250,16 +250,6 @@ func init() {
}
m.StatusTimeCount()
}},
"stats": {Name: "stats", Help: "环境变量", Hand: func(m *ice.Message, arg ...string) {
var ms runtime.MemStats
runtime.ReadMemStats(&ms)
m.Echo("what %#v", ms)
m.Echo("what %#v", kit.FmtSize(int64(ms.Alloc)))
m.Echo("what %#v", kit.FmtSize(int64(ms.TotalAlloc)))
m.Echo("what %#v", kit.FmtSize(int64(ms.Sys)))
m.Echo("what %#v", kit.FmtSize(int64(ms.HeapAlloc)))
m.Echo("what %#v", kit.FmtSize(int64(ms.HeapSys)))
}},
MAKE_DOMAIN: {Name: "make.domain", Help: "编译主机", Hand: func(m *ice.Message, arg ...string) {
if os.Getenv(CTX_DEV) == "" || os.Getenv(CTX_POD) == "" {
m.Echo(m.Conf(RUNTIME, MAKE_DOMAIN))

View File

@ -104,7 +104,7 @@ func _system_exec(m *ice.Message, cmd *exec.Cmd) {
defer func() {
m.Push(CMD_OUT, out.String())
m.Push(CMD_ERR, err.String())
if m.Echo(kit.Select(out.String(), err.String())); IsSuccess(m) && out.String() == "" {
if m.Echo(strings.TrimRight(kit.Select(out.String(), err.String()), ice.NL)); IsSuccess(m) && out.String() == "" {
m.SetAppend()
}
}()

View File

@ -155,20 +155,6 @@ func CmdAction(args ...ice.Any) ice.Actions {
}},
}
}
func ProcessFloat(m *ice.Message, arg ...string) {
m.Option(ice.MSG_PROCESS, "_float")
m.Option(ice.PROCESS_ARG, arg)
m.Cmdy(COMMAND, arg[0])
}
func ProcessField(m *ice.Message, cmd string, args []string, arg ...string) {
if len(arg) > 0 && arg[0] == ice.RUN {
m.Cmdy(cmd, arg[1:])
} else {
if m.Cmdy(COMMAND, cmd).ProcessField(m.ActionKey(), ice.RUN); len(args) > 0 {
m.Push(ARGS, kit.Format(args))
}
}
}
func PodCmd(m *ice.Message, arg ...ice.Any) bool {
if pod := m.Option(ice.POD); pod != "" {
if m.Option(ice.POD, ""); m.Option(ice.MSG_UPLOAD) != "" {

View File

@ -5,6 +5,7 @@ import (
"strings"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb"
kit "shylinux.com/x/toolkits"
)
@ -58,3 +59,6 @@ func DisplayBase(m *ice.Message, file string, arg ...ice.Any) *ice.Message {
m.Option(ice.MSG_DISPLAY, kit.MergeURL(ice.DisplayBase(file)[ice.DISPLAY], arg...))
return m
}
func Toolkit(m *ice.Message, arg ...string) {
m.Option(ice.MSG_TOOLKIT, kit.Select(m.Config(mdb.TOOLS), kit.Fields(arg)))
}

64
base/ctx/process.go Normal file
View File

@ -0,0 +1,64 @@
package ctx
import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
kit "shylinux.com/x/toolkits"
)
const PROCESS = "process"
var _process = map[string]ice.Any{}
func AddProcess(key string, val ice.Any) { _process[key] = val }
func Process(m *ice.Message, key string, args []string, arg ...string) {
switch cb := _process[key].(type) {
case func(*ice.Message, []string, ...string):
cb(m, args, arg...)
case string:
if len(arg) == 0 || arg[0] != PROCESS {
m.Cmdy(cb, PROCESS, args)
m.Optionv(ice.FIELD_PREFIX, kit.Simple(m.ActionKey(), m.Optionv(ice.FIELD_PREFIX)))
} else {
m.Cmdy(cb, arg)
}
default:
ProcessField(m, key, args, arg...)
}
}
func ProcessField(m *ice.Message, cmd string, args []string, arg ...string) {
cmd = kit.Select(m.PrefixKey(), cmd)
if len(arg) == 0 || arg[0] != ice.RUN {
if m.Cmdy(COMMAND, cmd).ProcessField(m.ActionKey(), ice.RUN); len(args) > 0 {
m.Push(ARGS, kit.Format(args))
}
return
}
if aaa.Right(m, cmd, arg[1:]) {
m.Cmdy(cmd, arg[1:])
}
}
func ProcessFloat(m *ice.Message, arg ...string) {
m.Option(ice.MSG_PROCESS, ice.PROCESS_FLOAT)
m.Option(ice.PROCESS_ARG, arg)
m.Cmdy(COMMAND, arg[0])
}
func ProcessHold(m *ice.Message, text ...ice.Any) {
m.Process(ice.PROCESS_HOLD, text...)
}
func ProcessRefresh(m *ice.Message) {
m.ProcessRefresh("300ms")
}
func ProcessAction() ice.Actions {
return ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
AddProcess(m.CommandKey(), m.PrefixKey())
}},
PROCESS: {Name: "process", Help: "响应", Hand: func(m *ice.Message, arg ...string) {
ProcessField(m, m.PrefixKey(), arg, arg...)
}},
}
}

View File

@ -256,7 +256,7 @@ func HashSelect(m *ice.Message, arg ...string) *ice.Message {
return m.StatusTime()
}
func HashPrunes(m *ice.Message, cb func(Maps) bool) *ice.Message {
expire := kit.Time(kit.Select(m.Time("-72h"), m.Option(EXPIRE)))
expire := kit.Time(kit.Select(m.Time("-72h"), m.Option("before")))
m.Cmd("", func(value Maps) {
if kit.Time(value[TIME]) > expire {
return

View File

@ -151,6 +151,8 @@ const (
PAGE = "page"
OFFEND = "offend"
TOOLS = "tools"
JSON = "json"
CSV = "csv"
)

View File

@ -119,6 +119,7 @@ func PushPodCmd(m *ice.Message, cmd string, arg ...string) {
type Message interface {
Option(key string, arg ...ice.Any) string
PrefixKey(arg ...ice.Any) string
}
func OptionAgentIs(m Message, arg ...string) bool {
@ -143,11 +144,11 @@ func MergePod(m Message, pod string, arg ...ice.Any) string {
}
func MergePodCmd(m Message, pod, cmd string, arg ...ice.Any) string {
p := "/chat"
if pod != "" {
p += "/pod/" + kit.Keys(m.Option(ice.MSG_USERPOD), pod)
}
if cmd != "" {
p += "/cmd/" + cmd
}
p += "/pod/" + kit.Keys(m.Option(ice.MSG_USERPOD), pod)
p = kit.Select(p, "/chat/", p == "/chat/pod/")
p += "/cmd/" + kit.Select(m.PrefixKey(), cmd)
return kit.MergeURL2(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), p, arg...)
}
func ProcessWebsite(m *ice.Message, pod, cmd string, arg ...ice.Any) {
m.ProcessOpen(MergePodCmd(m, pod, cmd, arg...))
}

View File

@ -190,6 +190,7 @@ const ( // MSG
MSG_PROCESS = "_process"
MSG_DISPLAY = "_display"
MSG_TOOLKIT = "_toolkit"
MSG_USERIP = "user.ip"
MSG_USERUA = "user.ua"

View File

@ -4,6 +4,7 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits"
)
@ -11,13 +12,20 @@ const FAVOR = "favor"
func init() {
Index.MergeCommands(ice.Commands{
FAVOR: {Name: "favor zone id auto insert test page", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{
FAVOR: {Name: "favor zone id auto insert page", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{
mdb.INSERT: {Name: "insert zone=数据结构 type=go name=hi text=hello path file line", Help: "添加"},
INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
ctx.ProcessCommand(m, INNER, m.OptionSplit("path,file,line"), arg...)
ctx.Process(m, m.ActionKey(), m.OptionSplit(nfs.PATH, nfs.FILE, nfs.LINE), arg...)
}},
}, mdb.ZoneAction(mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,id,type,name,text,path,file,line")), Hand: func(m *ice.Message, arg ...string) {
mdb.ZoneSelectPage(m, arg...).PushAction(kit.Select(mdb.REMOVE, INNER, len(arg) > 0))
XTERM: {Name: "xterm", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
ctx.Process(m, m.ActionKey(), append(m.OptionSimple(mdb.TYPE, mdb.NAME), ice.INIT, m.Option(mdb.TEXT)), arg...)
}},
}, mdb.ZoneAction(mdb.FIELD, "time,id,type,name,text,path,file,line")), Hand: func(m *ice.Message, arg ...string) {
if mdb.ZoneSelectPage(m, arg...); len(arg) > 0 && arg[0] != "" {
m.Tables(func(value ice.Maps) {
m.PushButton(kit.Select(INNER, XTERM, value[mdb.TEXT] == "" || value[nfs.FILE] == ""))
})
}
}},
})
}

View File

@ -237,6 +237,10 @@ func init() {
m.Cmd(mdb.SEARCH, mdb.CREATE, GODOC, m.Prefix(GO))
m.Cmd(mdb.ENGINE, mdb.CREATE, GO, m.Prefix(GO))
m.Cmd(TEMPLATE, mdb.CREATE, GO, m.Prefix(GO))
m.Cmd(COMPLETE, mdb.CREATE, GO, m.Prefix(GO))
m.Cmd(NAVIGATE, mdb.CREATE, GO, m.Prefix(GO))
LoadPlug(m, GO, MOD, SUM)
for _, k := range []string{GO, MOD, SUM, GODOC} {
m.Cmd(mdb.RENDER, mdb.CREATE, k, m.Prefix(k))
@ -273,6 +277,57 @@ func init() {
}},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _go_exec(m, arg...) }},
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { _go_show(m, arg...) }},
TEMPLATE: {Hand: func(m *ice.Message, arg ...string) {
if kit.Ext(m.Option(mdb.FILE)) != m.CommandKey() {
return
}
}},
COMPLETE: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[2] == nfs.SCRIPT {
return
}
if m.Option("text") == "" {
m.Push(mdb.TEXT, kit.List("package", "import", "const", "type", "func", "var"))
return
}
if strings.HasSuffix(m.Option("text"), ".") {
key := kit.Slice(kit.Split(m.Option("text"), "\t ."), -1)[0]
switch key {
case "m", "msg":
key = "icebergs.Message"
case "kit":
key = "toolkits"
case "ice":
key = "icebergs"
}
for _, l := range strings.Split(m.Cmdx("cli.system", "go", "doc", key), ice.NL) {
ls := kit.Split(l)
if len(ls) < 2 {
continue
}
switch ls[0] {
case "const", "var", "func":
m.Push(mdb.NAME, ls[1])
m.Push(mdb.TEXT, l)
}
}
return
}
m.Push(mdb.TEXT, "m")
m.Push(mdb.TEXT, "msg")
m.Push(mdb.TEXT, "ice")
m.Push(mdb.TEXT, "kit")
for _, l := range strings.Split(m.Cmdx("cli.system", "go", "list", "std"), ice.NL) {
m.Push(mdb.TEXT, kit.Slice(kit.Split(l, ice.PS), -1)[0])
}
}},
NAVIGATE: {Hand: func(m *ice.Message, arg ...string) {
m.Option("text", kit.Slice(kit.Split(m.Option("text"), "."), -1)[0])
_inner_tags(m, "", m.Option("text"))
}},
}, PlugAction())},
}, Configs: ice.Configs{
MOD: {Name: MOD, Help: "模块", Value: kit.Data(PLUG, kit.Dict(

View File

@ -81,7 +81,7 @@ func _inner_tags(m *ice.Message, dir string, value string) {
for i := 1; bio.Scan(); i++ {
if i == line || bio.Text() == text {
if dir == "" {
m.PushRecord(kit.Dict(nfs.PATH, path.Dir(file), nfs.FILE, path.Base(file), nfs.LINE, kit.Format(i), mdb.TEXT, bio.Text()))
m.PushRecord(kit.Dict(nfs.PATH, path.Dir(file)+ice.PS, nfs.FILE, path.Base(file), nfs.LINE, kit.Format(i), mdb.TEXT, bio.Text()))
} else {
m.PushRecord(kit.Dict(nfs.PATH, dir, nfs.FILE, strings.TrimPrefix(file, nfs.PWD), nfs.LINE, kit.Format(i), mdb.TEXT, bio.Text()))
}
@ -176,6 +176,9 @@ func init() {
_inner_make(m, m.Cmd(cli.SYSTEM, cli.MAKE, arg))
}},
FAVOR: {Name: "favor", Help: "收藏"},
NAVIGATE: {Name: "navigate", Help: "跳转", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(NAVIGATE, kit.Ext(m.Option(mdb.FILE)), m.Option(nfs.FILE), m.Option(nfs.PATH))
}},
}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
if arg[0] = strings.Split(arg[0], ice.FS)[0]; !strings.HasSuffix(arg[0], ice.PS) {
arg[1] = kit.Slice(strings.Split(arg[0], ice.PS), -1)[0]

View File

@ -8,6 +8,7 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
@ -202,7 +203,7 @@ func init() {
_install_stop(m, arg...)
}},
gdb.DEBUG: {Name: "debug", Help: "调试", Hand: func(m *ice.Message, arg ...string) {
ProcessXterm(m, []string{mdb.TYPE, "gdb"})
ctx.Process(m, XTERM, []string{mdb.TYPE, "gdb"}, arg...)
}},
nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
_install_trash(m, arg...)

View File

@ -69,12 +69,38 @@ func init() {
Index.Register(&ice.Context{Name: JS, Help: "前端", Commands: ice.Commands{
JS: {Name: "js", Help: "前端", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
for _, cmd := range []string{
TEMPLATE, COMPLETE, NAVIGATE,
mdb.PLUGIN, mdb.RENDER, mdb.ENGINE, mdb.SEARCH,
} {
m.Cmd(cmd, mdb.CREATE, JSON, m.PrefixKey())
m.Cmd(cmd, mdb.CREATE, JS, m.PrefixKey())
}
LoadPlug(m, JS)
}},
TEMPLATE: {Hand: func(m *ice.Message, arg ...string) {
if kit.Ext(m.Option(mdb.FILE)) != m.CommandKey() {
return
}
m.Echo(`
Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) {
msg.Echo("hello world")
msg.Dump(can)
}})
`)
}},
COMPLETE: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[2] == nfs.SCRIPT {
m.Push(nfs.FILE, strings.ReplaceAll(arg[1], ice.PT+kit.Ext(arg[1]), ice.PT+JS))
return
}
Complete(m, m.Option("text"), kit.Dict(
"", kit.List("function", "if"),
"msg", kit.List("Push", "Echo"),
))
}},
NAVIGATE: {Hand: func(m *ice.Message, arg ...string) {
}},
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
key := ctx.GetFileCmd(kit.Replace(path.Join(arg[2], arg[1]), ".js", ".go"))
if key == "" {

View File

@ -5,6 +5,7 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits"
@ -39,6 +40,15 @@ func init() {
})
m.Cmd(mdb.ENGINE, mdb.CREATE, PY, m.PrefixKey())
m.Cmd(mdb.RENDER, mdb.CREATE, PY, m.PrefixKey())
gdb.Watch(m, VIMER_TEMPLATE)
}},
VIMER_TEMPLATE: {Hand: func(m *ice.Message, arg ...string) {
if kit.Ext(m.Option(mdb.FILE)) != m.CommandKey() {
return
}
m.Echo(`
print "hello world"
`)
}},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) {
_py_main_script(m, arg...)

View File

@ -6,6 +6,7 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits"
@ -66,6 +67,15 @@ func init() {
m.Cmd(cmd, mdb.CREATE, m.CommandKey(), m.PrefixKey())
}
LoadPlug(m, m.CommandKey())
gdb.Watch(m, VIMER_TEMPLATE)
}},
VIMER_TEMPLATE: {Hand: func(m *ice.Message, arg ...string) {
if kit.Ext(m.Option(mdb.FILE)) != m.CommandKey() {
return
}
m.Echo(`
_list
`)
}},
mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH {

View File

@ -7,6 +7,7 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
kit "shylinux.com/x/toolkits"
)
@ -41,6 +42,15 @@ func init() {
m.Cmd(cmd, mdb.CREATE, SHY, m.PrefixKey())
}
LoadPlug(m, SHY)
gdb.Watch(m, VIMER_TEMPLATE)
}},
VIMER_TEMPLATE: {Hand: func(m *ice.Message, arg ...string) {
if kit.Ext(m.Option(mdb.FILE)) != m.CommandKey() {
return
}
m.Echo(`
chapter "hi"
`)
}},
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
ctx.ProcessCommand(m, "web.wiki.word", kit.Simple(path.Join(arg[2], arg[1])))

View File

@ -10,9 +10,10 @@ import (
kit "shylinux.com/x/toolkits"
)
const TEMPLATE = "template"
// const TEMPLATE = "template"
func init() {
return
Index.MergeCommands(ice.Commands{
TEMPLATE: {Name: "template name auto", Help: "模板", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {

View File

@ -7,6 +7,7 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
@ -14,59 +15,6 @@ import (
kit "shylinux.com/x/toolkits"
)
func _vimer_defs(m *ice.Message, ext string) string {
defs := kit.Dict(
nfs.SH, `
_list
`,
nfs.SHY, `
chapter "hi"
`,
nfs.PY, `
print "hello world"
`,
nfs.JS, `
Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) {
msg.Echo("hello world")
msg.Dump(can)
}})
`,
nfs.ZML, `
{
username
系统
命令 index cli.system
共享 index cli.qrcode
代码
趋势 index web.code.git.trend args icebergs action auto
状态 index web.code.git.status args icebergs
脚本
终端 index hi/hi.sh
文档 index hi/hi.shy
数据 index hi/hi.py
后端 index hi/hi.go
前端 index hi/hi.js
}
`,
nfs.IML, `
系统
命令
cli.system
环境
cli.runtime
开发
模块
hi/hi.go
脚本
hi/hi.sh
hi/hi.shy
hi/hi.py
hi/hi.go
hi/hi.js
`,
)
return kit.Format(defs[ext])
}
func _vimer_list(m *ice.Message, dir string, arg ...string) { // field
m.Copy(m.Cmd(nfs.DIR, nfs.PWD, kit.Dict(nfs.DIR_ROOT, dir, nfs.DIR_DEEP, ice.TRUE)).Cut(nfs.PATH).RenameAppend(nfs.PATH, kit.Select(mdb.NAME, arg, 0)))
}
@ -107,39 +55,6 @@ func _vimer_inputs(m *ice.Message, arg ...string) {
}
}
}
func _vimer_complete(m *ice.Message, arg ...string) {
switch left := kit.Select("", kit.Slice(kit.Split(m.Option(mdb.TEXT), "\t \n`"), -1), 0); kit.Ext(m.Option(nfs.FILE)) {
case nfs.ZML:
switch left {
case mdb.TYPE:
m.Push(mdb.NAME, "menu")
case ctx.INDEX:
m.Cmdy(ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, "", "", ice.OptionFields("index,name,text"))
_vimer_list(m, ice.SRC, ctx.INDEX)
case ctx.ACTION:
m.Push(mdb.NAME, "auto")
m.Push(mdb.NAME, "push")
m.Push(mdb.NAME, "open")
default:
if strings.HasSuffix(m.Option(mdb.TEXT), " ") {
m.Push(mdb.NAME, "index")
m.Push(mdb.NAME, "action")
m.Push(mdb.NAME, "args")
m.Push(mdb.NAME, "type")
} else if m.Option(mdb.TEXT) == "" {
m.Push(mdb.NAME, "head")
m.Push(mdb.NAME, "left")
m.Push(mdb.NAME, "main")
m.Push(mdb.NAME, "foot")
}
}
default:
m.Cmdy(mdb.ENGINE, kit.Ext(m.Option(nfs.FILE)), m.Option(nfs.FILE), m.Option(nfs.PATH))
}
}
func _vimer_go_complete(m *ice.Message, name string, arg ...string) *ice.Message {
kit.Fetch(kit.Split(m.Cmdx(cli.SYSTEM, GO, "doc", name), ice.NL, ice.NL, ice.NL), func(index int, value string) {
if ls := kit.Split(value); len(ls) > 1 {
@ -160,9 +75,6 @@ func _vimer_go_complete(m *ice.Message, name string, arg ...string) *ice.Message
const (
VIMER_TEMPLATE = "vimer.template"
VIMER_COMPLETE = "vimer.complete"
COMPLETE = "complete"
// TEMPLATE = "template"
)
const VIMER = "vimer"
@ -174,18 +86,15 @@ func init() {
m.PushSearch(mdb.TYPE, "go", mdb.NAME, "src/main.go", mdb.TEXT, chat.MergeCmd(m, ""))
}
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
_vimer_inputs(m, arg...)
}},
nfs.SAVE: {Name: "save type file path", Help: "保存", Hand: func(m *ice.Message, arg ...string) {
m.Option(nfs.CONTENT, kit.Select(_vimer_defs(m, kit.Ext(m.Option(nfs.FILE))), m.Option(nfs.CONTENT)))
if m.Option(nfs.CONTENT) == "" {
m.Option(nfs.CONTENT, gdb.Event(m.Spawn(), VIMER_TEMPLATE).Result())
}
m.Cmdy(nfs.SAVE, path.Join(m.Option(nfs.PATH), m.Option(nfs.FILE)))
}},
nfs.TRASH: {Name: "trash path", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.TRASH, arg[0])
}},
COMPILE: {Name: "compile", Help: "编译", Hand: func(m *ice.Message, arg ...string) {
if msg := m.Cmd(COMPILE, ice.SRC_MAIN_GO, ice.BIN_ICE_BIN); cli.IsSuccess(msg) {
m.Cmd(UPGRADE, cli.RESTART)
@ -197,11 +106,12 @@ func init() {
m.Cmdy(AUTOGEN, mdb.CREATE, arg)
}},
nfs.SCRIPT: {Name: "script file=hi/hi.js", Help: "脚本", Hand: func(m *ice.Message, arg ...string) {
m.Option(mdb.TEXT, strings.TrimSpace(kit.Select(_vimer_defs(m, kit.Ext(m.Option(nfs.FILE))), m.Option(mdb.TEXT))))
m.Cmdy(TEMPLATE, nfs.DEFS)
m.Cmdy(nfs.DEFS, path.Join(m.Option(nfs.PATH), m.Option(nfs.FILE)), m.Cmdx(TEMPLATE, kit.Ext(m.Option(nfs.FILE)), m.Option(nfs.FILE), m.Option(nfs.PATH)))
}},
web.WEBSITE: {Name: "website file=hi.zml", Help: "网页", Hand: func(m *ice.Message, arg ...string) {
m.Option(mdb.TEXT, strings.TrimSpace(kit.Select(_vimer_defs(m, kit.Ext(m.Option(nfs.FILE))), m.Option(mdb.TEXT))))
if m.Option(mdb.TEXT) == "" {
m.Option(mdb.TEXT, gdb.Event(m.Spawn(), VIMER_TEMPLATE).Result())
}
m.Option(nfs.FILE, path.Join(web.WEBSITE, m.Option(nfs.FILE)))
m.Cmdy(TEMPLATE, nfs.DEFS)
}},
@ -215,12 +125,20 @@ func init() {
m.Cmdy(PUBLISH, ice.CONTEXTS)
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {
case nfs.FILE:
m.Cmdy(COMPLETE, mdb.FOREACH, arg[1], m.Option(ctx.ACTION))
}
_vimer_inputs(m, arg...)
}},
TEMPLATE: {Name: "template", Help: "模板", Hand: func(m *ice.Message, arg ...string) {
// _vimer_template(m, arg...)
m.Cmdy(TEMPLATE, kit.Ext(m.Option(mdb.FILE)), m.Option(nfs.FILE), m.Option(nfs.PATH))
}},
COMPLETE: {Name: "complete", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
_vimer_complete(m, arg...)
m.Cmdy(COMPLETE, kit.Ext(m.Option(mdb.FILE)), m.Option(nfs.FILE), m.Option(nfs.PATH))
}},
"listTags": {Name: "listTags", Help: "索引", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("web.code.vim.tags", "listTags", arg)
}},
@ -255,3 +173,57 @@ func init() {
func ProcessVimer(m *ice.Message, path, file, line string, arg ...string) {
ctx.ProcessField(m, Prefix(VIMER), kit.Simple(path, file, line), arg...)
}
const TEMPLATE = "template"
const COMPLETE = "complete"
const NAVIGATE = "navigate"
func Complete(m *ice.Message, text string, data ice.Map) {
if strings.HasSuffix(text, ".") {
key := kit.Slice(kit.Split(text, " ."), -1)[0]
m.Push(mdb.TEXT, kit.Simple(data[key]))
} else {
m.Push(mdb.TEXT, data[""])
for k := range data {
m.Push(mdb.TEXT, k)
}
}
return
if strings.TrimSpace(text) == "" {
m.Push(mdb.TEXT, kit.Simple(data[""]))
return
}
name := kit.Slice(kit.Split(text), -1)[0]
if name == "" {
m.Push(mdb.TEXT, kit.Simple(data[""]))
return
}
key := kit.Slice(kit.Split(name, "."), -1)[0]
if strings.HasSuffix(name, ".") {
m.Push(mdb.TEXT, kit.Simple(data[key]))
} else {
for k := range data {
if strings.HasPrefix(k, key) {
m.Push(mdb.TEXT, key)
}
}
list := kit.Simple(data[key])
for i, v := range list {
list[i] = "." + v
}
m.Push(mdb.TEXT, list)
}
}
func init() {
Index.MergeCommands(ice.Commands{COMPLETE: {Name: "complete type name text auto", Help: "补全", Actions: mdb.RenderAction()}})
}
func init() {
Index.MergeCommands(ice.Commands{TEMPLATE: {Name: "template type name text auto", Help: "模板", Actions: mdb.RenderAction()}})
}
func init() {
Index.MergeCommands(ice.Commands{NAVIGATE: {Name: "navigate type name text auto", Help: "跳转", Actions: mdb.RenderAction()}})
}

View File

@ -22,9 +22,20 @@ type _xterm struct {
*os.File
}
func (s _xterm) Close() error { s.Cmd.Process.Kill(); return nil }
func (s _xterm) Setsize(rows, cols string) error {
return pty.Setsize(s.File, &pty.Winsize{Rows: uint16(kit.Int(rows)), Cols: uint16(kit.Int(cols))})
}
func (s _xterm) Write(data string) (int, error) {
return s.File.Write([]byte(data))
}
func (s _xterm) Close() error {
return s.Cmd.Process.Kill()
}
func _xterm_get(m *ice.Message, h string) _xterm {
h = kit.Select(m.Option(mdb.HASH), h)
m.Assert(h != "")
t := mdb.HashSelectField(m, m.Option(mdb.HASH, h), mdb.TYPE)
mdb.HashModify(m, mdb.TEXT, m.Option(ice.MSG_DAEMON))
return mdb.HashTarget(m, h, func() ice.Any {
@ -35,6 +46,9 @@ func _xterm_get(m *ice.Message, h string) _xterm {
m.Assert(err)
m.Go(func() {
defer mdb.HashSelectUpdate(m, h, func(value ice.Map) { delete(value, mdb.TARGET) })
defer tty.Close()
m.Option("log.disable", ice.TRUE)
buf := make([]byte, ice.MOD_BUFS)
for {
@ -55,7 +69,13 @@ const XTERM = "xterm"
func init() {
Index.MergeCommands(ice.Commands{
XTERM: {Name: "xterm hash auto", Help: "终端", Actions: ice.MergeActions(ice.Actions{
XTERM: {Name: "xterm hash auto", Help: "命令行", Actions: ice.MergeActions(ice.Actions{
ctx.PROCESS: {Name: "process", Help: "响应", Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 || arg[0] != ice.RUN {
arg = []string{m.Cmdx("", mdb.CREATE, arg)}
}
ctx.ProcessField(m, "", arg, arg...)
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch mdb.HashInputs(m, arg); arg[0] {
case mdb.TYPE:
@ -64,40 +84,34 @@ func init() {
m.Push(arg[0], ice.Info.HostName, path.Base(m.Option(mdb.TYPE)))
}
}},
mdb.CREATE: {Name: "create type=sh name", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
mdb.HashCreate(m, mdb.NAME, kit.Split(m.Option(mdb.TYPE))[0], m.OptionSimple(mdb.TYPE, mdb.NAME))
m.ProcessRefresh3ms()
mdb.CREATE: {Name: "create type=sh name init", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
mdb.HashCreate(m, mdb.NAME, kit.Split(m.Option(mdb.TYPE))[0], m.OptionSimple(mdb.TYPE, mdb.NAME, ice.INIT))
ctx.ProcessRefresh(m)
}},
"resize": {Name: "resize", Help: "大小", Hand: func(m *ice.Message, arg ...string) {
pty.Setsize(_xterm_get(m, m.Option(mdb.HASH)).File, &pty.Winsize{Rows: uint16(kit.Int(m.Option("rows"))), Cols: uint16(kit.Int(m.Option("cols")))})
_xterm_get(m, "").Setsize(m.Option("rows"), m.Option("cols"))
}},
"input": {Name: "input", Help: "输入", Hand: func(m *ice.Message, arg ...string) {
if b, e := base64.StdEncoding.DecodeString(strings.Join(arg, "")); !m.Warn(e) {
_xterm_get(m, m.Option(mdb.HASH)).Write(b)
_xterm_get(m, "").Write(string(b))
}
}},
INSTALL: {Name: "install", Help: "安装", Hand: func(m *ice.Message, arg ...string) {
_xterm_get(m, kit.Select(m.Option(mdb.HASH), arg, 0)).Write([]byte(m.Cmdx(PUBLISH, ice.CONTEXTS, INSTALL) + ice.NL))
m.ProcessHold()
_xterm_get(m, kit.Select("", arg, 0)).Write(m.Cmdx(PUBLISH, ice.CONTEXTS, INSTALL) + ice.NL)
ctx.ProcessHold(m)
}},
web.WEBSITE: {Name: "website", Help: "打开", Hand: func(m *ice.Message, arg ...string) {
m.ProcessOpen(web.MergePodCmd(m, "", m.PrefixKey(), mdb.HASH, m.Option(mdb.HASH)))
web.ProcessWebsite(m, "", "", m.OptionSimple(mdb.HASH))
}},
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text")), Hand: func(m *ice.Message, arg ...string) {
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,init", mdb.TOOLS, FAVOR), ctx.CmdAction(), ctx.ProcessAction()), Hand: func(m *ice.Message, arg ...string) {
if mdb.HashSelect(m, arg...); len(arg) == 0 {
m.PushAction(web.WEBSITE, mdb.REMOVE)
m.Action(mdb.CREATE, mdb.PRUNES)
} else {
m.Action("full", INSTALL)
ctx.DisplayLocal(m, "")
ctx.Toolkit(m)
}
}},
})
}
func ProcessXterm(m *ice.Message, args []string, arg ...string) {
if len(arg) == 0 || arg[0] != ice.RUN {
args = []string{m.Cmdx(Prefix(XTERM), mdb.CREATE, args)}
}
ctx.ProcessField(m, Prefix(XTERM), args, arg...)
}

View File

@ -5,9 +5,12 @@ import (
"strings"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/core/chat"
kit "shylinux.com/x/toolkits"
)
func _website_url(m *ice.Message, file string) string {
@ -25,6 +28,75 @@ func init() {
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.RENDER, mdb.CREATE, nfs.ZML, m.PrefixKey())
m.Cmd(mdb.ENGINE, mdb.CREATE, nfs.ZML, m.PrefixKey())
gdb.Watch(m, VIMER_TEMPLATE)
gdb.Watch(m, VIMER_COMPLETE)
}},
VIMER_TEMPLATE: {Hand: func(m *ice.Message, arg ...string) {
switch kit.Ext(m.Option(mdb.FILE)) {
case ZML:
m.Echo(`
{
username
系统
命令 index cli.system
共享 index cli.qrcode
代码
趋势 index web.code.git.trend args icebergs action auto
状态 index web.code.git.status args icebergs
脚本
终端 index hi/hi.sh
文档 index hi/hi.shy
数据 index hi/hi.py
后端 index hi/hi.go
前端 index hi/hi.js
}
`)
case nfs.IML:
m.Echo(`
系统
命令
cli.system
环境
cli.runtime
开发
模块
hi/hi.go
脚本
hi/hi.sh
hi/hi.shy
hi/hi.py
hi/hi.go
hi/hi.js
`)
}
}},
VIMER_COMPLETE: {Hand: func(m *ice.Message, arg ...string) {
switch kit.Select("", kit.Slice(kit.Split(m.Option(mdb.TEXT), "\t \n`"), -1), 0) {
case mdb.TYPE:
m.Push(mdb.NAME, "menu")
case ctx.INDEX:
m.Cmdy(ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, "", "", ice.OptionFields("index,name,text"))
_vimer_list(m, ice.SRC, ctx.INDEX)
case ctx.ACTION:
m.Push(mdb.NAME, "auto")
m.Push(mdb.NAME, "push")
m.Push(mdb.NAME, "open")
default:
if strings.HasSuffix(m.Option(mdb.TEXT), " ") {
m.Push(mdb.NAME, "index")
m.Push(mdb.NAME, "action")
m.Push(mdb.NAME, "args")
m.Push(mdb.NAME, "type")
} else if m.Option(mdb.TEXT) == "" {
m.Push(mdb.NAME, "head")
m.Push(mdb.NAME, "left")
m.Push(mdb.NAME, "main")
m.Push(mdb.NAME, "foot")
}
}
}},
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
m.EchoIFrame(_website_url(m, strings.TrimPrefix(path.Join(arg[2], arg[1]), SRC_WEBSITE)))

View File

@ -12,8 +12,8 @@ func (m *Message) ActionKey() string {
func (m *Message) CommandKey() string {
return strings.TrimSuffix(strings.TrimPrefix(m._key, PS), PS)
}
func (m *Message) PrefixKey(arg ...string) string {
return kit.Keys(m.Prefix(m.CommandKey()), arg)
func (m *Message) PrefixKey(arg ...Any) string {
return kit.Keys(m.Prefix(m.CommandKey()), kit.Keys(arg))
}
func (m *Message) Prefix(arg ...string) string {
return m.Target().PrefixKey(arg...)

View File

@ -169,7 +169,7 @@ func _status_list(m *ice.Message) (files, adds, dels int, last time.Time) {
default:
m.Push(TAGS, "")
if strings.Contains(vs[0], "??") {
list = append(list, ADD)
list = append(list, ADD, nfs.TRASH)
} else {
list = append(list, COMMIT)
}
@ -305,6 +305,9 @@ func init() {
code.PUBLISH: {Name: "publish", Help: "发布", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.PUBLISH, ice.CONTEXTS, ice.MISC, ice.CORE)
}},
nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(nfs.TRASH, path.Join(_repos_path(m.Option(REPOS)), m.Option(nfs.FILE)))
}},
code.BINPACK: {Name: "binpack", Help: "发布模式", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(nfs.LINK, ice.GO_SUM, path.Join(ice.SRC_RELEASE, ice.GO_SUM))
m.Cmd(nfs.LINK, ice.GO_MOD, path.Join(ice.SRC_RELEASE, ice.GO_MOD))

View File

@ -158,7 +158,7 @@ func init() {
}},
code.XTERM: {Name: "xterm", Help: "终端", Hand: func(m *ice.Message, arg ...string) {
code.ProcessXterm(m, []string{mdb.TYPE, "tmux attach -t " + m.Option(SESSION)}, arg...)
ctx.Process(m, code.XTERM, []string{mdb.TYPE, "tmux attach -t " + m.Option(SESSION)}, arg...)
}},
SCRIPT: {Name: "script name", Help: "脚本", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SCRIPT, m.Option(mdb.NAME), func(value ice.Maps) {

View File

@ -2,13 +2,209 @@ title "vim"
refer `
官网 https://www.vim.org
源码 https://github.com/vim/vim
文档 http://vimdoc.sourceforge.net/htmldoc/usr_toc.html
文档 http://vimdoc.sourceforge.net/htmldoc/help.html
`
chapter "源码"
field "安装" web.code.vim.vim
field "源码" web.code.inner args `usr/install/vim-vim-12be734/ src/main.c 110`
field "编辑器" web.code.vim.vim
field "源代码" web.code.ctags.inner args `usr/install/vim-vim-12be734/ src/main.c 110`
field "计数" web.code.git.count args `usr/install/vim-vim-12be734/src/`
web.code.ctags.chain `
syntax.c
buffer.c
window.c
screen.c
session.c
quickfix.c
popupmenu.c
popupwin.c
autocmd.c
mouse.c
pty.c
undo.c
menu.c
message.c
message_test.c
move.c
fold.c
term.c
term.h
terminal.c
termlib.c
alloc.h
arabic.c
arglist.c
ascii.h
auto
beval.c
beval.h
bigvim64.bat
bigvim.bat
blob.c
blowfish.c
bufwrite.c
change.c
channel.c
charset.c
cindent.c
clientserver.c
clipboard.c
cmdexpand.c
cmdhist.c
config.h.in
config.mk.dist
config.mk.in
configure
configure.ac
create_cmdidxs.vim
crypt.c
crypt_zip.c
debugger.c
dehqx.py
dict.c
diff.c
digraph.c
dimm.idl
dlldata.c
dosinst.c
dosinst.h
drawline.c
drawscreen.c
edit.c
errors.h
evalbuffer.c
eval.c
evalfunc.c
evalvars.c
evalwindow.c
ex_cmdidxs.h
ex_cmds2.c
ex_cmds.c
ex_cmds.h
ex_docmd.c
ex_eval.c
ex_getln.c
feature.h
fileio.c
filepath.c
findfile.c
getchar.c
glbl_ime.cpp
glbl_ime.h
globals.h
GvimExt
gvimtutor
hardcopy.c
hashtab.c
help.c
highlight.c
iid_ole.c
indent.c
infplist.xml
insexpand.c
iscygpty.c
iscygpty.h
job.c
json.c
json_test.c
keymap.h
kword_test.c
libvterm
link.390
link.sh
list.c
locale.c
macros.h
main.c
map.c
mark.c
match.c
mbyte.c
memfile.c
memfile_test.c
memline.c
misc1.c
misc2.c
mysign
nbdebug.c
nbdebug.h
netbeans.c
normal.c
ops.c
option.c
optiondefs.h
option.h
optionstr.c
osdef1.h.in
osdef2.h.in
osdef.sh
pathdef.sh
profiler.c
proto
protodef.h
proto.h
README.md
regexp_bt.c
regexp.c
regexp.h
regexp_nfa.c
register.c
scriptfile.c
search.c
sha256.c
sign.c
sound.c
spell.c
spellfile.c
spell.h
spellsuggest.c
structs.h
tag.c
tearoff.bmp
testing.c
textformat.c
textobject.c
textprop.c
time.c
toolbar.phi
toolcheck
tools.bmp
typemap
typval.c
ui.c
uninstall.c
usercmd.c
userfunc.c
version.c
version.h
vim9compile.c
vim9execute.c
vim9.h
vim9script.c
vim9type.c
vim_alert.ico
vim.def
vim_error.ico
vim.h
vim.ico
vim_icon.xbm
viminfo.c
vim_info.ico
vim_mask.xbm
vim_quest.ico
vim.rc
vimrun.c
vim.tlb
vimtutor
VisVim
which.sh
winclip.c
xdiff
xpm_w32.c
xpm_w32.h
`
section "构建"
shell `
yum install -y wget make gcc