From fd95a53b92f95435b5e72f466b34f8ebb11d66f1 Mon Sep 17 00:00:00 2001 From: shylinux Date: Wed, 19 Jan 2022 09:42:35 +0800 Subject: [PATCH] opt inner.js --- frame.js | 11 ++++- plugin/local/code/inner.js | 34 +++++++------- plugin/local/code/vimer.js | 90 ++++++++++++++++---------------------- 3 files changed, 65 insertions(+), 70 deletions(-) diff --git a/frame.js b/frame.js index 02d0112c..9ba04607 100644 --- a/frame.js +++ b/frame.js @@ -861,6 +861,11 @@ Volcanos("onkeymap", {help: "键盘交互", list: [], _focus: [], _init: functio 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 + } + var map = can.onkeymap._engine[mode]||{}; for (var i = list.length-1; i > pre-1; i--) { var cb = map[list[i]]||{}; switch (typeof cb) { @@ -947,9 +952,11 @@ Volcanos("onkeymap", {help: "键盘交互", list: [], _focus: [], _init: functio 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) + DelText: 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 }, prevent: function(event) { event.stopPropagation(), event.preventDefault() diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index b4eb8178..33235353 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -72,7 +72,6 @@ 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}) @@ -180,7 +179,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], }) 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() + return can.onaction.selectLine(null, can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb() } if (msg.Option(ctx.INDEX)) { @@ -194,7 +193,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], function init(p) { can.max = 0, can.core.List(can.ls = msg.Result().split(ice.NL), function(item) { can.onaction.appendLine(can, item) - }), can.onaction.selectLine(can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb() } + }), can.onaction.selectLine(null, can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb() } var p = can.onsyntax[can.parse]; !p? can.run({}, [ctx.ACTION, mdb.PLUGIN, can.parse, msg.Option(nfs.FILE), msg.Option(nfs.PATH)], function(msg) { init(p = can.onsyntax[can.parse] = can.base.Obj(msg.Result())) @@ -333,17 +332,17 @@ Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加", can.Status("跳转数", can.history.length) }, - scrollLine: function(can, count) { var size = 20; can.current.scroll(0, count*size) }, + scrollLine: function(can, count) { var size = 20; can.current.scroll(count*size) }, appendLine: function(can, value) { var ui = can.page.Append(can, can.ui.content, [{type: html.TR, list: [ {view: ["line unselectable", html.TD, ++can.max], onclick: function(event) { - can.onaction.selectLine(can, ui.tr) + can.onaction.selectLine(event, can, ui.tr) }, ondblclick: function(event) { can.onaction.favorLine(can, ui.text.innerText) }}, {view: [html.TEXT, html.TD], list: [can.onsyntax._parse(can, value)], onclick: function(event) { - can.onaction.selectLine(can, ui.tr) + can.onaction.selectLine(event, can, ui.tr) }, ondblclick: function(event) { var s = document.getSelection().toString(), str = ui.text.innerText @@ -359,7 +358,7 @@ Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加", }} ]}]); return ui.tr }, - selectLine: function(can, line) { if (!line) { return } + selectLine: function(event, can, line) { if (!line) { return } can.page.Select(can, can.ui.content, html.TR, function(item, index) { if (!can.page.ClassList.set(can, item, html.SELECT, item == line || index+1 == line)) { return } line = item, can.Status(kit.Dict("文件名", can.file, "解析器", can.parse, "当前行", can.onexport.position(can, can.Option(nfs.LINE, index+1)))) @@ -367,10 +366,10 @@ Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加", can.base.isObject(line) && can.page.Select(can, line, "td.text", function(item) { can.current = { - scroll: function(x, y) { can.ui.content.scrollLeft += x, can.ui.content.scrollTop += y }, - window: function() { return can.ui.content.offsetHeight }, - offset: function() { return can.ui.content.scrollTop }, - height: function() { return 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 }, @@ -379,11 +378,14 @@ Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加", }, } - var offhead = 5, size = 20 - var pos = can.current.line.offsetTop-can.current.offset(); if (pos < offhead*20) { - can.current.scroll(0, pos-offhead*size) - } else if (pos > can.current.window()/2) { - can.current.scroll(0, pos-can.current.window()/2) + if (!event) { + var scroll = can.current.scroll(); if (scroll < 5) { can.current.scroll(scroll-5) } else { + var window = can.current.window(); if (scroll > window/2) { can.current.scroll(scroll-window/2) } + } + } else { + var scroll = can.current.scroll(); if (scroll < 3) { can.current.scroll(scroll-3) } else { + var window = can.current.window(); if (scroll > window-4) { can.current.scroll(scroll-window+4) } + } } var push = {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()} diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 0fb2179f..caa38cc5 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -1,6 +1,6 @@ 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) + 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) name == chat.ONKEYMAP && (can.base.Copy(can.onkeymap._mode, sub._mode)) @@ -10,7 +10,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, 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 == "insert" && can.core.Timer(10, function() { can.current.text(can.ui.current.value) }) + can.mode == "normal" && can.Status("按键", can._keylist.join("")) can.mode == "normal" && can.onkeymap.prevent(event) }, onclick: function(event) { can.onkeymap._insert(event, can) }}, ]).first @@ -18,47 +19,42 @@ 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") can.ui.current.blur() }, _normal: function(can) { can.onkeymap._model(can, "normal") - can.ui.current.focus() + can.ui.current.focus(), can.ui.content.scrollLeft -= 10000 }, _insert: function(event, can) { can.onkeymap._model(can, "insert") - can.ui.current.focus(), can.onkeymap.prevent(event) - can.ui.content.scrollLeft -= 100 + can.ui.current.focus(), can.ui.content.scrollLeft -= 10000 + can.onkeymap.prevent(event) }, _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()) }, + 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(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 + gg: function(event, can, target, count) { return can.onaction.selectLine(event, can, count||1), 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) { count = count||5 - var pos = can.current.offset()-target.offsetTop - can.current.scroll(0, -(pos+can.current.height()*count)) - return 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) { count = count||3 - var pos = can.current.offset()-target.offsetTop - can.current.scroll(0, -(pos+can.current.window()-can.current.height()*count)) - return 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) }, @@ -72,56 +68,44 @@ Volcanos("onkeymap", {help: "键盘交互", list: [], 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) + can.onaction.selectLine(event, can, can.onaction.insertLine(can, "", can.current.next())) }, 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) + 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(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) + var next = can.current.next(); can.onaction.deleteLine(can, can.current.line) + can.onaction.selectLine(event, 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) + jk: function(event, can, target) { can.onkeymap._normal(can), can.onkeymap.DelText(target, target.selectionStart-1, 1) + can.current.text(can.ui.current.value) }, - 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())) + Escape: function(event, can) { can.onkeymap._normal(can) }, + Enter: function(event, can, target) { + can.onaction.selectLine(event, can, can.onaction.insertLine(can, can.onkeymap.DelText(target, target.selectionEnd), can.current.next())) }, - backspace: function(event, can, target) { + Backspace: function(event, can, target) { if (target.selectionStart > 0) { return } - can.onkeymap.prevent(event) if (!can.current.prev()) { return } + can.onkeymap.prevent(event) var rest = can.current.text() - can.onaction.selectLine(can, can.current.prev()) + can.onaction.selectLine(event, 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()) - }, + ArrowDown: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) }, + ArrowUp: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) }, }, }, _engine: {}, }) @@ -135,8 +119,10 @@ 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}) - can.ui.current.focus(), can.onaction.cursorMove(can, can.ui.current, 0, (event.offsetX)/13-1) - can.ui.content.scrollLeft -= td.offsetLeft + 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) + can.ui.content.scrollLeft -= td.offsetLeft + } }) }, insertLine: function(can, value, before) {