From 0d60be84d0fab2f7baf875a22dde226d47265e1d Mon Sep 17 00:00:00 2001 From: harveyshao Date: Tue, 18 Jan 2022 17:57:51 +0800 Subject: [PATCH] opt vimer.js --- frame.js | 46 ++-- lib/page.js | 2 +- lib/user.js | 6 +- page/index.js | 2 +- panel/action.js | 8 +- panel/footer.js | 2 +- panel/header.js | 2 +- panel/search.js | 4 +- plugin/input.js | 6 +- plugin/input/key.js | 2 +- plugin/local/code/inner.css | 17 +- plugin/local/code/inner.js | 59 +++--- plugin/local/code/vimer.css | 51 +---- plugin/local/code/vimer.js | 411 ++++++++++++------------------------ plugin/local/wiki/draw.js | 4 +- plugin/local/wiki/word.js | 6 +- plugin/state.js | 2 +- plugin/story/spide.js | 2 +- proto.js | 2 +- 19 files changed, 220 insertions(+), 414 deletions(-) diff --git a/frame.js b/frame.js index 6e9458b5..02d0112c 100644 --- a/frame.js +++ b/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) diff --git a/lib/page.js b/lib/page.js index 0db4c7cf..e52e9e9b 100644 --- a/lib/page.js +++ b/lib/page.js @@ -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 } diff --git a/lib/user.js b/lib/user.js index 7e759d61..3a59ef01 100644 --- a/lib/user.js +++ b/lib/user.js @@ -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) diff --git a/page/index.js b/page/index.js index d7f66b05..5df9c076 100644 --- a/page/index.js +++ b/page/index.js @@ -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"]}, diff --git a/panel/action.js b/panel/action.js index 4fbec2db..8b766eb5 100644 --- a/panel/action.js +++ b/panel/action.js @@ -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: { diff --git a/panel/footer.js b/panel/footer.js index b5fcb1c4..e33003b0 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -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 diff --git a/panel/header.js b/panel/header.js index 58d1c135..8669e0a4 100644 --- a/panel/header.js +++ b/panel/header.js @@ -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 diff --git a/panel/search.js b/panel/search.js index 1f804ce9..66d57e74 100644 --- a/panel/search.js +++ b/panel/search.js @@ -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) } diff --git a/plugin/input.js b/plugin/input.js index cd7e5730..c67f8cbf 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -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) }, }) diff --git a/plugin/input/key.js b/plugin/input/key.js index d22d1858..32ab8cbd 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -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) diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 4522136b..b3df26ff 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -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; diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 2c27f9ff..b4eb8178 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -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()]) diff --git a/plugin/local/code/vimer.css b/plugin/local/code/vimer.css index fe64529a..18a0d583 100644 --- a/plugin/local/code/vimer.css +++ b/plugin/local/code/vimer.css @@ -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; */ -} - diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 30779408..0fb2179f 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -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: ["文件数", "模式", "按键", "解析器", "文件名", "当前行", "跳转数"]}) diff --git a/plugin/local/wiki/draw.js b/plugin/local/wiki/draw.js index ee6d40d3..e1ed80f6 100644 --- a/plugin/local/wiki/draw.js +++ b/plugin/local/wiki/draw.js @@ -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") }, diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index ebf38117..9ce5623a 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -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) diff --git a/plugin/state.js b/plugin/state.js index 1f338153..e27737f9 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -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], diff --git a/plugin/story/spide.js b/plugin/story/spide.js index d7b51b4d..3e05f2a1 100644 --- a/plugin/story/spide.js +++ b/plugin/story/spide.js @@ -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)) { diff --git a/proto.js b/proto.js index 29b8d70f..1d1a86c8 100644 --- a/proto.js +++ b/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",