1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00

opt Vimer

This commit is contained in:
harveyshao 2022-10-03 23:41:04 +08:00
parent e515fa852e
commit 163d4e1504
5 changed files with 45 additions and 78 deletions

View File

@ -78,10 +78,10 @@ Volcanos(chat.ONENGINE, {help: "搜索引擎", _init: function(can, meta, list,
return false
},
_plugin: function(event, can, msg, panel, cmds, cb) {
if (cmds[0] == ctx.ACTION && cmds[1] == ice.RUN && can.onengine.plugin.meta[cmds[2]]) {
return can.core.CallFunc(can.onengine.plugin.meta[cmds[2]], {can: panel, msg: msg, cmds: cmds.slice(3), cb: cb}), true
if (cmds[0] == ctx.ACTION && cmds[1] == ice.RUN && can.onengine.plugin(can, cmds[2])) {
return can.core.CallFunc(can.onengine.plugin(can, cmds[2]), {can: panel, msg: msg, cmds: cmds.slice(3), cb: cb}), true
}
var p = can.onengine.plugin.meta[cmds[0]], n = 1; if (p) {
var p = can.onengine.plugin(can, cmds[0]), n = 1; if (p) {
if (p.meta && p.meta[cmds[1]] && cmds[0] == ctx.ACTION) { n = 3 } else if (p.meta && p.meta[cmds[0]]) { n = 2 }
return can.core.CallFunc(p, {can: p.can||panel, msg: msg, arg: cmds.slice(n), cmds: cmds.slice(n), cb: cb}), true
}
@ -89,9 +89,12 @@ Volcanos(chat.ONENGINE, {help: "搜索引擎", _init: function(can, meta, list,
},
plugin: shy("添加插件", function(can, name, command) {
if (can.base.isObject(name)) {
return can.core.Item(name, function(key, value) {
name.hasOwnProperty(key) && can.base.isFunc(value) && can.onengine.plugin(can, key, value) })
if (name == undefined) { return }
if (command == undefined) {
if (typeof name != "string") { return }
if (name.indexOf("can.") == -1) { return }
name = can.base.trimPrefix(name, "can.")
return arguments.callee.meta[name]
}
name = can.base.trimPrefix(name, "can.")
var type = html.TEXT; command.list = can.core.List(command.list, function(item) {
@ -99,7 +102,7 @@ Volcanos(chat.ONENGINE, {help: "搜索引擎", _init: function(can, meta, list,
case lang.STRING: return can.core.SplitInput(item)
case lang.OBJECT: return type = item.type||type, item
}
}), command.can = can, arguments.callee.meta[can.core.Keys(ice.CAN, name)] = command
}), command.can = can, arguments.callee.meta[name] = command
}),
listen: shy("监听事件", function(can, name, cb) {
arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb)
@ -456,7 +459,7 @@ Volcanos(chat.ONAPPEND, {help: "渲染引擎", _init: function(can, meta, list,
}, target||can._output, field)
},
plugin: function(can, meta, cb, target, field) { meta = meta||{}, meta.index = meta.index||can.core.Keys(meta.ctx, meta.cmd)
var p = can.onengine.plugin.meta[meta.index], res = {}; function cbs(sub, meta, skip) { res.__proto__ = sub, cb(sub, meta, skip) }
var p = can.onengine.plugin(can, meta.index), res = {}; function cbs(sub, meta, skip) { res.__proto__ = sub, cb(sub, meta, skip) }
(meta.meta || meta.inputs && meta.inputs.length > 0)? /* 局部命令 */ can.onappend._plugin(can, {meta: meta.meta, list: meta.list}, meta, cbs, target, field):
p? /* 前端命令 */ can.onappend._plugin(can, {name: meta.index, help: p.help, meta: p.meta, list: p.list}, meta, function(sub, meta, skip) {
sub.run = function(event, cmds, cb) { var _cb = p, n = 0

View File

@ -255,8 +255,8 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg
if (list[cmds[0]]) { return list[cmds[0]](cmds.slice(1)), true }
},
concat: function(can, to, from) { to = to||[], from = from||[]
if (from[0] == ctx.ACTION && from[1] == ice.RUN && can.onengine.plugin.meta[from[2]]) { return from }
if (can.onengine.plugin.meta[from[0]]) { return from }
if (from[0] == ctx.ACTION && from[1] == ice.RUN && can.onengine.plugin(can, from[2])) { return from }
if (can.onengine.plugin(can, from[0])) { return from }
if (from[0] == "_search") { return from }
return to.concat(from)
},

View File

@ -38,6 +38,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) {
_cmd: function(can, item, next) { can.onengine.signal(can, chat.ONACTION_CMD)
can.onappend.plugin(can, can.base.Copy(item, {mode: "cmd", opts: can.misc.Search(can)}), function(sub, meta, skip) {
sub.run = function(event, cmds, cb) { can.runActionCommand(event, sub._index, cmds, cb) }
can._plugins = can.misc.concat(can, can._plugins, [sub])
can.user.title(meta.name), skip || next()
})
},

View File

@ -32,8 +32,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据",
var ls = can.file.split(ice.PS); if (ls.length > 4) { ls = [ls.slice(0, 2).join(ice.PS)+"/.../"+ls.slice(-2).join(ice.PS)] }
can.Status(kit.Dict("文件名", ls.join(ice.PS), "解析器", can.parse)), can.onimport.layout(can)
skip || can.onaction.selectLine(can, can.Option(nfs.LINE))
can.base.isFunc(cb) && cb(), cb = null
skip || can.onaction.selectLine(can, can.Option(nfs.LINE)), can.base.isFunc(cb) && cb(), cb = null
})
}
function load(msg) { can.tabview[key] = msg
@ -65,7 +64,7 @@ Volcanos(chat.ONFIGURE, {help: "索引导航",
can.onimport.zone(can, can.core.List(path, function(path) { return {name: path, _init: function(target) { show(target, path) }} }), target)
},
plugin: function(can, target, zone) { var total = 0
can.onimport.tree(can, can.core.Item(can.onengine.plugin.meta, function(key) { return total++, {index: can.base.trimPrefix(key, "can.")} }), ctx.INDEX, ice.PT, function(event, item) {
can.onimport.tree(can, can.core.Item(can.onengine.plugin.meta, function(key) { return total++, {index: key} }), ctx.INDEX, ice.PT, function(event, item) {
can.onimport.tabview(can, can.Option(nfs.PATH), can.core.Keys("can", item.index), ctx.INDEX)
}, target), zone._total(total)
},
@ -105,7 +104,6 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", _init: function(can, msg, cb) {
return can.onimport.plug(can, {index: msg.Option(ctx.INDEX), args: can.Option(nfs.PATH) == ctx.COMMAND && can.Option(nfs.LINE) != ctx.INDEX? [can.Option(nfs.LINE)]: []}, can.ui._content, function(sub) {
sub.onimport.size(sub, sub.ConfHeight(can.ui.content.offsetHeight-2*html.ACTION_HEIGHT), sub.ConfWidth(can.ui.content.offsetWidth), true)
msg._plugin = sub, can.base.isFunc(cb) && cb(msg._content = can.ui._content), can.onmotion.delay(can, function() { sub.Focus() })
sub.onaction.close = function() { can.onaction.back(can), msg._tab._close() }
sub.onimport._open = function(sub, msg, _arg) { var url = can.base.ParseURL(_arg), ls = url.origin.split("/chat/pod/")
if (_arg.indexOf(location.origin) == 0 && ls.length > 1) {
@ -247,6 +245,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据",
if (target.offsetWidth < can.ui._profile_output.offsetWidth) { can.profile_size[can.onexport.keys(can)] = target.offsetWidth, can.onimport.layout(can) }
}) })
}
can.onmotion.toggle(can, can.ui.profile_output, true)
can.onmotion.toggle(can, can.ui.profile, true), can.onimport.layout(can)
},
display: function(can, msg) {
@ -302,8 +301,8 @@ Volcanos(chat.ONACTION, {help: "控件交互", _trans: {link: "链接", width: "
})
Volcanos(chat.ONIMPORT, {help: "导入数据",
_keydown: function(can) { can.onkeymap._build(can)
can.isCmdMode() && can._root.onengine.listen(can, chat.ONKEYDOWN, function(event) {
_keydown: function(can) { if (!can.isCmdMode()) { return }
can.onkeymap._build(can), can._root.onengine.listen(can, chat.ONKEYDOWN, function(event) {
can._key_list = can.onkeymap._parse(event, can, mdb.PLUGIN, can._key_list, can.ui.content)
})
},
@ -316,8 +315,6 @@ Volcanos(chat.ONKEYMAP, {help: "导入数据",
r: shy("执行命令", function(event, can) { can.onaction[cli.EXEC](event, can) }),
f: shy("打开文件", function(event, can) { can.onaction["打开"](event, can) }),
g: shy("搜索", function(event, can) { can.onaction["搜索"](event, can) }),
x: shy("关闭标签", function(event, can) { can._tab._close() }),
h: shy("打开左边标签", function(event, can) { var next = can._tab.previousSibling; next && next.click() }),
l: shy("打开右边标签", function(event, can) { var next = can._tab.nextSibling; next && next.click() }),
@ -343,10 +340,8 @@ Volcanos(chat.ONKEYMAP, {help: "导入数据",
})
Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) {
can.page.ClassList.add(can, can._fields, code.INNER)
can.onmotion.clear(can), can.onlayout.profile(can)
can.onimport._profile(can, can.ui.profile)
can.onimport._display(can, can.ui.display)
can.onmotion.clear(can), can.page.ClassList.add(can, can._fields, code.INNER), can.onlayout.profile(can)
can.onimport._profile(can, can.ui.profile), can.onimport._display(can, can.ui.display)
if (msg.Result() == "" && can.Option(nfs.LINE) == "1") { return }
if (msg.Option(nfs.FILE)) {
@ -401,6 +396,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
},
layout: function(can) {
if (can.isSimpleMode()) { return can.page.style(can, can.ui.content, html.WIDTH, can.ConfWidth()) }
if (can.isCmdMode()) { can.ConfHeight(window.innerHeight), can.ConfWidth(window.innerWidth) }
var width = can.ConfWidth()+(can.user.isMobile && can.isCmdMode() && can.user.isLandscape()? 16: 0)-(can.user.isWindows && !can.isCmdMode()? 20: 0)
var project_width = can.ui.project.style.display == html.NONE? 0: (can.ui.project.offsetWidth||240)
@ -412,47 +408,30 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
var height = can.user.isMobile && can.isFloatMode()? window.innerHeight-2*html.ACTION_HEIGHT: can.base.Min(can.ConfHeight(), 320)-1
var display_height = can.ui.display.style.display == html.NONE? 0: (can.display_size[can.onexport.keys(can)]||height/2)
if (can.isCmdMode()) { // height += html.ACTION_HEIGHT
var content_height = height-display_height - can.ui._tabs.offsetHeight - can.ui._path.offsetHeight - 4
can.page.style(can, can._output, html.MAX_HEIGHT, "")
} else {
var content_height = height-display_height
}
var content_height = height-display_height; if (can.isCmdMode()) { content_height -= can.ui._tabs.offsetHeight + can.ui._path.offsetHeight + 4 }
var profile_height = height-html.ACTION_HEIGHT-display_height
can.page.styleHeight(can, can.ui.profile_output, profile_height)
can.page.styleHeight(can, can.ui.display_output, display_height)
can.page.styleHeight(can, can.ui.content, content_height-(can.ui.content != can.ui._content? 4: 0))
can.page.styleHeight(can, can.ui.project, height)
can.page.Select(can, can.ui.profile, html.IFRAME, function(iframe) {
can.page.Modify(can, iframe, {height: profile_height-html.ACTION_HEIGHT-4, width: profile_width})
})
var sub = can.ui.content._plugin; if (sub) {
sub.ConfHeight(content_height-2*html.ACTION_HEIGHT), sub.ConfWidth(content_width)
sub && sub.onaction.refresh({}, sub)
}
var sub = can.ui.content._plugin; sub && sub.onimport.size(content_height-2*html.ACTION_HEIGHT, content_width, true)
can.page.Select(can, can.ui.profile, html.IFRAME, function(iframe) { can.page.Modify(can, iframe, {height: profile_height-html.ACTION_HEIGHT-4, width: profile_width}) })
},
toolkit: function(can, meta, cb) { meta.msg = true
can.onimport.plug(can, meta, can.ui.toolkit.output, function(sub) {
sub.ConfHeight(can.ConfHeight()/2), sub.ConfWidth(can.ConfWidth()-can.ui.project.offsetWidth)
sub.page.style(sub, sub._output, html.MAX_HEIGHT, sub.ConfHeight())
sub.page.style(sub, sub._output, html.MAX_WIDTH, sub.ConfWidth())
sub.onimport.size(sub, can.ConfHeight()/2, can.ConfWidth() - can.ui.profile.offsetWidth, true)
can._status.appendChild(sub._legend), sub._legend.onclick = function(event) {
if (can.page.Select(can, can._status, ice.PT+html.SELECT)[0] == event.target) {
can.page.ClassList.del(can, event.target, html.SELECT)
can.page.ClassList.del(can, sub._target, html.SELECT)
return
}
can.onmotion.select(can, can.ui.toolkit.output, html.FIELDSET, sub._target), sub.Focus()
can.onmotion.select(can, can._status, html.LEGEND, event.target)
if (meta.msg == true) { meta.msg = false, sub.Update() }
}, sub.select = function() { return sub._legend.click(), sub }
sub.onaction.close = function() { sub.select() }
sub._legend.onmouseenter = null
can.base.isFunc(cb) && cb(sub)
}, sub._legend.onmouseenter = null, can.base.isFunc(cb) && cb(sub)
sub.onaction.close = sub.select = function() { return sub._legend.click(), sub }
})
},
exts: function(can, url, cb) {

View File

@ -1,10 +1,9 @@
Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) {
can.require(["inner.js"], function(can) { can.onimport.inner_init(can, msg, function() { can.undo = [], can.redo = []
// can.core.Item(can.onkeymap._mode.plugin, function(key, value) { can.onkeymap._mode.normal[key] = can.onkeymap._mode.normal[key]||value })
can.page.ClassList.add(can, can._fields, code.VIMER)
can.onimport._input(can), can.onkeymap._build(can), can.onkeymap._plugin({}, can)
can.onengine.listen(can, "tabview.line.select", function(msg) { can.onaction._selectLine(can) })
can.page.ClassList.add(can, can._fields, code.VIMER), can.base.isFunc(cb) && cb(msg)
can.onengine.plugin(can, can.onplugin)
can.onengine.plugin(can, can.onplugin), can.base.isFunc(cb) && cb(msg)
}, target) }, function(can, name, sub) { name == chat.ONIMPORT && (can.onimport.inner_init = sub._init)
if (name == chat.ONACTION) { can._trans = can.base.Copy(can._trans||{}, sub._trans) }
if (name == chat.ONKEYMAP) { can.core.Item(sub._mode, function(mode, value) {
@ -18,32 +17,24 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
{view: ["current", html.INPUT], spellcheck: false, onkeydown: function(event) { if (event.metaKey) { return }
if (event.ctrlKey && can.onaction._complete(event, can)) { return }
can._keylist = can.onkeymap._parse(event, can, can.mode+(event.ctrlKey? "_ctrl": ""), can._keylist, can.ui.current)
can.mode == "insert" && can.onmotion.delay(can, function() { can.current.text(can.ui.current.value) }, 10)
can.mode == "insert" && can.onmotion.delay(can, function() { can.current.text(can.ui.current.value) })
can.mode == "normal" && can.Status("按键", can._keylist.join(""))
can.mode == "normal" && can.onkeymap.prevent(event)
}, onkeyup: function(event) { can.onaction._complete(event, can)
}, onclick: function(event) { can.onkeymap._insert(event, can)
}}, {view: [code.COMPLETE]},
}}, code.COMPLETE,
]); can.ui.current = ui.current, can.ui.complete = ui.complete
},
}, [""])
Volcanos(chat.ONFIGURE, {help: "索引导航",
create: function(can, target, zone, path) {
if (can.isCmdMode()) {
can.onappend._action(can, can.base.Obj(can._msg.Option(ice.MSG_ACTION)), target)
} else {
can.onmotion.hidden(can, target.parentNode)
}
can.isCmdMode()? can.onappend._action(can, can.base.Obj(can._msg.Option(ice.MSG_ACTION)), target): can.onmotion.hidden(can, target.parentNode)
},
source: function(can, target, zone, path) { var total = 0
function show(target, path) { can.run(can.request({}, {dir_root: path, dir_deep: true}), [ice.PWD], function(msg) { var list = msg.Table()
can.core.List(list, function(item) { if (can.Option(nfs.FILE).indexOf(item.path) == 0) { item.expand = true }
item._menu = shy({trash: function(event) { can.onaction._run(event, can, nfs.TRASH, [can.base.Path(path, item.path)]) }})
})
can.core.List(list, function(item) { item._menu = shy({trash: function(event) { can.onaction._run(event, can, nfs.TRASH, [can.base.Path(path, item.path)]) }}) })
can.onimport.tree(can, list, nfs.PATH, ice.PS, function(event, item) { can.onimport.tabview(can, path, item.path) }, target)
can.Status("文件数", total += msg.Length()), zone._total(total)
can.Status("文件数", zone._total(total += msg.Length()))
}, true) }
if (path.length == 1) { return show(target, path[0]) } can.page.Remove(can, target.previousSibling)
@ -51,20 +42,16 @@ Volcanos(chat.ONFIGURE, {help: "索引导航",
},
website: function(can, target, zone) {
can.run(can.request({}, {dir_root: "src/website/", dir_deep: true}), [ice.PWD], function(msg) { var list = msg.Table()
can.core.List(list, function(item) { if (can.Option(nfs.FILE).indexOf(item.path) == 0) { item.expand = true } })
can.onimport.tree(can, list, nfs.PATH, ice.PS, function(event, item) { can.onimport.tabview(can, "src/website/", item.path) }, target)
zone._total(msg.Length())
}, true)
},
dream: function(can, target, zone) { var call = arguments.callee
can.runAction({}, ice.RUN, [web.DREAM], function(msg) { msg.Table(function(item) { var color = item.status == cli.START? "": "gray"
can.page.style(can, can.onimport.item(can, item, function(event) {
can.onimport.tabview(can, can.Option(nfs.PATH), item.name, web.DREAM)
}, function(event) {
can.page.style(can, can.onimport.item(can, item, function(event) { can.onimport.tabview(can, can.Option(nfs.PATH), item.name, web.DREAM) }, function(event) {
return shy({}, kit.Dict(cli.START, [cli.OPEN, cli.STOP], cli.STOP, [cli.START, nfs.TRASH])[item.status], function(event, button) {
can.runAction(can.request({}, item), ice.RUN, [web.DREAM, ctx.ACTION, button], function(msg) {
if (can.sup.onimport._process(can.sup, msg)) { return }
can.onmotion.clear(can, target), call(can, target, zone)
if (can.sup.onimport._process(can.sup, msg)) { return } can.onmotion.clear(can, target), call(can, target, zone)
})
})
}, target), {color: color})
@ -77,21 +64,17 @@ Volcanos(chat.ONFIGURE, {help: "索引导航",
},
xterm: function(can, target, zone) {
can.runAction({}, ice.RUN, [code.XTERM], function(msg) { msg.Table(function(item) {
can.onimport.item(can, item, function(event) {
can.onimport.tabview(can, ctx.COMMAND, code.XTERM, item.hash)
}, function(event) {}, target)
can.onimport.item(can, item, function(event) { can.onimport.tabview(can, ctx.COMMAND, code.XTERM, item.hash) }, function(event) {}, target)
}), zone._total(msg.Length()) })
},
plugin: function(can, target, zone) { var total = 0
can.onimport.tree(can, can.core.Item(can.onengine.plugin.meta, function(key) { return total++, {index: can.base.trimPrefix(key, "can.")} }), ctx.INDEX, ice.PT, function(event, item) {
can.onimport.tree(can, can.core.Item(can.onengine.plugin.meta, function(key) { return total++, {index: key} }), ctx.INDEX, ice.PT, function(event, item) {
can.onimport.tabview(can, can.Option(nfs.PATH), can.core.Keys("can", item.index), ctx.INDEX)
}, target), zone._total(total)
},
module: function(can, target, zone) {
can.runAction(can.request({}, {fields: ctx.INDEX}), ctx.COMMAND, [mdb.SEARCH, ctx.COMMAND], function(msg) {
can.onimport.tree(can, msg.Table(), ctx.INDEX, ice.PT, function(event, item) {
can.onimport.tabview(can, can.Option(nfs.PATH), item.index, ctx.INDEX)
}, target), zone._total(msg.Length())
can.onimport.tree(can, msg.Table(), ctx.INDEX, ice.PT, function(event, item) { can.onimport.tabview(can, can.Option(nfs.PATH), item.index, ctx.INDEX) }, target), zone._total(msg.Length())
})
},
})
@ -116,15 +99,16 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互",
t: shy("添加命令", function(event, can) { can.onaction["添加"](event, can) }),
p: shy("添加插件", function(event, can) { can.onaction["插件"](event, can) }),
e: shy("添加扩展", function(event, can) { can.onaction["扩展"](event, can) }),
g: shy("搜索", function(event, can) { can.onaction["搜索"](event, can) }),
i: shy("插入模式", function(event, can) { can.onkeymap._insert(event, can) }),
n: shy("命令模式", function(event, can) { can.onkeymap._normal(event, can) }),
":": shy("底行模式", function(event, can) { can.onimport.toolkit(can, {index: "cli.system"}, function(sub) { can.toolkit["cli.system"] = sub.select() }) }),
s: shy("保存文件", function(event, can) { can.onaction.save(event, can, nfs.SAVE) }),
d: shy("创建空间", function(event, can) { can.onaction.dream(event, can, web.DREAM) }),
m: shy("添加模块", function(event, can) { can.onaction.autogen(event, can, code.AUTOGEN) }),
c: shy("编译项目", function(event, can) { can.onaction.compile(event, can, code.COMPILE) }),
m: shy("添加模块", function(event, can) { can.onaction.autogen(event, can, code.AUTOGEN) }),
d: shy("创建空间", function(event, can) { can.onaction.dream(event, can, web.DREAM) }),
},
normal_ctrl: {
f: shy("向下翻页", function(event, can, target, count) {
@ -435,7 +419,7 @@ Volcanos(chat.ONACTION, {help: "控件交互",
})
},
})
Volcanos(chat.ONEXPORT, {help: "导出数据", list: ["文件数", "模式", "解析器", "文件名", "当前行", "跳转数"]})
Volcanos(chat.ONEXPORT, {help: "导出数据", list: ["文件数", "模式", "按键", "解析器", "文件名", "当前行", "跳转数"]})
Volcanos(chat.ONPLUGIN, {help: "注册插件",
"code.vimer.keymap": shy("按键", {}, ["mode", "key", ice.LIST, ice.BACK], function(can, msg, cmds) {
can.core.Item(can.onkeymap._mode, function(mode, value) {