From e2c81e458bc7128ec37eb248b514115512cd912f Mon Sep 17 00:00:00 2001 From: harveyshao Date: Wed, 19 Jan 2022 17:33:36 +0800 Subject: [PATCH] opt vimer.js --- frame.js | 162 ++++++++++++++---------------------- lib/user.js | 5 +- panel/action.js | 6 +- plugin/input/key.js | 5 +- plugin/local/code/inner.css | 2 +- plugin/local/code/inner.js | 50 ++++++----- plugin/local/code/vimer.js | 113 ++++++++++++------------- proto.js | 1 + 8 files changed, 152 insertions(+), 192 deletions(-) diff --git a/frame.js b/frame.js index 9ba04607..d9f5f56a 100644 --- a/frame.js +++ b/frame.js @@ -338,7 +338,9 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, var input = can.page.input(can, item, value) var br = input.type == html.TEXTAREA? [{type: html.BR, style: {clear: html.BOTH}}]: [] var title = can.Conf([ctx.FEATURE, chat.TITLE, item.name].join(ice.PT))||""; title && (input.title = title) - return can.page.Append(can, target, ([{view: style||can.base.join([html.ITEM, item.type]), list: [input]}]).concat(br))[item.name] + return can.page.Append(can, target, ([{view: style||can.base.join([html.ITEM, item.type]), onkeydown: function(event) { + item.type == "text" && can.onkeymap.input(event, can) + }, list: [input]}]).concat(br))[item.name] }, table: function(can, msg, cb, target, sort) { var table = can.page.AppendTable(can, msg, target||can._output, msg.append, cb||function(value, key, index, line, array) { @@ -650,6 +652,9 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe if (pos) { item.scrollTo(0, pos-1); return item } }).length > 0 }, + delay: function(can, cb) { + can.core.Timer(10, cb) + }, hidden: function(can, target, show) { can.page.Modify(can, target||can._target, {style: {display: show? "": html.NONE}}) @@ -806,9 +811,9 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe var total = select(target._index) select(target._index = (target._index-1) < 0? total-1: (target._index-1)) break - default: target._index = 0, target._value = "" + default: target._index = 0, target._value = ""; return } - return + return can.onkeymap.prevent(event) } target._index = 0, target._value = "" @@ -826,140 +831,95 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe }, }) 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") - return - } - if (event.metaKey) { return } - 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.onkeymap._parse(event, can, msg.Option("model"), can._keylist||[], can._output) + can.onkeymap._build(can), document.body.onkeydown = function(event) { if (event.metaKey) { return } + if (event.target.tagName == "SELECT" || event.target.tagName == "INPUT" || event.target.tagName == "TEXTAREA") { return } + var msg = can.request(event, {"model": "normal"}); 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.onkeymap._parse(event, can, msg.Option("model"), can._keylist, can._output) } }, _build: function(can) { - can.core.Item(can.onkeymap._mode, function(item, value) { var engine = {} + can.core.Item(can.onkeymap._mode, function(item, value) { var engine = {list: {}} 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]]||{}) + for (var i = 0; i < key.length; i++) { + if (!map.list[key[i]]) { map.list[key[i]] = {list: {}} } + map = map.list[key[i]]; if (i == key.length-1) { map.cb = cb } } }), can.onkeymap._engine[item] = engine }) }, - _parse: function(event, can, mode, list, target) { list = list||[], list.push(event.key) - for (var pre = 0; pre < list.length; pre++) { + _parse: function(event, can, mode, list, target) { list = list||[] + if (["Control", "Shift"].indexOf(event.key) > -1) { return list } + list.push(event.key); for (var pre = 0; pre < list.length; pre++) { if ("0" <= list[pre] && list[pre] <= "9") { continue } break }; var count = parseInt(list.slice(0, pre).join(""))||1 - function repeat(cb, count) { list = [] - for (var i = 1; i <= count; i++) { if (cb(event, can, target, count)) { break } } - // can.onkeymap.prevent(event) - } 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.onkeymap._mode[mode] - var cb = map && map[event.key]; if (can.base.isFunc(cb) && event.key.length > 1) { - repeat(cb, count); return list - } + function repeat(cb, count) { list = []; for (var i = 1; i <= count; i++) { if (cb(event, can, target, count)) { break } } } + var cb = map && map[event.key]; if (can.base.isFunc(cb) && event.key.length > 1) { repeat(cb, count); return list } + var cb = map && map[event.key.toLowerCase()]; if (can.base.isFunc(cb) && event.key.length > 1) { repeat(cb, count); return list } - - 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 - case lang.STRING: - default: return list - } + can.misc.Log("keys", count, list) + var map = can.onkeymap._engine[mode]; if (!map) { return [] } + for (var i = pre; i < list.length; i++ ) { + var map = map.list[list[i]]; if (!map) { return [] } + if (i == list.length-1 && can.base.isFunc(map.cb)) { repeat(map.cb, count); return [] } } return list }, _mode: { insert: { - escape: function(event, can, target) { - target.blur() - }, - jk: function(event, can, target) { - can.onkeymap.DelText(target, target.selectionStart-1, target.selectionStart) - target.blur() - }, - enter: function(event, can, target) { - var his = target._history || [] - his.push(target.value) - if (event.target.tagName == "INPUT") { - can.onmotion.focus(can, target) - } - - target._current = his.length - target._history = his + jk: function(event, can, target) { target.blur(), can.onkeymap.deleteText(target, target.selectionStart-1, target.selectionStart) }, + Escape: function(event, can, target) { target.blur() }, + Enter: function(event, can, target) { + var his = target._history||[]; his.push(target.value) + event.target.tagName == "INPUT" && can.onmotion.focus(can, target) + target._history = his, target._current = his.length }, }, insert_ctrl: { p: function(event, can, target) { - var his = target._history||[] - var pos = target._current||0 - - pos = --pos % (his.length+1) - if (pos < 0) { pos = his.length} - target.value = his[pos]||"" - can.misc.Log(pos, his) - - target._current = pos + var his = target._history||[], pos = target._current||0 + pos = --pos % (his.length+1); if (pos < 0) { pos = his.length } + target._current = pos, target.value = his[pos]||"" }, n: function(event, can, target) { - var his = target._history||[] - var pos = target._current||0 - + var his = target._history||[], pos = target._current||0 pos = ++pos % (his.length+1) - target.value = his[pos]||"" - can.misc.Log(pos, his) - - target._current = pos + target._current = pos, target.value = his[pos]||"" }, - u: function(event, can, target) { - can.onkeymap.DelText(target, 0, target.selectionEnd) - }, - k: function(event, can, target) { - can.onkeymap.DelText(target, target.selectionStart) - }, - h: function(event, can, target) { - can.onkeymap.DelText(target, target.selectionStart-1, target.selectionStart) - }, - d: function(event, can, target) { - can.onkeymap.DelText(target, 0, target.selectionStart) - }, - w: function(event, can, target) { - var start = target.selectionStart-2 - var end = target.selectionEnd-1 + u: function(event, can, target) { can.onkeymap.deleteText(target, 0, target.selectionEnd) }, + k: function(event, can, target) { can.onkeymap.deleteText(target, target.selectionStart) }, + h: function(event, can, target) { can.onkeymap.deleteText(target, target.selectionStart-1, 1) }, + d: function(event, can, target) { can.onkeymap.deleteText(target, 0, target.selectionStart) }, + w: function(event, can, target) { var start = target.selectionStart-2, end = target.selectionEnd-1 for (var i = start; i >= 0; i--) { - if (target.value[end] == " " && target.value[i] != " ") { - break - } - if (target.value[end] != " " && target.value[i] == " ") { - break - } - } - can.onkeymap.DelText(target, i+1, end-i) + if (target.value[end] == ice.SP && target.value[i] != ice.SP) { break } + if (target.value[end] != ice.SP && target.value[i] == ice.SP) { break } + } can.onkeymap.deleteText(target, i+1, end-i) }, }, }, _engine: {}, - input: function(event, can) { var target = event.target - 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) } + input: function(event, can) { if (event.metakey) { return } var target = event.target + target._keys = can.onkeymap._parse(event, can, event.ctrlKey? "insert_ctrl": mdb.INSERT, target._keys, target) }, - DelText: function(target, start, count) { var end = count? start+count: target.value.length + prevent: function(event) { event.stopPropagation(), event.preventDefault() }, + deleteText: function(target, start, count) { var end = count? start+count: target.value.length var cut = target.value.slice(start, end) target.value = target.value.substring(0, start)+target.value.substring(end, target.value.length) - target.setSelectionRange(start, start) - return cut + return target.setSelectionRange(start, start), cut + }, + insertText: function(target, text) { var start = target.selectionStart + var before = target.value.slice(0, target.selectionStart) + var after = target.value.slice(target.selectionEnd) + target.value = before+text+after + return target.setSelectionRange(start+1, start+1) + }, + cursorMove: function(can, target, count, begin) { begin != undefined && target.setSelectionRange(begin, begin) + target.setSelectionRange(target.selectionStart+count, target.selectionStart+count) }, - prevent: function(event) { - event.stopPropagation(), event.preventDefault() - } }) _can_name = "" diff --git a/lib/user.js b/lib/user.js index 3a59ef01..34bff8f1 100644 --- a/lib/user.js +++ b/lib/user.js @@ -77,8 +77,11 @@ Volcanos("user", {help: "用户操作", agent: { "label": "标签", "exec": "执行", }[text]||text }, + toastProcess: function(can, title) { + return can.user.toast(can, ice.PROCESS, title) + }, toastSuccess: function(can, title) { - can.user.toast(can, ice.SUCCESS, title) + return can.user.toast(can, ice.SUCCESS, title) }, toast: function(can, content, title, duration, progress) { var meta = can.base.isObject(content)? content: {content: content, title: title||can._help, duration: duration, progress: progress} diff --git a/panel/action.js b/panel/action.js index 8b766eb5..2a25c754 100644 --- a/panel/action.js +++ b/panel/action.js @@ -15,7 +15,11 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) }, _plugin: function(can, river, storm, sub, meta) { sub._target._meta = meta sub.run = function(event, cmds, cb) { var msg = sub.request(event) - return can.run(event, can.misc.concat(can, [river, storm, meta.id||meta.index], cmds), cb) + if (msg.Option("_toast")) { var toast = can.user.toast(can, msg.Option("_toast"), "", -1) } + return can.run(event, can.misc.concat(can, [river, storm, meta.id||meta.index], cmds), function(msg) { + toast && toast.close(), can.base.isFunc(cb) && cb(msg) + }) + }, can._plugins = can.misc.concat(can, can._plugins, [sub]) meta.id && (sub._option.dataset = sub._option.dataset||{}, sub._option.dataset.id = meta.id) diff --git a/plugin/input/key.js b/plugin/input/key.js index 32ab8cbd..0656bbdc 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -21,6 +21,7 @@ Volcanos("onfigure", {help: "控件详情", list: [], key: { onfocus: function(event, can, meta, cb, target) { if (target._figure) { return } target._figure = {}; cb(function(can, cbs) { target._figure = can.onlayout.figure(event, can, can._target, false, {top: can.page.offsetTop(target)+target.offsetHeight, left: can.page.offsetLeft(target)}) can.onfigure.key._show(can, meta, cbs, target) + can.onmotion.focus(can, target) }) }, onblur: function(event, can, meta, cb, target) { delete(target._figure), target._can && target._can.close() }, onclick: function(event, can, meta, cb, target) { if (target._figure) { target._figure = can.onlayout.figure(event, can, can.core.Value(target, "_can._target")||{}); return } target._figure = {}; cb(function(can, cbs) { @@ -37,10 +38,6 @@ Volcanos("onfigure", {help: "控件详情", list: [], key: { }) }) } - - if (event.ctrlKey && ["n", "p"].indexOf(event.key) > -1) { - 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 b3df26ff..db877964 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -87,7 +87,7 @@ fieldset.inner>div.output div.profile>div.output { clear:both; overflow:auto; } fieldset.inner>div.output div.display>div.output { - clear:both; + clear:both; overflow:auto; } fieldset.inner>div.output div.display { border:solid 1px greenyellow; diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 33235353..c3417a9b 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -11,7 +11,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE)) can.onimport.project(can, can.Option(nfs.PATH), function() { can.onimport._toolkit(can, can.ui.toolkit), can.onimport._session(can, msg), can.onimport._keydown(can) - can.core.Timer(10, function() { + can.onmotion.delay(can, function() { can.onmotion.toggle(can, can.ui.project), can.onimport.layout(can) can.onmotion.toggle(can, can.ui.project), can.onimport.layout(can) }) @@ -27,7 +27,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target cli.CLEAR, function(event) { can.onmotion.clear(can, ui.output) }, cli.CLOSE, function(event) { can.onmotion.hidden(can, target), can.onimport.layout(can) }, mdb.PLUGIN, function(event) { - can.user.input(event, can, [ctx.INDEX], function(event, button, data, list, args) { + can.user.input(event, can, [ctx.INDEX], function(event, button, data) { can.onimport.plugin(can, data, ui.output) }) }, @@ -35,13 +35,13 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target target._toggle = function(event, show) { action[show? cli.SHOW: cli.CLOSE](event) } }, _display: function(can, target) { - var ui = can.page.Append(can, target, [{view: html.ACTION}, {view: html.OUTPUT}]); can.ui.display_output = ui.output + var ui = can.page.Append(can, target, [{view: html.ACTION}, {view: html.OUTPUT}, {}]); can.ui.display_output = ui.output var action = can.onappend._action(can, [cli.EXEC, cli.CLEAR, mdb.PLUGIN, cli.CLOSE], ui.action, kit.Dict( cli.EXEC, function(event) { can.onaction["执行"](event, can) }, cli.CLEAR, function(event) { can.onmotion.clear(can, ui.output) }, cli.CLOSE, function(event) { can.onmotion.hidden(can, target), can.onimport.layout(can) }, mdb.PLUGIN, function(event) { - can.user.input(event, can, [ctx.INDEX], function(event, button, data, list, args) { + can.user.input(event, can, [ctx.INDEX], function(event, button, data) { can.onimport.plugin(can, data, ui.output) }) }, @@ -58,7 +58,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target }) }) }, _keydown: function(can) { can.onkeymap._build(can) can.user.mod.isCmd && can.onengine.listen(can, chat.ONKEYDOWN, function(event) { - can._key_list = can.onkeymap._parse(event, can, "command", can._key_list, can.ui.content) + can._key_list = can.onkeymap._parse(event, can, "plugin", can._key_list, can.ui.content) }) }, @@ -168,7 +168,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], 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") + can.parse = can.base.Ext(can.file), can.Status("模式", "plugin") 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}}) @@ -184,7 +184,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], if (msg.Option(ctx.INDEX)) { can.onimport.plugin(can, {index: msg.Option(ctx.INDEX)}, can.ui.content, function(sub) { - can.core.Timer(10, function() { + can.onmotion.delay(can, function() { can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]) }), can.base.isFunc(cb) && cb() }) @@ -231,9 +231,12 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], }) Volcanos("onkeymap", {help: "导入数据", _init: function(can, msg, cb, target) { }, + _plugin: function(event, can) {}, + _normal: function(event, can) {}, + _insert: function(event, can) {}, _mode: { - command: { - escape: function(event, can) { can.onaction["清屏"](event, can) }, + plugin: { + 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) }, @@ -251,34 +254,35 @@ Volcanos("onkeymap", {help: "导入数据", _init: function(can, msg, cb, target 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) }, + n: function(event, can) { can.onkeymap._normal(event, can) }, + ":": function(event, can) { can.onimport.toolkit(can, {index: "cli.system"}, function(sub) { can.toolkit["cli.system"] = sub.select() }) }, }, }, _engine: {}, }) -Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加", "插件", "扩展", "保存"], +Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加", "插件", "扩展"], "搜索": function(event, can) { - can.user.input(event, can, [mdb.NAME, [ctx.ACTION, nfs.TAGS, nfs.GREP, cli.MAKE]], function(event, button, data, list, args) { + can.user.input(event, can, [mdb.NAME, [ctx.ACTION, nfs.TAGS, nfs.GREP, cli.MAKE]], function(event, button, data) { can.ui.search.Update({}, [ctx.ACTION, data.action, data.name]) }) }, "打开": function(event, can) { - can.user.input(event, can, [nfs.FILE], function(event, button, data, list, args) { + can.user.input(event, can, [nfs.FILE], function(event, button, data) { can.onimport.tabview(can, can.Option(nfs.PATH), data.file) }) }, "添加": function(event, can) { - can.user.input(event, can, [ctx.INDEX], function(event, button, data, list, args) { + can.user.input(event, can, [ctx.INDEX], function(event, button, data) { can.onimport.tabview(can, can.Option(nfs.PATH), data.index, ctx.INDEX) }) }, "插件": function(event, can) { - can.user.input(event, can, [ctx.INDEX], function(event, button, data, list, args) { + can.user.input(event, can, [ctx.INDEX], function(event, button, data) { var sub = can.toolkit[data.index]; if (sub) { sub.select(); return } can.onimport.toolkit(can, data, function(sub) { can.toolkit[data.index] = sub.select() }) }) }, "扩展": function(event, can) { - can.user.input(event, can, ["url"], function(event, button, data, list, args) { + can.user.input(event, can, ["url"], function(event, button, data) { var sub = can.extentions[data.url]; if (sub) { sub.select(); return } can.onimport.exts(can, data.url, function(sub) { can.extentions[data.url] = sub.select() }) }) @@ -292,6 +296,7 @@ Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加", }, true) }, "执行": function(event, can) { can.onimport.display(can) + can.request(event, {_toast: "执行中..."}) can.run(event, [ctx.ACTION, mdb.ENGINE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.display(can, msg) }, true) @@ -312,6 +317,8 @@ Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加", can.onmotion.hidden(can, can.ui.profile) } else if (can.ui.display.style.display == "") { can.onmotion.hidden(can, can.ui.display) + } else if (can.ui.project.style.display == "") { + can.onmotion.hidden(can, can.ui.project) } else { can.onaction["全屏"](event, can) } @@ -366,10 +373,10 @@ Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加", can.base.isObject(line) && can.page.Select(can, line, "td.text", function(item) { can.current = { + window: function() { return can.ui.content.offsetHeight/can.current.line.offsetHeight }, scroll: function(count) { if (count) { can.ui.content.scrollTop += count*can.current.line.offsetHeight } return (can.current.line.offsetTop-can.ui.content.scrollTop)/can.current.line.offsetHeight }, - window: function() { return can.ui.content.offsetHeight/can.current.line.offsetHeight }, prev: function() { return line.previousSibling }, next: function() { return line.nextSibling }, @@ -394,15 +401,14 @@ Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加", can.onaction._selectLine(event, can) }) }, - _selectLine: function(event, 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()]) }, favorLine: function(can, value) { - can.user.input(event, can, [{name: "zone", value: "hi"}, {name: "name", value: "hello"}], function(event, button, meta, list) { - can.run(event, [ctx.ACTION, code.FAVOR, ctx.ACTION, mdb.INSERT, mdb.ZONE, meta.zone||"", - mdb.TYPE, can.parse, mdb.NAME, meta.name||"", mdb.TEXT, (value||"").trimRight(), + can.user.input(event, can, [{name: "zone", value: "hi"}, {name: "name", value: "hello"}], function(event, button, data) { + can.run(event, [ctx.ACTION, code.FAVOR, ctx.ACTION, mdb.INSERT, mdb.ZONE, data.zone||"", + mdb.TYPE, can.parse, mdb.NAME, data.name||"", mdb.TEXT, (value||"").trimRight(), nfs.PATH, can.Option(nfs.PATH), nfs.FILE, can.Option(nfs.FILE), nfs.LINE, can.Option(nfs.LINE), ], function(msg) { can.user.toastSuccess(can) }, true) }) diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index caa38cc5..8e3fbc41 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -1,14 +1,14 @@ 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._command(can), can.base.isFunc(cb) && cb(msg) - }, target) }, function(can, name, sub) { - name == chat.ONIMPORT && (can.onimport.inner_init = sub._init) + can.onkeymap._build(can), can.onimport._input(can), can.onkeymap._plugin({}, 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) { can.ui.current = can.page.Append(can, can.ui.content.parentNode, [ {view: ["current", html.INPUT], onkeydown: function(event) { if (event.metaKey) { return } + can.misc.Debug("key", event.key) can._keylist = can.onkeymap._parse(event, can, can.mode, can._keylist, can.ui.current) can.mode == "insert" && can.core.Timer(10, function() { can.current.text(can.ui.current.value) }) can.mode == "normal" && can.Status("按键", can._keylist.join("")) @@ -19,13 +19,12 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }, [""]) Volcanos("onkeymap", {help: "键盘交互", list: [], _model: function(can, value) { can.Status("模式", can.mode = value) - can.current && (can.ui.current.value = can.current.text()) return can.page.Modify(can, can.ui.current, {className: "current"+ice.SP+can.mode}), value }, - _command: function(can) { can.onkeymap._model(can, "command") + _plugin: function(event, can) { can.onkeymap._model(can, "plugin") can.ui.current.blur() }, - _normal: function(can) { can.onkeymap._model(can, "normal") + _normal: function(event, can) { can.onkeymap._model(can, "normal") can.ui.current.focus(), can.ui.content.scrollLeft -= 10000 }, _insert: function(event, can) { can.onkeymap._model(can, "insert") @@ -35,61 +34,56 @@ Volcanos("onkeymap", {help: "键盘交互", list: [], _mode: { normal: { - escape: function(event, can) { can.onkeymap._command(can) }, + escape: function(event, can) { can.onkeymap._plugin(event, can) }, + ArrowLeft: function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) }, + ArrowRight: function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) }, + ArrowDown: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) }, + ArrowUp: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) }, - H: function(event, can, target) { can.onaction.cursorMove(can, target, 0, 0) }, - h: function(event, can, target) { can.onaction.cursorMove(can, target, -1) }, - l: function(event, can, target) { can.onaction.cursorMove(can, target, 1) }, - L: function(event, can, target) { can.onaction.cursorMove(can, target, 0, -1) }, + H: function(event, can, target) { can.onkeymap.cursorMove(can, target, 0, 0) }, + h: function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) }, + l: function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) }, + L: function(event, can, target) { can.onkeymap.cursorMove(can, target, 0, -1) }, j: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) }, k: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) }, - gg: function(event, can, target, count) { return can.onaction.selectLine(event, can, count||1), true }, + gg: function(event, can, target, count) { return can.onaction.selectLine(event, can, count), true }, G: function(event, can, target, count) { return can.onaction.selectLine(event, can, count = count>1? count: can.max), true }, - - zt: function(event, can, target, count) { - return can.current.scroll(can.current.scroll()-(count>1? count: 3)), true - }, - zz: function(event, can, target, count) { - return can.current.scroll(can.current.scroll()-(count = count>1? count: can.current.window()/2)), true - }, - zb: function(event, can, target, count) { - return can.current.scroll(can.current.scroll()-can.current.window()+(count>1? count: 5)), true - }, + zt: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-(count>1? count: 3)), true }, + zz: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-(count = count>1? count: can.current.window()/2)), true }, + zb: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-can.current.window()+(count>1? count: 5)), 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(event, can, can.onaction.insertLine(can, "", can.current.next())) - }, - O: function(event, can) { can.onkeymap._insert(event, can) - can.onaction.selectLine(event, can, can.onaction.insertLine(can, "", can.current.line)) - }, + I: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 0, 0) }, + a: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 1) }, + A: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 0, -1) }, + o: function(event, can) { can.onkeymap._insert(event, can), can.onaction.selectLine(event, can, can.onaction.insertLine(can, "", can.current.next())) }, + O: function(event, can) { can.onkeymap._insert(event, can), can.onaction.selectLine(event, can, can.onaction.insertLine(can, "", can.current.line)) }, 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(event, can, next) - }, + dd: function(event, can) { can._last_text = can.current.text(), can.onaction.selectLine(event, can, can.onaction.deleteLine(can, can.current.line)) }, 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) }, + + s: function(event, can) { can.onaction.save(event, can) }, + ":": function(event, can) { can.onimport.toolkit(can, {index: "cli.system"}, function(sub) { can.toolkit["cli.system"] = sub.select() }) }, + r: function(event, can) { can.onaction["执行"](event, can) }, + v: function(event, can) { can.onaction["展示"](event, can) }, }, insert: { - jk: function(event, can, target) { can.onkeymap._normal(can), - can.onkeymap.DelText(target, target.selectionStart-1, 1) + jk: function(event, can, target) { can.onkeymap._normal(event, can), + can.onkeymap.deleteText(target, target.selectionStart-1, 1) can.current.text(can.ui.current.value) }, - Escape: function(event, can) { can.onkeymap._normal(can) }, + Escape: function(event, can) { can.onkeymap._normal(event, can) }, + Tab: function(event, can) { + can.onkeymap.insertText(can.ui.current, "\t") + can.onkeymap.prevent(event) + }, + Enter: function(event, can, target) { - can.onaction.selectLine(event, can, can.onaction.insertLine(can, can.onkeymap.DelText(target, target.selectionEnd), can.current.next())) + var line = can.onaction.insertLine(can, can.onkeymap.deleteText(target, target.selectionEnd), can.current.next()) + can.current.text(can.ui.current.value), can.onaction.selectLine(event, can, line) }, Backspace: function(event, can, target) { if (target.selectionStart > 0) { return } @@ -102,10 +96,10 @@ Volcanos("onkeymap", {help: "键盘交互", list: [], var pos = can.current.text().length can.ui.current.value = can.current.text()+rest - can.onaction.cursorMove(can, can.ui.current, 0, pos) + can.onkeymap.cursorMove(can, can.ui.current, 0, pos) }, - ArrowDown: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) }, ArrowUp: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) }, + ArrowDown: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) }, }, }, _engine: {}, }) @@ -119,20 +113,26 @@ Volcanos("onaction", {help: "控件交互", list: [nfs.SAVE], _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}) - if (event) { if (can.mode == "command") { can.onkeymap._insert(event, can) } - can.ui.current.focus(), can.onaction.cursorMove(can, can.ui.current, 0, (event.offsetX)/13-1) + if (event) { if (can.mode == "plugin") { can.onkeymap._insert(event, can) } + can.ui.current.focus(), can.onkeymap.cursorMove(can, can.ui.current, 0, (event.offsetX)/13-1) can.ui.content.scrollLeft -= td.offsetLeft } }) }, + rerankLine: function(can, value) { can.max = 0 + can.page.Select(can, can.ui.content, html.TR, function(item, index) { + can.max++, can.page.Select(can, item, "td.line", function(item) { item.innerText = index+1 }) + }) + }, insertLine: function(can, value, before) { var line = can.onaction.appendLine(can, value) before && can.ui.content.insertBefore(line, before) return can.onaction.rerankLine(can), line }, deleteLine: function(can, line) { - can.page.Remove(can, line) - can.onaction.rerankLine(can) + var next = line.nextSibling||line.previousSibling + can.page.Remove(can, line), can.onaction.rerankLine(can) + return next }, modifyLine: function(can, line, value) { can.page.Select(can, can.ui.content, html.TR, function(item, index) { @@ -142,17 +142,6 @@ Volcanos("onaction", {help: "控件交互", list: [nfs.SAVE], }) }) }, - rerankLine: function(can, value) { can.max = 0 - can.page.Select(can, can.ui.content, html.TR, function(item, index) { - can.max++, can.page.Select(can, item, "td.line", function(item) { - item.innerText = index+1 - }) - }) - }, - 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/proto.js b/proto.js index 1d1a86c8..db2a3ae3 100644 --- a/proto.js +++ b/proto.js @@ -240,6 +240,7 @@ var html = { H1: "h1", H2: "h2", H3: "h3", } var lang = { + UNDEFINED: "undefined", STRING: "string", NUMBER: "number", OBJECT: "object", FUNCTION: "function", ESCAPE: "Escape", ENTER: "Enter", TAB: "Tab",