mirror of
https://shylinux.com/x/volcanos
synced 2025-04-25 16:58:06 +08:00
opt vimer.js
This commit is contained in:
parent
7692d4069f
commit
0d60be84d0
46
frame.js
46
frame.js
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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"]},
|
||||
|
@ -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: {
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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)
|
||||
},
|
||||
})
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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()])
|
||||
|
@ -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; */
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
_mode: {
|
||||
normal: {
|
||||
jk: function(event, can, target) { can.onkeymap._command(can) },
|
||||
escape: function(event, can) { can.onkeymap._command(can) },
|
||||
|
||||
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, 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, 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, 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(event, can) },
|
||||
I: function(event, can, target) { can.onkeymap._insert(event, can)
|
||||
can.onaction.cursorMove(can, target, 0, 0)
|
||||
},
|
||||
a: function(event, can, target) { can.onkeymap._insert(event, can)
|
||||
can.onaction.cursorMove(can, target, 1)
|
||||
},
|
||||
A: function(event, can, target) { can.onkeymap._insert(event, can)
|
||||
can.onaction.cursorMove(can, target, 0, -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(event, can)
|
||||
can.onaction.selectLine(can, can.onaction.insertLine(can, "", can.current.line))
|
||||
can.onkeymap._insert(event, can)
|
||||
},
|
||||
|
||||
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.onaction.deleteLine(can, can.current.line)
|
||||
can.onaction.selectLine(can, next)
|
||||
},
|
||||
p: function(event, can) {
|
||||
can.onaction.insertLine(can, can._last_text, can.current.next())
|
||||
},
|
||||
P: function(event, can) {
|
||||
can.onaction.insertLine(can, can._last_text, can.current.line)
|
||||
},
|
||||
},
|
||||
insert: {
|
||||
jk: function(event, can, target) { can.onkeymap._normal(can)
|
||||
can.onkeymap.DelText(target, target.selectionStart-1, 1)
|
||||
},
|
||||
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, 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
|
||||
|
||||
can.ui.current.value = can.current.text()+rest
|
||||
can.onaction.cursorMove(can, can.ui.current, 0, pos)
|
||||
},
|
||||
arrowdown: function(event, can) {
|
||||
can.onaction.selectLine(can, can.current.next())
|
||||
},
|
||||
arrowup: function(event, can) {
|
||||
can.onaction.selectLine(can, can.current.prev())
|
||||
},
|
||||
},
|
||||
}, _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)
|
||||
},
|
||||
_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)
|
||||
},
|
||||
},
|
||||
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")
|
||||
},
|
||||
|
||||
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())
|
||||
},
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
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(can)
|
||||
can.ui.current.setSelectionRange(0, 0)
|
||||
},
|
||||
a: function(event, can) { can.onkeymap._insert(can)
|
||||
},
|
||||
A: function(event, can) { can.onkeymap._insert(can)
|
||||
can.ui.current.setSelectionRange(-1, -1)
|
||||
},
|
||||
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))
|
||||
},
|
||||
|
||||
yy: function(event, can) { can.last = can.current.text() },
|
||||
dd: function(event, can) { can.last = can.current.text()
|
||||
var next = can.current.next()
|
||||
can.onkeymap.deleteLine(can, can.current.line)
|
||||
can.onaction.selectLine(can, next)
|
||||
},
|
||||
p: function(event, can) {
|
||||
can.onkeymap.insertLine(can, can.last, can.current.next())
|
||||
},
|
||||
P: function(event, can) {
|
||||
can.onkeymap.insertLine(can, can.last, 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)
|
||||
},
|
||||
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)
|
||||
},
|
||||
Backspace: function(event, can) {
|
||||
if (can.ui.current.selectionStart > 0) { return }
|
||||
can.onkeypop.prevent(event)
|
||||
if (!can.current.prev()) { return }
|
||||
|
||||
var rest = can.current.text()
|
||||
can.onaction.selectLine(can, can.current.prev())
|
||||
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())
|
||||
},
|
||||
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) {
|
||||
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)
|
||||
},
|
||||
},
|
||||
|
||||
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: ["文件数", "模式", "按键", "解析器", "文件名", "当前行", "跳转数"]})
|
||||
|
||||
|
@ -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") },
|
||||
|
@ -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)
|
||||
|
@ -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],
|
||||
|
@ -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)) {
|
||||
|
2
proto.js
2
proto.js
@ -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",
|
||||
|
Loading…
x
Reference in New Issue
Block a user