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

opt vimer.js

This commit is contained in:
harveyshao 2022-01-18 17:57:51 +08:00
parent 7692d4069f
commit 0d60be84d0
19 changed files with 220 additions and 414 deletions

View File

@ -16,7 +16,7 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta,
}, target)
}, function() { can.misc.Log(can.user.title(), ice.RUN, can)
can.require([can.volcano], null, function(can, name, sub) { can[name] = sub })
can.onlayout.topic(can), can.onmotion._init(can, target), can.onkeypop._init(can)
can.onlayout.topic(can), can.onmotion._init(can, target), can.onkeymap._init(can)
can.ondaemon._init(can), can.onengine.signal(can, chat.ONMAIN, can.request())
can.base.isFunc(cb) && cb()
}), can.onmotion.float.auto(can, document.body)
@ -448,9 +448,9 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
can.onengine.signal(can, "keymap.focus", can.request({}, {cb: function(event) {
if (event.target.tagName == "INPUT") { return }
if (event.key == lang.ESCAPE) { ui.close(); return }
if (event.key == ice.SP) { input.focus(), can.onkeypop.prevent(event) }
if (event.key == ice.SP) { input.focus(), can.onkeymap.prevent(event) }
}}))
}, onkeydown: function(event) { can.onkeypop.input(event, can)
}, onkeydown: function(event) { can.onkeymap.input(event, can)
if (event.key != lang.ENTER) { return }
event.target.setSelectionRange(0, -1)
@ -681,7 +681,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
event.target.value == back || cb(event, event.target.value, back)
break
case lang.ESCAPE: target.innerHTML = back; break
default: can.onkeypop.input(event, can)
default: can.onkeymap.input(event, can)
}
}, _init: function(target) {
item && can.onappend.figure(can, item, target), target.value = text
@ -700,7 +700,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
}
break
case lang.ESCAPE: target.innerHTML = back; break
default: can.onkeypop.input(event, can)
default: can.onkeymap.input(event, can)
}
}, _init: function(target) {
item && can.onappend.figure(can, item, target)
@ -736,7 +736,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
can.page.Modify(can, target, {style: {left: layout.left, top: layout.top}})
}
can.base.isFunc(cb) && cb(target)
can.onkeypop.prevent(event)
can.onkeymap.prevent(event)
}
can.base.isFunc(cb) && cb(target)
},
@ -775,12 +775,12 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
case "n":
var total = select(target._index)
select(target._index = ((target._index)+1) % total)
can.onkeypop.prevent(event)
can.onkeymap.prevent(event)
break
case "p":
var total = select(target._index)
select(target._index = (target._index-1) < 0? total-1: (target._index-1))
can.onkeypop.prevent(event)
can.onkeymap.prevent(event)
break
default: target._index = 0
}
@ -825,7 +825,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
can.Status(kit.Dict(mdb.TOTAL, total, mdb.INDEX, target._index))
},
})
Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) {
Volcanos("onkeymap", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) {
document.body.onkeydown = function(event) { var msg = can.request(event)
msg.Option("model", "normal"); if (event.target.tagName == "SELECT" || event.target.tagName == "INPUT" || event.target.tagName == "TEXTAREA") {
msg.Option("model", event.ctrlKey? "insert_ctrl": "insert")
@ -835,16 +835,16 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio
if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }
can.onengine.signal(can, "onkeydown", msg)
if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }
can._keylist = can.onkeypop._parse(event, can, msg.Option("model"), can._keylist||[], can._output)
can._keylist = can.onkeymap._parse(event, can, msg.Option("model"), can._keylist||[], can._output)
}
},
_build: function(can) {
can.core.Item(can.onkeypop._mode, function(item, value) { var engine = {}
can.core.Item(can.onkeymap._mode, function(item, value) { var engine = {}
can.core.Item(value, function(key, cb) { var map = engine
for (var i = key.length-1; i > -1; i--) {
map = map[key[i]] = i == 0? cb: (map[key[i]]||{})
}
}), can.onkeypop._engine[item] = engine
}), can.onkeymap._engine[item] = engine
})
},
_parse: function(event, can, mode, list, target) { list = list||[], list.push(event.key)
@ -854,15 +854,15 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio
function repeat(cb, count) { list = []
for (var i = 1; i <= count; i++) { if (cb(event, can, target, count)) { break } }
// can.onkeypop.prevent(event)
// can.onkeymap.prevent(event)
}
var map = can.onkeypop._mode[mode]
var map = can.onkeymap._mode[mode]
var cb = map && map[event.key.toLowerCase()]; if (can.base.isFunc(cb) && event.key.length > 1) {
repeat(cb, count); return list
}
var map = can.onkeypop._engine[mode]||{}; for (var i = list.length-1; i > pre-1; i--) {
var map = can.onkeymap._engine[mode]||{}; for (var i = list.length-1; i > pre-1; i--) {
var cb = map[list[i]]||{}; switch (typeof cb) {
case lang.FUNCTION: repeat(cb, count); return list
case lang.OBJECT: map = cb; continue
@ -878,7 +878,7 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio
target.blur()
},
jk: function(event, can, target) {
can.onkeypop.DelText(target, target.selectionStart-1, target.selectionStart)
can.onkeymap.DelText(target, target.selectionStart-1, target.selectionStart)
target.blur()
},
enter: function(event, can, target) {
@ -916,16 +916,16 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio
},
u: function(event, can, target) {
can.onkeypop.DelText(target, 0, target.selectionEnd)
can.onkeymap.DelText(target, 0, target.selectionEnd)
},
k: function(event, can, target) {
can.onkeypop.DelText(target, target.selectionStart)
can.onkeymap.DelText(target, target.selectionStart)
},
h: function(event, can, target) {
can.onkeypop.DelText(target, target.selectionStart-1, target.selectionStart)
can.onkeymap.DelText(target, target.selectionStart-1, target.selectionStart)
},
d: function(event, can, target) {
can.onkeypop.DelText(target, 0, target.selectionStart)
can.onkeymap.DelText(target, 0, target.selectionStart)
},
w: function(event, can, target) {
var start = target.selectionStart-2
@ -938,14 +938,14 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio
break
}
}
can.onkeypop.DelText(target, i+1, end-i)
can.onkeymap.DelText(target, i+1, end-i)
},
},
}, _engine: {},
input: function(event, can) { var target = event.target
target._keys = can.onkeypop._parse(event, can, event.ctrlKey? "insert_ctrl": mdb.INSERT, target._keys||[], target)
if (target._keys.length == 0 && target.tagName == "INPUT") { can.onkeypop.prevent(event) }
target._keys = can.onkeymap._parse(event, can, event.ctrlKey? "insert_ctrl": mdb.INSERT, target._keys||[], target)
if (target._keys.length == 0 && target.tagName == "INPUT") { can.onkeymap.prevent(event) }
},
DelText: function(target, start, count) {
target.value = target.value.substring(0, start)+target.value.substring(start+(count||target.value.length), target.value.length)

View File

@ -114,7 +114,7 @@ Volcanos("page", {help: "用户界面", ClassList: {
type = html.BUTTON, name = name||list[0]
data.innerText = can.user.trans(can, list[0]), data.onclick = function(event) {
can.base.isFunction(list[1]) && list[1](event, name)
can.onkeypop.prevent(event)
can.onkeymap.prevent(event)
return true
}

View File

@ -190,7 +190,7 @@ Volcanos("user", {help: "用户操作", agent: {
var input = can.page.Append(can, event.target.parentNode, [{type: html.TEXTAREA, value: text}]).first
can.onmotion.focus(can, input), document.execCommand("Copy")
can.page.Remove(can, input), can.user.toastSuccess(can)
can.onkeypop.prevent(event)
can.onkeymap.prevent(event)
},
carte: function(event, can, meta, list, cb, parent) {
meta = meta||can.ondetail||can.onaction||{}, list = list&&list.length > 0? list: meta.list||[]; if (list.length == 0) { return }
@ -214,9 +214,9 @@ Volcanos("user", {help: "用户操作", agent: {
var carte = {_target: ui._target, _parent: parent}
null && can.onmotion.float.add(can, chat.CARTE, carte)
ui._target.onmouseover = function(event) {
can.onkeypop.prevent(event)
can.onkeymap.prevent(event)
}
return can.onkeypop.prevent(event), carte
return can.onkeymap.prevent(event), carte
},
carteRight: function(event, can, meta, list, cb, parent) {
var carte = can.user.carte(event, can, meta, list, cb, parent)

View File

@ -49,7 +49,7 @@ Volcanos({name: "chat", panels: [
}},
project: {name: "研发群", storm: {
studio: {name: "研发 studio", list: [
{name: "vimer", help: "编辑器", index: "web.code.inner", args: ["src/", "main.go"], _action: ["autogen", "compile", "binpack"]},
{name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/", "main.go"], _action: ["autogen", "compile", "binpack"]},
{name: "repos", help: "代码库", index: "web.code.git.status"},
{name: "plan", help: "任务表", index: "web.team.plan"},
{name: "ctx", help: "上下文", index: "web.wiki.word", args: ["src/main.shy"]},

View File

@ -9,7 +9,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg)
can.onappend.plugin(can, item, function(sub, meta, skip) {
can.onimport._plugin(can, river, storm, sub, meta), skip || next()
})
}, function() { can.onimport._menu(can, msg), can.onkeypop._init(can)
}, function() { can.onimport._menu(can, msg), can.onkeymap._init(can)
can.onaction.layout(can, can.misc.SearchOrConf(can, chat.LAYOUT))
})
},
@ -153,9 +153,9 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, cb, t
can.onlayout._init(can)
},
})
Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) {
can.onkeypop._build(can), can.onengine.listen(can, "onkeydown", function(msg, model) {
can._keylist = can.onkeypop._parse(msg._event, can, model, can._keylist||[], can._output)
Volcanos("onkeymap", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) {
can.onkeymap._build(can), can.onengine.listen(can, "onkeydown", function(msg, model) {
can._keylist = can.onkeymap._parse(msg._event, can, model, can._keylist||[], can._output)
})
},
_mode: {

View File

@ -29,7 +29,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
},
_cli: function(can, msg, target) {
can.onappend.input(can, {type: html.TEXT, name: "cmd", onkeydown: function(event) {
can.onkeypop.input(event, can); if (event.key != lang.ENTER) { return }
can.onkeymap.input(event, can); if (event.key != lang.ENTER) { return }
switch (event.target.value) {
case cli.CLEAR: can.cli && can.cli.close(); break
case cli.CLOSE: can.cli && can.cli.close(); break

View File

@ -62,7 +62,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
},
_search: function(can, msg, target) {
var ui = can.onappend.input(can, {type: html.TEXT, name: mdb.SEARCH, onkeydown: function(event) {
can.onkeypop.input(event, can); switch (event.key) {
can.onkeymap.input(event, can); switch (event.key) {
case lang.ENTER: can.onengine.signal(can, "onopensearch", can.request(event, {type: "*", word: event.target.value}))
}
}}, "", target, "title search").parentNode

View File

@ -49,10 +49,10 @@ Volcanos("onaction", {help: "交互操作", list: [cli.CLEAR, cli.CLOSE, cli.DON
onlogin: function(can, msg) {
can.onappend._action(can, can.Conf(html.ACTION)||can.onaction.list)
can.ui = can.page.Append(can, can._output, [
{input: ["word", function(event) { can.onkeypop.input(event, can)
{input: ["word", function(event) { can.onkeymap.input(event, can)
if (event.key == lang.ESCAPE) { can.onmotion.hide(can) }
if (event.key == lang.ENTER) { can.onkeypop.prevent(event)
if (event.key == lang.ENTER) { can.onkeymap.prevent(event)
if (event.shiftKey) { var first = can.page.Select(can, can.ui.content, html.TR)[1]
return can.onaction[can.type == "*"? chat.PLUGIN: html.SELECT](event, can, first.dataset.index)
}

View File

@ -20,18 +20,18 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta,
onchange: function(event, can) {
if (can.Conf(mdb.TYPE) == html.SELECT) { can.run(event) }
},
onkeydown: function(event, can) { can.onkeypop.input(event, can, event.target)
onkeydown: function(event, can) { can.onkeymap.input(event, can, event.target)
if (can.Conf(mdb.TYPE) == html.TEXTAREA) { if (!event.ctrlKey) { return } }
if (event.key == lang.ENTER) {
can.run(event), can.onmotion.focus(can, event.target)
can.onkeypop.prevent(event)
can.onkeymap.prevent(event)
} if (!event.ctrlKey) { return }
switch (event.key) {
case "b": can.CloneInput(); break
case "m": can.CloneField(); break
default: return
} can.onkeypop.prevent(event)
} can.onkeymap.prevent(event)
},
})

View File

@ -39,7 +39,7 @@ Volcanos("onfigure", {help: "控件详情", list: [], key: {
}
if (event.ctrlKey && ["n", "p"].indexOf(event.key) > -1) {
return can.onkeypop.prevent(event)
return can.onkeymap.prevent(event)
}
switch (event.key) { case lang.ESCAPE: event.target.blur(); return }
can.base.isFunc(last) && last(event, can)

View File

@ -15,28 +15,23 @@ fieldset.inner>div.action div.tabs.select {
fieldset.inner>div.output {
color:white;
}
fieldset.inner table.layout div.toggle.project {
fieldset.inner>div.output>table.layout div.toggle.project {
min-width:15px; font-size:24px;
}
fieldset.inner table.layout div.toggle.profile {
fieldset.inner>div.output>table.layout div.toggle.profile {
min-width:15px; font-size:24px;
}
fieldset.inner table.layout div.toggle.display {
fieldset.inner>div.output>table.layout div.toggle.display {
height:15px; font-size:24px;
margin-top:-17px;
}
fieldset.inner div.output div.toggle {
/* display:none; */
}
fieldset.inner>div.output div.project {
font-size:14px; font-family:monospace;
max-width:180px; overflow:auto;
}
fieldset.inner>div.output>table.layout div.content {
fieldset.inner>div.output div.content {
position:relative;
padding-right:25px;
}
fieldset.inner>div.output div.content {
font-size:16px; font-family:monospace;
overflow:auto;
color:white;
@ -82,9 +77,6 @@ fieldset.inner>div.output div.content td.text span.constant {
fieldset.inner>div.output div.content td.text span.string {
color:magenta;
}
fieldset.inner>div.output div.display {
/* display:none; */
}
fieldset.inner>div.output div.display>div.action>div.item {
float:left;
}
@ -107,7 +99,6 @@ fieldset.inner div.output fieldset.toolkit {
}
fieldset.inner>div.output fieldset.toolkit>div.output>fieldset {
display:none; margin:0;padding:0;
/* float:right; */
}
fieldset.inner>div.output fieldset.toolkit>div.output>fieldset.select {
display:block;

View File

@ -56,9 +56,9 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
plug: can.core.Split(msg.OptionOrSearch("plug")).reverse(),
tabs: can.core.Split(msg.OptionOrSearch("tabs")),
}) }) },
_keydown: function(can) { can.onkeypop._build(can)
_keydown: function(can) { can.onkeymap._build(can)
can.user.mod.isCmd && can.onengine.listen(can, chat.ONKEYDOWN, function(event) {
can._key_list = can.onkeypop._parse(event, can, "normal", can._key_list, can.ui.content)
can._key_list = can.onkeymap._parse(event, can, "command", can._key_list, can.ui.content)
})
},
@ -72,6 +72,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
}, true)
},
tabview: function(can, path, file, line, cb) { var key = path+ice.DF+file
can.onkeymap._command(can)
if (can.tabview[key]) { can.user.mod.isCmd && can.user.title(path+file)
can._msg && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.tabview[key]
can.Option({path: path, file: file, line: line||can._msg.Option(nfs.LINE)||1})
@ -142,6 +143,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
can.page.styleHeight(can, can.ui.content, (can.ui.project.offsetHeight||height)-can.ui.display.offsetHeight)
}
can.page.styleWidth(can, can.ui.content, width-can.ui.project.offsetWidth-can.ui.profile.offsetWidth-25)
if (can.page.ClassList.has(can, can._fields, "full")) {
can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight)
} else {
@ -163,22 +165,20 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
}, [""])
Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], _init: function(can, msg, cb) {
if (can.onmotion.cache(can, function(cache_data) {
can.file && (cache_data[can.file] = {
current: can.current, max: can.max,
profile_display: can.ui.profile.style.display,
display_display: can.ui.display.style.display,
can.file && (cache_data[can.file] = {current: can.current, max: can.max,
profile_display: can.ui.profile.style.display, display_display: can.ui.display.style.display,
})
can.file = can.base.Path(msg.Option(nfs.PATH), msg.Option(nfs.FILE))
can.parse = can.base.Ext(can.file), can.Status("模式", "command")
var p = cache_data[can.file]; p && (can.current = p.current, can.max = p.max)
can.page.Modify(can, can.ui.profile, {style: {display: p? p.profile_display: html.NONE}})
can.page.Modify(can, can.ui.display, {style: {display: p? p.display_display: html.NONE}})
can.parse = can.base.Ext(can.file), can.Status("模式", "normal")
can.onmotion.select(can, can._action, chat.DIV_TABS, msg._tab)
msg.Option(ctx.INDEX) && can.core.Timer(10, function() {
can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0])
})
can.onimport.layout(can)
return can.file
return can.onimport.layout(can), can.file
}, can.ui.content, can.ui.profile_output, can.ui.display_output)) {
return can.onaction.selectLine(can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb()
}
@ -230,26 +230,29 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
return line
},
})
Volcanos("onkeypop", {help: "导入数据", _init: function(can, msg, cb, target) {
Volcanos("onkeymap", {help: "导入数据", _init: function(can, msg, cb, target) {
},
_mode: {
normal: {
escape: function(event, can, target) { can.onaction["清屏"](event, can) },
g: function(event, can, target) { can.onaction["搜索"](event, can) },
f: function(event, can, target) { can.onaction["打开"](event, can) },
t: function(event, can, target) { can.onaction["添加"](event, can) },
p: function(event, can, target) { can.onaction["插件"](event, can) },
e: function(event, can, target) { can.onaction["扩展"](event, can) },
command: {
escape: function(event, can) { can.onaction["清屏"](event, can) },
g: function(event, can) { can.onaction["搜索"](event, can) },
f: function(event, can) { can.onaction["打开"](event, can) },
t: function(event, can) { can.onaction["添加"](event, can) },
p: function(event, can) { can.onaction["插件"](event, can) },
e: function(event, can) { can.onaction["扩展"](event, can) },
q: function(event, can, target) { can.onaction["全屏"](event, can) },
r: function(event, can, target) { can.onaction["执行"](event, can) },
v: function(event, can, target) { can.onaction["展示"](event, can) },
s: function(event, can, target) { can.onaction["保存"](event, can) },
q: function(event, can) { can.onaction["全屏"](event, can) },
r: function(event, can) { can.onaction["执行"](event, can) },
v: function(event, can) { can.onaction["展示"](event, can) },
s: function(event, can) { can.onaction["保存"](event, can) },
j: function(event, can, target) { can.onaction.scrollLine(can, 1) },
k: function(event, can, target) { can.onaction.scrollLine(can, -1) },
J: function(event, can, target) { can.onaction.scrollLine(can, 20) },
K: function(event, can, target) { can.onaction.scrollLine(can, -20) },
j: function(event, can) { can.onaction.scrollLine(can, 1) },
k: function(event, can) { can.onaction.scrollLine(can, -1) },
J: function(event, can) { can.onaction.scrollLine(can, 20) },
K: function(event, can) { can.onaction.scrollLine(can, -20) },
i: function(event, can) { can.onkeymap._insert(event, can) },
n: function(event, can) { can.onkeymap._normal(can) },
},
}, _engine: {},
})
@ -386,10 +389,10 @@ Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加",
var push = {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()}
can.base.Eq({path: push.path, file: push.file, line: push.line}, can.history[can.history.length-1]) || can.history.push(push)
can.Status("跳转数", can.history.length)
can.onaction._selectLine(event, can)
})
// can.onkeymap && can.onkeymap._mode(can, "insert")
// can.onkeymap && can.onkeymap.selectLine(can)
},
_selectLine: function(event, can) {
},
searchLine: function(event, can, value) { if (!can.ui.search) { return }
can.ui.search.Update(event, [ctx.ACTION, nfs.TAGS, value.trim()])

View File

@ -1,51 +1,14 @@
fieldset.inner>div.output td.content {
position:relative;
}
fieldset.inner>div.output input.current {
position:absolute; padding:0; margin:0;
font-size:16px; font-family:monospace;
padding-left:9px;
fieldset.vimer>div.output input.current {
background-color:#00000000; color:#00000000;
font-family:monospace; font-size:16px;
position:absolute; left:0;
margin:0; margin-top:-2px;
padding:0; padding-left:9px;
width:-webkit-fill-available;
}
fieldset.inner>div.output input.current.insert {
fieldset.vimer>div.output input.current.insert {
caret-color:yellow;
}
fieldset.inner>div.output input.current.normal {
fieldset.vimer>div.output input.current.normal {
caret-color:blue;
}
fieldset.inner>div.output input.current.command {
display:none;
}
fieldset.inner>div.output input.command {
font-size:16px; font-family:monospace;
background-color:black; color:white;
caret-color:red;
border:solid 1px red;
border-left:solid 3px green;
width:-webkit-fill-available;
margin:0; padding:0 12px;
}
fieldset.inner>div.output input.command.normal {
display:none;
}
fieldset.inner>div.output input.command.insert {
display:none;
}
fieldset.inner>div.output div.display input.cmd {
font-size:16px; font-family:monospace;
background-color:black; color:white;
min-width:480px; padding-left:5px;
margin-left:2px;
}
fieldset.inner>div.output div.display div.output {
overflow:auto;
}
fieldset.inner>div.output div.display div.output {
/* max-height:160px; */
}

View File

@ -1,290 +1,143 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.require(["/plugin/local/code/inner.js"], function(can) {
can.onimport.inner_init(can, msg, list, function() {
can.onimport._input(can), can.onimport._output(can)
can.keylist = [], can.onkeymap._init(can, "insert")
can.base.isFunc(cb) && cb(msg)
}, target)
}, function(can, name, sub) {
sub._name == "onimport" && (can.onimport.inner_init = sub._init)
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, cb, target) {
can.require(["inner.js"], function(can) { can.onimport.inner_init(can, msg, function() {
can.onkeymap._build(can), can.onimport._input(can), can.onkeymap._normal(can), can.base.isFunc(cb) && cb(msg)
}, target) }, function(can, name, sub) {
name == chat.ONIMPORT && (can.onimport.inner_init = sub._init)
name == chat.ONKEYMAP && (can.base.Copy(can.onkeymap._mode, sub._mode))
})
},
_input: function(can) {
var ui = can.page.Append(can, can.ui.content.parentNode, [
{view: ["current", "input"], onkeydown: function(event) {
can.onkeymap.parse(event, can, "insert")
can.core.Timer(10, function() {
can.current.text(can.ui.current.value)
})
}, onblur: function(event) {
can.current.text(can.ui.current.value)
}, onfocus: function(event) {
can._output.scrollLeft += -1000
can.current.scroll(-1000, 0)
}, onclick: function(event) {
can.onkeymap._insert(can)
}},
{view: ["command", "input"], onkeydown: function(event) {
can.onkeymap.parse(event, can, "command")
}, onfocus: function(event) {
can._output.scrollLeft += -1000
can.current.scroll(-1000, 0)
}},
]); can.base.Copy(can.ui, ui, "current", "command")
},
_output: function(can) {
var ui = can.page.Appends(can, can.ui.display, [
{view: "action", list: [
{input: ["cmd", function(event) {
can.onkeymap.parse(event, can, "command")
}], value: "", onfocus: function(event) {
event.target.setSelectionRange(0, -1)
can.onkeymap._command(can)
}},
{button: ["run", function(event) {
can.onkeymap.command.Enter(event, can, can.ui.cmd.value)
}]},
{button: ["清空", function(event) {
can.onmotion.clear(can, ui.output)
} ]},
{button: ["关闭", function(event) {
can.onmotion.hidden(can, can.ui.display)
} ]},
]}, {view: "output"},
]); can.base.Copy(can.ui, ui, "output", "cmd")
can.ui.current = can.page.Append(can, can.ui.content.parentNode, [
{view: ["current", html.INPUT], onkeydown: function(event) { if (event.metaKey) { return }
can._keylist = can.onkeymap._parse(event, can, can.mode, can._keylist, can.ui.current)
can.mode != "command" && can.core.Timer(10, function() { can.current.text(can.ui.current.value) })
can.mode == "normal" && can.onkeymap.prevent(event)
}, onclick: function(event) { can.onkeymap._insert(event, can) }},
]).first
},
}, [""])
Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert"], _init: function(can, mode) {
can.core.List(can.onkeymap.list, function(item) { var engine = {}
can.core.Item(can.onkeymap[item], function(key, cb) { var map = engine
for (var i = key.length-1; i > -1; i--) {
map = map[key[i]] = i == 0? cb: (map[key[i]]||{})
}
}), can.onkeymap[item]._engine = engine
}), can.onkeymap._mode(can, mode||"normal")
Volcanos("onkeymap", {help: "键盘交互", list: [],
_model: function(can, value) { can.Status("模式", can.mode = value)
return can.page.Modify(can, can.ui.current, {className: "current"+ice.SP+can.mode}), value
},
_mode: function(can, value) { can.Status("模式", can.mode = value)
can.page.Modify(can, can.ui.current, {className: "current "+can.mode})
can.page.Modify(can, can.ui.command, {className: "command "+can.mode})
return value
_command: function(can) { can.onkeymap._model(can, "command")
can.ui.current.blur()
},
_command: function(can) { can.onkeymap._mode(can, "command")
if (can.ui.display.style.display == "none") {
can.page.Modify(can, can.ui.command, {style: {display: ""}})
can.ui.command.focus()
} else {
can.page.Modify(can, can.ui.display, {style: {display: "block"}})
can.ui.cmd.focus()
}
},
_normal: function(can) { can.onkeymap._mode(can, "normal")
_normal: function(can) { can.onkeymap._model(can, "normal")
can.ui.current.focus()
},
_insert: function(can) { can.onkeymap._mode(can, "insert")
can.ui.current.focus()
_insert: function(event, can) { can.onkeymap._model(can, "insert")
can.ui.current.focus(), can.onkeymap.prevent(event)
can.ui.content.scrollLeft -= 100
},
_remote: function(event, can, key, arg, cb) { can.request(event, {_toast: "执行中..."})
can.run(event, arg||["action", key, can.parse, can.Option("file"), can.Option("path")], cb||function(msg) {
can.onappend.table(can, msg, function(value, key, index) { return {text: [value, "td"]} }, can.ui.output)
can.onappend.board(can, msg.Result(), can.ui.output)
}, true)
},
_engine: {
e: function(event, can, line, ls) { can.onimport.tabview(can, can.Option("path"), ls[1]) },
p: function(event, can) { can.onaction["项目"](event, can) },
q: function(event, can) { can.onmotion.hidden(can, can.ui.display) },
w: function(event, can) { can.onaction.save(event, can) },
},
parse: function(event, can, mode) {
can.keylist.push(event.key); if (can.mode != mode) {
can.onkeypop.prevent(event)
}; can.mode == "normal" && can.Status("按键", can.keylist.join(""))
for (var pre = 0; pre < can.keylist.length; pre++) {
if ("0" <= can.keylist[pre] && can.keylist[pre] <= "9") { continue } break
}; can.count = parseInt(can.keylist.slice(0, pre).join(""))||1
function repeat(cb, count) {
for (var i = 1; i <= count; i++) { if (cb(event, can, count)) { break } }
can.keylist.length > 0 && (can.lastcmd = can.keylist), can.keylist = []
can.Status("按键", can.keylist.join(""))
}
var p = can.onsyntax[can.parse]
var cb = (p && p.keymap || can.onkeymap[can.mode])[event.key]; if (can.base.isFunc(cb)) {
return repeat(cb, can.count)
}
var map = can.onkeymap[can.mode]._engine; for (var i = can.keylist.length-1; i > pre-1; i--) {
var cb = map[can.keylist[i]]; if (can.base.isFunc(cb)) {
return repeat(cb, can.count)
}; if (can.base.isObject(cb)) { map = cb; continue }; break
}
},
command: {
Escape: function(event, can) { can.onkeymap._normal(can) },
Enter: function(event, can) { can.onmotion.hidden(can, can.ui.command)
can.page.Modify(can, can.ui.display, {style: {display: "block"}})
var line = can.ui.command.value || can.ui.cmd.value
can.ui.command.value = "", can.ui.cmd.value = line
can.onmotion.focus(can, can.ui.cmd)
can.onmotion.clear(can, can.ui.output)
var ls = can.core.Split(line+" ", " ", ",")
var cb = can.onkeymap._engine[ls[0]]; if (can.base.isFunc(cb)) {
can.onmotion.hidden(can, can.ui.display)
can.onkeymap._normal(can)
cb(event, can, line, ls)
} else {
can.onkeymap._remote(event, can, line, [ctx.ACTION, "engine"].concat(ls))
}
},
jk: function(event, can) { can.keylist = can.keylist.slice(0, -1)
can.onkeymap.command.Enter(event, can)
},
},
_mode: {
normal: {
":": function(event, can) {
can.onkeymap._command(can)
can.ui.command.value = ""
},
".": function(event, can) {
can.keylist = can.lastcmd
can.onkeymap.parse({key: ""}, can, "normal")
},
jk: function(event, can, target) { can.onkeymap._command(can) },
escape: function(event, can) { can.onkeymap._command(can) },
H: function(event, can) {
can.ui.current.setSelectionRange(0, 0)
},
h: function(event, can) {
can.ui.current.setSelectionRange(can.ui.current.selectionStart-1, can.ui.current.selectionStart-1)
},
l: function(event, can) {
can.ui.current.setSelectionRange(can.ui.current.selectionStart+1, can.ui.current.selectionStart+1)
},
L: function(event, can) {
can.ui.current.setSelectionRange(-1, -1)
},
j: function(event, can) {
can.onaction.selectLine(can, can.current.next())
},
k: function(event, can) {
can.onaction.selectLine(can, can.current.prev())
},
H: function(event, can, target) { can.onaction.cursorMove(can, target, 0, 0) },
h: function(event, can, target) { can.onaction.cursorMove(can, target, -1) },
l: function(event, can, target) { can.onaction.cursorMove(can, target, 1) },
L: function(event, can, target) { can.onaction.cursorMove(can, target, 0, -1) },
j: function(event, can) { can.onaction.selectLine(can, can.current.next()) },
k: function(event, can) { can.onaction.selectLine(can, can.current.prev()) },
gg: function(event, can, count) { count = count || 1
can.onaction.selectLine(can, count)
var pos = can.current.offset()-can.ui.current.offsetTop
can.current.scroll(0, -(pos+can.current.height()*5))
return true
},
G: function(event, can, count) { count = count > 1? count: can.max
can.onaction.selectLine(can, count)
var pos = can.current.offset()-can.ui.current.offsetTop
can.current.scroll(0, -(pos+can.current.height()*5))
return true
},
zt: function(event, can, count) { count = count || 2
var pos = can.current.offset()-can.ui.current.offsetTop
gg: function(event, can, target, count) { return can.onaction.selectLine(can, count||1), true },
G: function(event, can, target, count) { return can.onaction.selectLine(can, count = count > 1? count: can.max), true },
zt: function(event, can, target, count) { count = count||2
var pos = can.current.offset()-target.offsetTop
can.current.scroll(0, -(pos+can.current.height()*count))
return true
},
zz: function(event, can, count) { count = count || 5
var pos = can.current.offset()-can.ui.current.offsetTop
zz: function(event, can, target, count) { count = count||5
var pos = can.current.offset()-target.offsetTop
can.current.scroll(0, -(pos+can.current.height()*count))
return true
},
zb: function(event, can, count) { count = count || 3
var pos = can.current.offset()-can.ui.current.offsetTop
zb: function(event, can, target, count) { count = count||3
var pos = can.current.offset()-target.offsetTop
can.current.scroll(0, -(pos+can.current.window()-can.current.height()*count))
return true
},
i: function(event, can) { can.onkeymap._insert(can)
i: function(event, can) { can.onkeymap._insert(event, can) },
I: function(event, can, target) { can.onkeymap._insert(event, can)
can.onaction.cursorMove(can, target, 0, 0)
},
I: function(event, can) { can.onkeymap._insert(can)
can.ui.current.setSelectionRange(0, 0)
a: function(event, can, target) { can.onkeymap._insert(event, can)
can.onaction.cursorMove(can, target, 1)
},
a: function(event, can) { can.onkeymap._insert(can)
A: function(event, can, target) { can.onkeymap._insert(event, can)
can.onaction.cursorMove(can, target, 0, -1)
},
A: function(event, can) { can.onkeymap._insert(can)
can.ui.current.setSelectionRange(-1, -1)
o: function(event, can) { can.onkeymap._insert(event, can)
can.onaction.selectLine(can, can.onaction.insertLine(can, "", can.current.next()))
can.onkeymap._insert(event, can)
},
o: function(event, can) { can.onkeymap._insert(can)
can.onaction.selectLine(can, can.onkeymap.insertLine(can, "", can.current.next()))
},
O: function(event, can) { can.onkeymap._insert(can)
can.onaction.selectLine(can, can.onkeymap.insertLine(can, "", can.current.line))
O: function(event, can) { can.onkeymap._insert(event, can)
can.onaction.selectLine(can, can.onaction.insertLine(can, "", can.current.line))
can.onkeymap._insert(event, can)
},
yy: function(event, can) { can.last = can.current.text() },
dd: function(event, can) { can.last = can.current.text()
yy: function(event, can) { can._last_text = can.current.text() },
dd: function(event, can) { can._last_text = can.current.text()
var next = can.current.next()
can.onkeymap.deleteLine(can, can.current.line)
can.onaction.deleteLine(can, can.current.line)
can.onaction.selectLine(can, next)
},
p: function(event, can) {
can.onkeymap.insertLine(can, can.last, can.current.next())
can.onaction.insertLine(can, can._last_text, can.current.next())
},
P: function(event, can) {
can.onkeymap.insertLine(can, can.last, can.current.line)
can.onaction.insertLine(can, can._last_text, can.current.line)
},
},
insert: {
Escape: function(event, can) { can.onkeymap._normal(can)
can.onaction.modifyLine(can, can.current, can.ui.current.value)
can.onkeypop.prevent(event)
jk: function(event, can, target) { can.onkeymap._normal(can)
can.onkeymap.DelText(target, target.selectionStart-1, 1)
},
Enter: function(event, can) {
var before = can.ui.current.value.slice(0, event.target.selectionEnd)
var left = can.ui.current.value.slice(event.target.selectionEnd)
can.current.text(before||"")
can.onaction.selectLine(can, can.onkeymap.insertLine(can, left, can.current.next()))
can.ui.current && can.ui.current.setSelectionRange(0, 0)
escape: function(event, can) { can.onkeymap._normal(can) },
enter: function(event, can, target) {
var left = target.value.slice(event.target.selectionEnd)
can.current.text(target.value.slice(0, event.target.selectionEnd)||"")
can.onaction.selectLine(can, can.onaction.insertLine(can, left, can.current.next()))
},
Backspace: function(event, can) {
if (can.ui.current.selectionStart > 0) { return }
can.onkeypop.prevent(event)
backspace: function(event, can, target) {
if (target.selectionStart > 0) { return }
can.onkeymap.prevent(event)
if (!can.current.prev()) { return }
var rest = can.current.text()
can.onaction.selectLine(can, can.current.prev())
can.onaction.deleteLine(can, can.current.next())
var pos = can.current.text().length
rest = can.current.text()+rest
can.ui.current.value = rest
can.current.text(rest)
can.ui.current.setSelectionRange(pos, pos)
can.onkeymap.deleteLine(can, can.current.next())
can.ui.current.value = can.current.text()+rest
can.onaction.cursorMove(can, can.ui.current, 0, pos)
},
ArrowDown: function(event, can) {
arrowdown: function(event, can) {
can.onaction.selectLine(can, can.current.next())
can.ui.current.setSelectionRange(can.ui.current.selectionStart, can.ui.current.selectionEnd)
},
ArrowUp: function(event, can) {
arrowup: function(event, can) {
can.onaction.selectLine(can, can.current.prev())
can.ui.current.setSelectionRange(can.ui.current.selectionStart, can.ui.current.selectionEnd)
},
jk: function(event, can) {
can.onkeypop.DelText(can.ui.current, can.ui.current.selectionStart-1, 1)
can.onkeymap.insert.Escape(event, can)
},
}, _engine: {},
})
Volcanos("onaction", {help: "控件交互", list: [nfs.SAVE],
save: function(event, can) { var msg = can.request(event, {content: can.onexport.content(can)})
can.run(event, [ctx.ACTION, nfs.SAVE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) {
can.user.toastSuccess(can)
}, true)
},
selectLine: function(can) { var line = can.current.line
can.page.Select(can, can.current.line, "td.text", function(item) { line = item })
can.page.Modify(can, can.ui.current, {className: "current "+can.mode, value: can.current.text(), style: {
left: line.offsetLeft, top: line.offsetTop-can.current.offset()-2,
height: line.offsetHeight, width: line.offsetWidth
}})
// can.ui.current.focus()
can.ui.current.setSelectionRange(event.offsetX/13, event.offsetX/13)
can.page.Modify(can, can.ui.command, {className: "command "+can.mode})
_selectLine: function(event, can) {
can.page.Select(can, can.current.line, "td.text", function(td) { can.current.line.appendChild(can.ui.current)
can.page.Modify(can, can.ui.current, {style: kit.Dict(html.LEFT, td.offsetLeft-1, html.WIDTH,td.offsetWidth-12), value: td.innerText})
can.ui.current.focus(), can.onaction.cursorMove(can, can.ui.current, 0, (event.offsetX)/13-1)
can.ui.content.scrollLeft -= td.offsetLeft
})
},
insertLine: function(can, value, before) {
var line = can.onaction.appendLine(can, value)
@ -295,17 +148,9 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert"
can.page.Remove(can, line)
can.onaction.rerankLine(can)
},
})
Volcanos("onaction", {help: "控件交互", list: ["run"],
save: function(event, can) { var msg = can.request(event, {content: can.onexport.content(can)})
can.run(event, [ctx.ACTION, "save", can.parse, can.Option("file"), can.Option("path")], function(msg) {
can.user.toastSuccess(can)
}, true)
},
modifyLine: function(can, line, value) {
can.page.Select(can, can.ui.content, html.TR, function(item, index) {
if (item != line && index+1 != line) { return }
can.page.Select(can, item, "td.text", function(item) {
can.page.Appends(can, item, [can.onsyntax._parse(can, value)])
})
@ -318,6 +163,10 @@ Volcanos("onaction", {help: "控件交互", list: ["run"],
})
})
},
cursorMove: function(can, target, count, begin) {
begin != undefined && target.setSelectionRange(begin, begin)
target.setSelectionRange(target.selectionStart+count, target.selectionStart+count)
},
})
Volcanos("onexport", {help: "导出数据", list: ["文件数", "模式", "按键", "解析器", "文件名", "当前行", "跳转数"]})

View File

@ -1,7 +1,7 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onmotion.clear(can), can.onmotion.hidden(can, can._action)
can.onimport._show(can, msg), can.base.isFunc(cb) && cb(msg)
can.keylist = [], can.onkeypop._build(can)
can.keylist = [], can.onkeymap._build(can)
},
_show: function(can, msg) { can.point = []
can.svg = null, can.group = null, can.temp = null, can.current = null
@ -215,7 +215,7 @@ Volcanos("onfigure", {help: "图形绘制", list: [],
show: function(can, target, figure) { return "<("+(target.Val("y2")-target.Val("y1"))+ice.FS+(target.Val("x2")-target.Val("x1"))+")"+can.onexport._position(can, target, figure) },
},
}, [])
Volcanos("onkeypop", {help: "键盘交互", list: [],
Volcanos("onkeymap", {help: "键盘交互", list: [],
_mode: {
normal: {
gr: function(event, can) { can.Action("go", "run") },

View File

@ -75,7 +75,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
can.page.Modify(can, target, {width: can.Conf(html.WIDTH)-200})
},
}, [""])
Volcanos("onkeypop", {help: "键盘交互", list: [],
Volcanos("onkeymap", {help: "键盘交互", list: [],
_mode: {
normal: {
"n": function(event, can) { can.ondetail.next(can.sub) },
@ -111,8 +111,8 @@ Volcanos("onaction", {help: "控件交互", list: [],
], sub._action, can.ondetail)
can.onengine.signal(can, "keymap.focus", can.request(event, {cb: function(event) {
can.keylist = can.onkeypop._parse(event, can, "normal", can.keylist)
}})), can.onkeypop._build(can)
can.keylist = can.onkeymap._parse(event, can, "normal", can.keylist)
}})), can.onkeymap._build(can)
sub.page.style(sub, sub._target, html.BACKGROUND, document.body.style.background)
sub.page.style(sub, sub._output, html.HEIGHT, window.innerHeight-4*html.PLUGIN_MARGIN-2*html.ACTION_HEIGHT)

View File

@ -180,7 +180,7 @@ Volcanos("onaction", {help: "交互操作", list: [
listTags: function(event, can, button) { var list = []
can.core.List([can.base, can.core, can.misc, can.page, can.user,
can.onengine, can.ondaemon, can.onappend, can.onlayout, can.onmotion, can.onkeypop,
can.onengine, can.ondaemon, can.onappend, can.onlayout, can.onmotion, can.onkeymap,
], function(lib) {
can.core.Item(lib, function(key, value) { if (key.indexOf("_") == 0 || !lib.hasOwnProperty(key)) { return }
list.push({zone: lib._name, type: typeof value, name: key, text: can.base.isObject(value)? "": (value+"").split(ice.NL)[0],

View File

@ -132,7 +132,7 @@ Volcanos("ondetail", {help: "用户交互", list: [],
{x: tree.x-can.margin/4, y: y-can.size/2},
{x: tree.x+tree.width+can.margin/8, y: y+can.size/2},
], style: {stroke: cli.RED, fill: html.NONE},
}), can.onkeypop.prevent(event)
}), can.onkeymap.prevent(event)
},
onclick: function(event, can, tree) {
if (tree.list.length > 0 || tree.tags || tree.name.endsWith(can._args.split)) {

View File

@ -127,7 +127,7 @@ var wiki = {
H3: "h3.story",
DIV_PAGE: "div.page",
}
var chat = {
var chat = {ONIMPORT: "onimport", ONACTION: "onaction", ONKEYMAP: "onkeymap", ONEXPORT: "onexport",
LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", OUTPUT: "output", INPUT: "input", UPLOAD: "upload",
STORY: "story", FLOAT: "float", CONTEXTS: "contexts", CARTE: "carte", TOAST: "toast",
LEGNED: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status",