diff --git a/frame.js b/frame.js index 005aac05..debdb7a2 100644 --- a/frame.js +++ b/frame.js @@ -1180,32 +1180,30 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { }, function() { can.page.style(can, target, html.HEIGHT, "") }) }, }) -Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||document.body - can.onkeymap._build(can), target.onkeydown = function(event) { can.misc.Event(event, can, function(msg) { +Volcanos(chat.ONKEYMAP, { + _init: function(can, target) { target = target||document.body, can.onkeymap._build(can) + target.onkeydown = function(event) { if (can.user.isWindows && event.ctrlKey) { can.onkeymap.prevent(event) } if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } - can.onengine.signal(can, chat.ONKEYDOWN, can.request(event, {"model": can.user.isWebview && event.metaKey? "webview": mdb.NORMAL})) - }) }, target.onkeyup = function(event) { can.misc.Event(event, can, function(msg) { - if (can.user.isWindows && event.ctrlKey) { can.onkeymap.prevent(event) } - if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } - can.onengine.signal(can, chat.ONKEYUP, can.request(event, {"model": mdb.NORMAL})) - }) } + can.onengine.signal(can, chat.ONKEYDOWN, can.request(event)) + }, target.onkeyup = function(event) { target.onkeydown(event) } }, - _build: function(can) { can.core.Item(can.onkeymap._mode, function(item, value) { var engine = {list: {}} + _build: function(can) { can.core.Item(can.onkeymap._mode, function(mode, value) { var engine = {list: {}} can.core.Item(value, function(key, cb) { var map = engine; 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 + } }), can.onkeymap._engine[mode] = engine }) }, - _parse: function(event, can, mode, list, target) { list = list||[] - if (event.metaKey && !can.user.isWebview) { return } if ([code.META, code.ALT, code.CONTROL, code.SHIFT].indexOf(event.key) > -1) { return list } + _parse: function(event, can, mode, target, list) { mode = mode||mdb.PLUGIN, target = target||can._output; if (!list) { list = target._key_list||[], target._key_list = list } + if (event.metaKey && !can.user.isWebview) { return list } if ([code.SHIFT, code.CONTROL, code.META, code.ALT].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, map = can.onkeymap._mode[mode] + function clear() { return target._key_list = [] } function repeat(cb, count) { list = []; for (var i = 1; i <= count; i++) { if (can.core.CallFunc(cb, {event: event, can: can, target: target, count: 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]; 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 [] } + var cb = map && map[event.key.toLowerCase()]; if (can.base.isFunc(cb) && event.key.length > 1) { repeat(cb, count); return clear() } + var cb = map && map[event.key]; if (can.base.isFunc(cb) && event.key.length > 1) { repeat(cb, count); return clear() } + var map = can.onkeymap._engine[mode]; if (!map) { return clear() } + for (var i = pre; i < list.length; i++ ) { var map = map.list[list[i]]; if (!map) { return clear() } + if (i == list.length-1 && can.base.isFunc(map.cb)) { repeat(map.cb, count); return clear() } } return list }, _mode: { @@ -1235,10 +1233,8 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||documen }, }, }, _engine: {}, + input: function(event, can) { can.onkeymap._parse(event, can, mdb.INSERT+(event.ctrlKey? "_ctrl": ""), event.target) }, prevent: function(event) { event && (event.stopPropagation(), event.preventDefault()); return true }, - input: function(event, can) { if (event.metaKey) { return } var target = event.target - target._keys = can.onkeymap._parse(event, can, mdb.INSERT+(event.ctrlKey? "_ctrl": ""), target._keys, target) - }, cursorMove: function(target, count, begin) { if (begin != undefined) { if (begin < 0) { begin += target.value.length+1 } target.setSelectionRange(begin, begin) } return count == undefined || target.setSelectionRange(target.selectionStart+count, target.selectionStart+count), target.selectionStart @@ -1291,7 +1287,6 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||documen can.onmotion.hidden(can, tr, tr.innerText.indexOf(target.value) > -1) return tr }).length > 0) { return } - // , target._index = -1, target._value = target.value can.page.Select(can, can._output, [html.TBODY, html.TR], function(tr, index) { var has = false can.page.Select(can, tr, html.TD, function(td) { has = has || td.innerText.indexOf(target.value)>-1 }), can.page.ClassList.set(can, tr, html.HIDDEN, !has) }), target._index = -1, target._value = target.value diff --git a/index.css b/index.css index 05cb279a..87672721 100644 --- a/index.css +++ b/index.css @@ -856,6 +856,7 @@ fieldset.inner>div.output>div.project div.item.modify { background-color:#008000 fieldset.vimer>div.output>div.project div.item.modify { background-color:#00800036; } fieldset.vimer>div.output>div.project>div.zone.space div.item.stop { color:var(--disable-fg-color); } fieldset.vimer>div.output>div.project>div.zone.space fieldset>div.output>div.item { height:42px; } +fieldset.vimer>div.output>div.project>div.zone.space fieldset>div.output>div.item.select { border-left:var(--box-notice3); } fieldset.xterm>div.action>div.tabs:only-child { display:none; } fieldset.xterm>div.layout { clear:both; } fieldset.xterm>form.option>div.item.args1 { display:none; } diff --git a/lib/misc.js b/lib/misc.js index c30467c9..0db4a263 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -271,7 +271,7 @@ Volcanos("misc", { }, PathJoin: function(dir, file, ext) { file = file||"" if (file.indexOf(nfs.PS) == 0 || file.indexOf(web.HTTP) == 0) { return file } - if (dir.indexOf(nfs.SRC) == 0 || dir.indexOf(nfs.USR) == 0) { dir = "/require/"+dir } + if (dir.indexOf(nfs.SRC) == 0 || dir.indexOf(nfs.USR) == 0) { dir = nfs.P+dir } return dir+file+(ext? nfs.PT+ext: "") }, isDebug: function(can) { return can.misc.Search(can, log.DEBUG) == ice.TRUE }, diff --git a/panel/action.js b/panel/action.js index d64ba375..93e9a1cc 100644 --- a/panel/action.js +++ b/panel/action.js @@ -84,13 +84,12 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { can.db.list = can.misc.S _onaction_cmd: function(can) { can.onengine.signal(can, chat.ONACTION_CMD), can.onlayout._init(can) }, onaction_cmd: function(can, msg) { can.user.mod.isCmd = true, can.page.ClassList.add(can, can._target, can.Mode(chat.CMD)), can.Conf(html.MARGIN_Y, 128), can.Conf(html.MARGIN_X, 0) }, onsearch: function(can, msg, arg) { var fields = msg.Option(ice.MSG_FIELDS).split(mdb.FS); if (arg[0] == mdb.PLUGIN) { can.onexport.plugin(can, msg, arg, fields) } if (arg[0] == ctx.COMMAND) { can.onexport.command(can, msg, arg, fields) } }, - onkeydown: function(can, msg, model) { - if (can.isCmdMode() && !msg._event.metaKey) { var sub = can._plugins[0].sub; sub && can.core.CallFunc([sub, "onaction.onkeydown"], {event: msg._event, can: sub}); return } - if (can._current && !msg._event.metaKey) { var sub = can._current.sub; sub && can.core.CallFunc([sub, "onaction.onkeydown"], {event: msg._event, can: sub}); return } - if (can.onkeymap.selectCtrlN(msg._event, can, can._action, html.DIV_ITEM)) { return } - can._keylist = can.onkeymap._parse(msg._event, can, model, can._keylist||[], can._output) - }, onresize: function(can) { can.onaction.layout(can) }, + onkeydown: function(event, can, mode) { + if (can.isCmdMode() && !event.metaKey) { var sub = can._plugins[0].sub; sub && can.core.CallFunc([sub, "onaction.onkeydown"], {event: event, can: sub}); return } + // if (can._current && !event.metaKey) { var sub = can._current.sub; sub && can.core.CallFunc([sub, "onaction.onkeydown"], {event: event, can: sub}); return } + can.onkeymap.selectCtrlN(event, can, can._action, html.DIV_TABS) || can.onkeymap._parse(event, can, mode) + }, ontouchstart: function(event, can) { can.touch = can.touch || {}, can.touch.isStart = true, can.touch.startX = event.touches[0].clientX }, ontouchmove: function(event, can) { can.touch.isMove = true, can.touch.distanceX = event.touches[0].clientX - can.touch.startX }, @@ -180,21 +179,8 @@ Volcanos(chat.ONENGINE, {_engine: function(event, sup, msg, can, cmds, cb) { }}) Volcanos(chat.ONKEYMAP, { _mode: { - webview: { - "[": function(event, can, target) { history.back() }, - "]": function(event, can, target) { history.forward() }, - r: function(event, can, target) { can.user.reload(true) }, - w: function(event, can, target) { can.user.close() }, - q: function(event, can, target) { window.terminate() }, - o: function(event, can, target) { window.openurl(location.href) }, - p: function(event, can, target) { window.openapp("QuickTime Player") }, - t: function(event, can, target) { window.opencmd("cd contexts; pwd") }, - f: function(event, can, target) { can.onengine.signal(can, chat.ONOPENSEARCH, can.request({}, {type: mdb.FOREACH})) }, - }, - normal: { - ":": function(event, can) { can.onengine.signal(can, chat.ONCOMMAND_FOCUS), can.onkeymap.prevent(event) }, - " ": function(event, can) { can.onengine.signal(can, chat.ONSEARCH_FOCUS), can.onkeymap.prevent(event) }, - Enter: function(event, can) { can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event)) }, + plugin: { + Enter: function(event, can) { can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event, {type: "*"})) }, Escape: function(event, can) { can.onmotion.clearFloat(can) || can._root.Search && can.onmotion.hidden(can, can._root.Search._target) }, }, }, _engine: {}, diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 6403f8d4..db2bddfd 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -10,7 +10,7 @@ fieldset.inner>div.output div.content td.text span.datatype { color:var(--code-d fieldset.inner>div.output div.content td.text span.package { color:var(--code-package); } fieldset.inner>div.output>div.project { font-family:var(--code-font-family); } fieldset.inner>div.output>div.project div.list { border-left:none; } -fieldset.inner>div.output>div.project div.item.select { background-color:unset; } +fieldset.inner>div.output>div.project div.item.select:not(:hover) { background-color:unset; } fieldset.inner:not(.vimer)>div.output>div.project div.expand.open { color:var(--notice-bg-color); } fieldset.inner>div.output>div.project div.zone div.action:not(.hide) { width:100%; } fieldset.inner>div.output>div.project div.zone div.action>div.item { padding-right:0; width:100%; overflow:hidden; } @@ -20,7 +20,9 @@ fieldset.inner>div.output>div.layout>div.tabs { font-size:var(--code-font-size); fieldset.inner>div.output>div.layout>div.tabs>div:hover { background-color:unset; color:unset; box-shadow:unset; } fieldset.inner>div.output>div.layout>div.tabs>div.tabs>div.tabs { padding-right:0; } fieldset.inner>div.output>div.layout>div.tabs>div.tabs>div.tabs.select { background-color:var(--output-bg-color); color:unset; border-top:var(--box-notice3); box-shadow:var(--legend-box-shadow);} -fieldset.vimer>div.output>div.layout>div.tabs>div.tabs>div.tabs.select { border-top:var(--box-border3); } +fieldset.vimer>div.output.source>div.layout>div.tabs>div.tabs>div.tabs.select { border-top:var(--box-border3); } +fieldset.vimer>div.output.source.normal>div.layout>div.tabs>div.tabs>div.tabs.select { border-top:var(--box-notice3); } +fieldset.vimer>div.output.source.insert>div.layout>div.tabs>div.tabs>div.tabs.select { border-top:var(--box-danger3); } fieldset.inner>div.output>div.layout>div.tabs>div.tabs>div.tabs { border-top:var(--box-border3); border-top-color:transparent; } fieldset.inner>div.output>div.layout>div.tabs>div.tabs>div.tabs:hover { background-color:var(--output-bg-color); color:unset; box-shadow:var(--legend-box-shadow); } fieldset.inner>div.output>div.layout>div.path { font-size:var(--code-font-size); display:none; } @@ -48,7 +50,7 @@ fieldset.inner>div.output>div.layout>div.layout>div.profile pre>code { padding-l fieldset.inner>div.output>div.layout>div.layout>div.profile>div.code { white-space:unset; padding:var(--table-padding); } fieldset.inner>div.output>div.layout>div.layout>div.profile div.status>div { padding:var(--input-padding); float:left; } fieldset.inner>div.output>div.layout>div.layout div.content div.tips { color:var(--disable-fg-color); font-style:italic; line-height:var(--code-line-height); position:absolute; top:0; right:10px; } -fieldset.inner>div.output>div.layout>div.layout>fieldset.story { margin:var(--plugin-margin) 0; } +fieldset.inner>div.output>div.layout>div.layout>fieldset.story { box-shadow:unset; } fieldset.inner.cmd>div.output>div.layout>div.tabs:not(.hide) { background-color:var(--plugin-bg-color); height:var(--code-tabs-height); display:flex; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div { height:var(--code-tabs-height); } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.icon>div.icon { font-size:26px; line-height:32px; padding:2px 5px; position:sticky; top:0; } @@ -57,9 +59,9 @@ fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs:hover { background-co fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs>div.tabs { padding:var(--input-padding) var(--button-padding); margin-right:var(--button-margin); height:var(--code-tabs-height); display:flex; align-items:center; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head { flex-direction:row-reverse; display:flex; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div { white-space:pre; padding:0 var(--input-padding); height:var(--code-tabs-height); display:flex; align-items:center; } +fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.qrcode { padding-top:5px; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.online { margin-left:0 !important; margin-right:0 !important; flex-direction: row-reverse; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.online img { height:24px; } -fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.qrocde { padding-top:5px; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.avatar { padding:0; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.avatar>img { height:32px; clip-path:circle(40%); } fieldset.inner.cmd>div.output>div.layout>div.plug { box-shadow:var(--th-box-shadow); height:var(--action-height); overflow:auto; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index c24d0061..57f8df7d 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -10,6 +10,7 @@ Volcanos(chat.ONIMPORT, { var paths = can.core.Split(can.Option(nfs.PATH)); can.Option(nfs.PATH, paths[0]) can.core.List([nfs.PATH, nfs.FILE, nfs.LINE], function(key) { msg.Option(key) && can.Option(key, msg.Option(key)) }) can.db = {tabview: {}, history: [], _history: [], toolkit: {}}, can.db.tabview[can.onexport.keys(can)] = msg + can.db.hash = can.isCmdMode()? can.misc.SearchHash(can): [] can.ui = can.onappend.layout(can, [html.PROJECT, [html.TABS, nfs.PATH, [html.CONTENT, html.PROFILE], html.DISPLAY, html.PLUG]]) can.ui._content = can.ui.content, can.ui._profile = can.ui.profile, can.ui._display = can.ui.display can.onmotion.clear(can, can.ui.project), can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.tabs), can.onmotion.hidden(can, can.ui.plug) @@ -36,7 +37,8 @@ Volcanos(chat.ONIMPORT, { "\u25E7": function(event) { var show = can.onmotion.toggle(can, can.ui.project); can.onimport.layout(can), can.isCmdMode() && can.onexport.session(can, PROJECT_HIDE, show? "": html.HIDE) }, "\u25E8": shy({transform: "rotate(90deg) translate"+(can.user.isWindows? "(-2px)": "(1px,-2px)")}, function(event) { if (can.page.isDisplay(can.ui.display)) { return can.onmotion.hidden(can, can.ui.display), can.onimport.layout(can) } can.onaction.exec(event, can) }), - "\u25E8 ": shy({width: 24}, function(event) { if (can.page.isDisplay(can.ui.profile)) { can._msg._profile_hidden = true + "\u25E8 ": shy({width: 24}, function(event) { if (can.page.isDisplay(can.ui.profile)) { + can._msg._profile_hidden = true return can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can) } can.onaction.show(event, can) }), }, function(text, cb) { return cb && {text: [text, html.SPAN, html.VIEW], style: cb.meta, onclick: cb} })) }, @@ -55,7 +57,10 @@ Volcanos(chat.ONIMPORT, { } can.page.Append(can, target, [{view: [[html.ITEM, "func"], html.SPAN, (func.current||"func")+nfs.PS+can.ui.content._max+func.percent+lex.SP+can.base.Size(can._msg.result[0].length)], onclick: function(event) { carte = can.user.carte(event, can, {_style: nfs.PATH}, list, function(ev, button) { last[button] = true, carte.close() - can.onimport.tabview(can, "", can.Option(nfs.FILE), can.core.Split(button, nfs.DF, nfs.DF).pop()) + var line = can.core.Split(button, nfs.DF, nfs.DF).pop() + can.onimport.tabview(can, "", can.Option(nfs.FILE), line, function() { + can.onaction.selectLine(can, line, true) + }) }) can.onmotion.delay(can, function() { can.page.Select(can, carte._target, html.DIV_ITEM, function(target) { can.onappend.style(can, can.base.beginWith(target.innerText, "- ")? aaa.PRIVATE: aaa.PUBLIC, target) @@ -93,18 +98,26 @@ Volcanos(chat.ONIMPORT, { tabview: function(can, path, file, line, cb) { path = path||can.Option(nfs.PATH); var key = can.onexport.keys(can, path, file) function isIndex() { return line == ctx.INDEX } function isSpace() { return line == web.SPACE } function show(skip) { can._msg && can._msg.Option && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.db.tabview[key] - can.Option(can.onimport.history(can, {path: path, file: file, line: line||can._msg.Option(nfs.LINE)||can.onexport.session(can, SELECT_LINE+nfs.DF+path+file)||1})) + can.Option(can.onimport.history(can, {path: path, file: file, line: can._msg.Option(nfs.LINE)||can.onexport.session(can, SELECT_LINE+nfs.DF+path+file)||1})) can.onsyntax._init(can, can._msg, function(content) { var msg = can._msg; can.onexport.hash(can), can.isCmdMode() && can.onexport.title(can, (isIndex()||isSpace()? "": path)+file) can.onmotion.select(can, can.ui._tabs, html.DIV_TABS, msg._tab), can.isCmdMode() && msg._tab.scrollIntoView(), can.onmotion.toggle(can, can.ui.path, true) - if (isSpace()) { can.ui.path.innerHTML = can.page.Format(html.A, can.base.trimPrefix(can.misc.MergePodCmd(can, {pod: can.Option(nfs.FILE)}), location.origin)) + if (isSpace()) { + can.page.isDisplay(can.ui.zone.space._target) || can.ui.zone.space._legend.click() + can.base.contains(file, "/") || can.onmotion.hidden(can, can.ui.path) + can.ui.path.innerHTML = can.page.Format(html.A, can.base.trimPrefix(can.misc.MergePodCmd(can, {pod: file}), location.origin)) } else if (isIndex()) { can.onmotion.hidden(can, can.ui.path) - } else { can.onimport.__tabPath(can) } + can.page.isDisplay(can.ui.zone.module._target) || can.ui.zone.module._legend.click() + } else { can.onimport.__tabPath(can) + can.page.isDisplay(can.ui.zone.source._target) || can.ui.zone.source._legend.click() + } can.page.SelectChild(can, can.ui._content.parentNode, can.page.Keys(html.DIV_CONTENT, html.DIV_LAYOUT, html.FIELDSET_STORY, [[[html.IFRAME, html.CONTENT]]]), function(target) { can.onmotion.toggle(can, target, target == content) }), can.ui.content._plugin = msg._plugin can.page.SelectChild(can, can.ui._profile.parentNode, can.page.Keys(html.DIV_PROFILE, [[[html.IFRAME, html.PROFILE]]]), function(target) { if (target == msg._profile) { can.ui.profile = msg._profile, msg._profile_hidden || can.onmotion.toggle(can, target, true) } }), can.ui.profile._plugin = msg._profile + if (isSpace()) { var item = can.ui.zone.space[file]; can.onmotion.select(can, item.parentNode, html.DIV_ITEM, item) } + can.page.ClassList.set(can, can._output, nfs.SOURCE, !isIndex() && !isSpace()) can.onimport.layout(can), can.ui.current && can.onmotion.toggle(can, can.ui.current, !isIndex() && !isSpace()) skip || can.onmotion.delay(can, function() { can.onaction.selectLine(can, can.Option(nfs.LINE), true) }), can.base.isFunc(cb) && cb(), cb = null var ls = can.onexport.path(can).split(nfs.PS); if (ls.length > 4) { ls = [ls.slice(0, 2).join(nfs.PS)+"/.../"+ls.slice(-2).join(nfs.PS)] } can.Status(kit.Dict(nfs.FILE, ls.join(nfs.PS))) @@ -117,7 +130,8 @@ Volcanos(chat.ONIMPORT, { } else { name = file.split(mdb.FS)[0].split(isIndex()? nfs.PT: nfs.PS).pop() } - var tabs = can.onimport.tabs(can, [{name: name, text: file, _menu: shy([nfs.SAVE, nfs.TRASH, web.REFRESH], function(event, button, meta) { + line && msg.Option(nfs.LINE, line) + var tabs = can.onimport.tabs(can, [{name: name, text: (isIndex() || isSpace()? "": path)+file, _menu: shy([nfs.SAVE, nfs.TRASH, web.REFRESH], function(event, button, meta) { can.request(event, msg), can.onaction[button](event, can, button) })}], function(event, tabs) { can._tab = msg._tab = tabs._target, show(skip), skip = true can.onmotion.delay(can, function() { var item = can.ui.zone && can.ui.zone.source && can.ui.zone.source[path+file]; if (!item) { return } @@ -137,7 +151,7 @@ Volcanos(chat.ONIMPORT, { project: function(can) { can.onimport.zone(can, can.core.Item(can.onfigure, function(name, cb) { if (can.base.isFunc(cb)) { return {name: name, _toggle: function(zone) { var target = can.page.isDisplay(zone._target)? zone._target: can.ui.zone.source._target can.core.Item(can.ui.zone, function(key, zone) { key.indexOf(nfs.PS) > 0 || zone.toggle(zone._target == target) }), can.onimport.layout(can) - }, _init: function(target, zone) { return cb(can, target, zone) }} + }, _init: function(target, zone) { return cb(can, target, zone, can.db.hash) }} } }), can.ui.project) }, profile: function(can, msg) { var _msg = can.db.tabview[can.onexport.keys(can)]; _msg.Option(html.WIDTH, msg.Option(html.WIDTH)), border = 1 var height = can.ui.content.offsetHeight, width = can.onexport.size(can, _msg.Option(html.WIDTH)||0.5, can.ConfWidth()-can.ui.project.offsetWidth)+border @@ -153,7 +167,10 @@ Volcanos(chat.ONIMPORT, { } } can.onimport.process(can, msg, can.ui.profile, height, width-border, function(sub) { can.ui.profile._plugin = sub, can.page.style(can, sub._output, html.MAX_WIDTH, "") - sub.onaction.close = function() { can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE), ""), can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can) } + sub.onaction.close = function() { + can._msg._profile_hidden = true + can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE), ""), + can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can) } sub.Conf(ctx.ARGS) && can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE), JSON.stringify(sub.Conf(ctx.ARGS))) can.page.style(can, can.ui.profile, html.WIDTH, width+border, html.MAX_WIDTH, width+border), can.onimport.layout(can) }) @@ -233,7 +250,7 @@ Volcanos(chat.ONIMPORT, { can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) { var sub = can.ui.profile._plugin; sub && can.page.isDisplay(can.ui.profile) && sub.onimport && sub.onimport.size(sub, can.ui.profile.offsetHeight, can.ui.profile.offsetWidth-1, true) var sub = can.ui.content._plugin; if (!sub) { return } if (height == sub.ConfHeight()+sub.onexport.actionHeight(sub)+sub.onexport.statusHeight(sub) && width == sub.ConfWidth()) { return } - sub.onimport.size(sub, height-20, width, false), can.page.style(can, sub._target, html.HEIGHT, height-20) + sub.onimport.size(sub, height, width, false), can.page.style(can, sub._target, html.HEIGHT, height) }) can.page.SelectChild(can, can.ui.project, html.DIV_ZONE, function(target, index, list) { can.page.SelectChild(can, target, html.DIV_ITEM, function(target) { var height = can.ui.project.offsetHeight - list.length*target.offsetHeight @@ -244,7 +261,7 @@ Volcanos(chat.ONIMPORT, { }, }, [""]) Volcanos(chat.ONFIGURE, { - source: function(can, target, zone) { var hash = can.misc.SearchHash(can) + source: function(can, target, zone, hash) { function show(target, zone, path) { can.run(can.request({}, {dir_root: path, dir_deep: true}), [nfs.PWD], function(msg) { can.onimport.tree(can, can.core.List(msg.Table(), function(item) { item._init = function(target) { can.ui.zone.source[path+item.path] = target } if (can.Option(nfs.FILE).indexOf(item.path) == 0) { item.expand = true } return item @@ -252,11 +269,18 @@ Volcanos(chat.ONFIGURE, { can.isCmdMode() && hash.length > 1 && can.onimport.tabview(can, hash[0], hash[1], hash[2]) }, true) } show(target, zone, can.Option(nfs.PATH)) }, - module: function(can, target, zone) { zone._delay_init = function() { can.runAction({}, mdb.INPUTS, [ctx.INDEX], function(msg) { - can.onimport.tree(can, msg.Table(), function(event, item) { can.onimport.tabview(can, "", item.index, ctx.INDEX) }, function() {}, target, null, ctx.INDEX, nfs.PT), zone._total(msg.Length()) - }) }, zone.toggle(false) }, - plugin: function(can, target, zone) { zone._delay_init = function() { var total = 0 - can.onimport.tree(can, can.core.ItemKeys(can.onengine.plugin.meta, function(key) { if (key[0] != "_") { return total++, {index: key} } }), + module: function(can, target, zone, hash) { + zone._delay_init = function() { can.runAction({}, mdb.INPUTS, [ctx.INDEX], function(msg) { + can.onimport.tree(can, msg.Table(function(value) { + value.expand = hash[2] == ctx.INDEX && hash[1] == value.index + return value + }), function(event, item) { can.onimport.tabview(can, "", item.index, ctx.INDEX) }, function() {}, target, null, ctx.INDEX, nfs.PT), zone._total(msg.Length()) + }) }, zone.toggle(false) + }, + plugin: function(can, target, zone, hash) { zone._delay_init = function() { var total = 0 + can.onimport.tree(can, can.core.ItemKeys(can.onengine.plugin.meta, function(key) { if (key[0] != "_") { + return total++, {index: key, expand: hash[2] == ctx.INDEX && hash[1] == "can."+key} + } }), function(event, item) { can.onimport.tabview(can, "", can.core.Keys(ice.CAN, item.index), ctx.INDEX) }, function() {}, target, null, ctx.INDEX, nfs.PT), zone._total(total) }, zone.toggle(false) }, }) @@ -267,7 +291,8 @@ Volcanos(chat.ONSYNTAX, { if (msg.Option(ctx.INDEX)) { return can.onsyntax._index(can, msg, function(target) { cb(can.ui.content = msg._content = target) }, can.ui._content.parentNode) } can.onsyntax._split(can, msg, cb, key) }, - _space: function(can, msg, cb, parent) { if (can.Option(nfs.LINE) == web.SPACE) { can.ui.zone.space && can.onmotion.delay(can, function() { can.ui.zone.space.refresh() }, 3000) + _space: function(can, msg, cb, parent) { if (can.Option(nfs.LINE) == web.SPACE) { + // can.ui.zone.space && can.onmotion.delay(can, function() { can.ui.zone.space.refresh() }, 3000) var target = can.page.Append(can, parent, [{view: [html.CONTENT, html.IFRAME], src: can.misc.MergePodCmd(can, {pod: can.Option(nfs.FILE)}), height: can.ui.content.offsetHeight, width: can.ui.content.offsetWidth}])._target return can.base.isFunc(cb) && cb(target), true } }, @@ -284,7 +309,7 @@ Volcanos(chat.ONSYNTAX, { sub.onexport.output = function() { can.onimport.layout(can) } sub.onexport.record = function(_, value, key, item) { item.file && can.onimport.tabview(can, item.path, item.file, item.line); return true } sub.onexport.title = function(_, title) { can.page.Modify(can, can.page.SelectOne(can, msg._tab, html.SPAN_NAME), title) } - sub.onimport.size(sub, can.ui.content.offsetHeight-20, can.ui.content.offsetWidth, false) + sub.onimport.size(sub, can.ui.content.offsetHeight, can.ui.content.offsetWidth, false) msg._plugin = sub, can.base.isFunc(cb) && cb(sub._target), sub.Focus() }, parent) }, @@ -386,16 +411,33 @@ Volcanos(chat.ONACTION, { line = target, can.Status(nfs.LINE, can.onexport.position(can, can.Option(nfs.LINE, n))) }); if (!can.base.isObject(line)) { return 0 } can.page.Select(can, line, "td.text", function(target) { - can.current = {line: line, next: function() { return line.nextSibling }, prev: function() { return line.previousSibling }, + can.current = {line: line, + next: function() { + return can.page.tagis(line.nextSibling, "tr.line")? line.nextSibling: undefined + }, + prev: function() { + return can.page.tagis(line.previousSibling, "tr.line")? line.previousSibling: undefined + }, text: function(text) { return text != undefined && can.onaction.modifyLine(can, line, text), target.innerText }, scroll: function(count) { if (count) { content.scrollTop += count*can.current.line.offsetHeight } return parseFloat((can.current.line.offsetTop-content.scrollTop)/can.current.line.offsetHeight) }, window: function() { return parseFloat(content.offsetHeight/can.current.line.offsetHeight) }, }, can.onimport.history(can, {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()}) + var scroll = can.current.scroll(), window = can.current.window() + if (0 < scroll && scroll < 2) { + can.current.scroll(-1) + } else if (window-3 < scroll && scroll < window) { + can.current.scroll(1) + } else if (scroll < 2 || scroll > window-3) { + can.onaction.scrollIntoView(can) + } + can._msg.Option(nfs.LINE, can.Option(nfs.LINE)) + can.onexport.hash(can) + can.onimport.__tabPath(can, false) can.isCmdMode() && can.onexport.session(can, SELECT_LINE+nfs.DF+can.Option(nfs.PATH)+can.Option(nfs.FILE)) - scroll && can.onaction.scrollIntoView(can), can.onengine.signal(can, LINE_SELECT, can._msg) + can.onengine.signal(can, LINE_SELECT, can._msg), can.onaction._selectLine(can) }); return can.onexport.hash(can), can.onexport.line(can, line) - }, + }, _selectLine: function(can) {}, scrollIntoView: function(can, offset) { can.ui.content.scrollTo(0, (can.onexport.line(can, can.current.line)-can.current.window()/4)*can.current.line.offsetHeight) }, searchLine: function(event, can, value) { var offset = 0; can.page.Select(can, can.ui.content, "tr.line", function(tr) { tr == can.current.line && can.page.Select(can, tr, "td.text>span", function(span) { offset += span.innerText.length; @@ -478,10 +520,6 @@ Volcanos(chat.ONACTION, { if (can.page.isDisplay(can.ui.display)) { return can.onmotion.hidden(can, can.ui.display), can.onimport.layout(can) } if (can.page.isDisplay(can.ui.profile)) { return can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can) } }, - onkeydown: function(event, can) { - if (can.onkeymap.selectCtrlN(event, can, can.ui.tabs, html.DIV_TABS)) { return } - can.db._key_list = can.onkeymap._parse(event, can, mdb.PLUGIN, can.db._key_list, can.ui.content) - }, }) Volcanos(chat.ONEXPORT, { path: function(can) { return can.Option(nfs.PATH)+can.Option(nfs.FILE) }, diff --git a/plugin/local/code/vimer.css b/plugin/local/code/vimer.css index ce2ad564..8cd66049 100644 --- a/plugin/local/code/vimer.css +++ b/plugin/local/code/vimer.css @@ -18,8 +18,12 @@ fieldset.vimer>div.output.normal>div.project div.item.current { background-color fieldset.vimer>div.output.insert>div.project div.item.current { background-color:var(--hover-bg-color); border-right:var(--box-danger3); } fieldset.vimer>div.output.normal>div.project div.expand.open { color:var(--notice-bg-color); } fieldset.vimer>div.output.insert>div.project div.expand.open { color:var(--danger-bg-color); } -fieldset.vimer>div.output.normal>div.project div.item.select { border-right:var(--box-notice3); } -fieldset.vimer>div.output.insert>div.project div.item.select { border-right:var(--box-danger3); } -fieldset.vimer>div.output>div.project div.item.select { border-right:var(--box-border3); } fieldset.vimer>div.output>div.project div.expand.open { color:unset; } div.input.vimer.open.float input[type=text] { width:100% !important; } + +fieldset.vimer>div.output.source>div.project div.item.select { border-right:var(--box-border3); } +fieldset.vimer>div.output.source.normal>div.project div.item.select { border-right:var(--box-notice3); } +fieldset.vimer>div.output.source.insert>div.project div.item.select { border-right:var(--box-danger3); } +fieldset.vimer>div.output.source>div.layout>div.tabs>div.tabs>div.tabs.select { border-top:var(--box-border3); } +fieldset.vimer>div.output.source.normal>div.layout>div.tabs>div.tabs>div.tabs.select { border-top:var(--box-notice3); } +fieldset.vimer>div.output.source.insert>div.layout>div.tabs>div.tabs>div.tabs.select { border-top:var(--box-danger3); } diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 6cf2214e..a834b4a8 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -1,31 +1,25 @@ Volcanos(chat.ONIMPORT, { - _init: function(can, msg, cb) { if (can.user.mod.isPod) { delete(can.onfigure.space), delete(can.onfigure.repos) } - can.onengine.listen(can, "tabview.line.select", function(msg) { can.onaction._selectLine(can) }) - can.require(["/plugin/local/code/inner.js"], function(can) { can.onimport._last_init(can, msg, function() { can.onappend.style(can, code.VIMER) + _init: function(can, msg, cb) { can.onappend.style(can, code.VIMER); if (can.user.mod.isPod) { delete(can.onfigure.space) } + can.require(["/plugin/local/code/inner.js"], function(can) { can.onimport._last_init(can, msg, function() { can.db.undo = [], can.db.redo = [], can.onimport._input(can), cb && cb(msg) }) }) }, _input: function(can) { var ui = can.page.Append(can, can.ui.content.parentNode, [ - {view: [code.CURRENT, html.INPUT], spellcheck: false, onkeydown: function(event) { can.onimport._value(can); if (event.metaKey) { return } - can.db._keylist = can.onkeymap._parse(event, can, can.db.mode+(event.ctrlKey? "_ctrl": ""), can.db._keylist, can.ui.current) - if (can.db.mode == mdb.NORMAL) { can.onkeymap.prevent(event) } if (can.db.mode == mdb.INSERT) { can.db._keylist = [] } - }, onkeyup: function(event) { can.onimport._value(can); if (event.metaKey) { return } can.onkeymap._complete(event, can) + {view: [code.CURRENT, html.INPUT], spellcheck: false, onkeydown: function(event) { + can.onimport._value(can), can.onkeymap._parse(event, can, can.db.mode+(event.ctrlKey? "_ctrl": ""), can.ui.current) + if (can.db.mode == mdb.INSERT) { can.ui.current._keylist = [] } + if (can.db.mode == mdb.NORMAL) { can.onkeymap.prevent(event) } + }, onkeyup: function(event) { can.onimport._value(can); can.onkeymap._complete(event, can) }, onfocus: function(event) { can.current.line.appendChild(can.ui.complete) }, onclick: function(event) { can.onkeymap._insert(event, can) - if (event.metaKey) { var target = event.target, begin = target.selectionStart, end = begin, reg = /[a-zA-Z0-9]/ - for (begin; begin > 0; begin--) { if (!reg.test(target.value.slice(begin, begin+1))) { begin++; break } } - for (end; end < target.value.length; end++) { if (!reg.test(target.value.slice(end, end+1))) { break } } - can.onaction.searchLine(event, can, target.value.slice(begin, end)) - } - can.onmotion.delay(can, function() { can.page.SelectChild(can, can.ui.complete, html.DIV, function(target) { - target.innerText = can.ui.current.value.slice(0, can.ui.current.selectionStart) - }) }) }}, {view: [[code.COMPLETE]]}, ]); can.ui.current = ui.current, can.ui.complete = ui.complete, can.onkeymap._plugin(can) }, - _value: function(can) { can.onimport.__tabPath(can, true), can.db.mode == mdb.INSERT && can.onmotion.delay(can, function() { can.current.text(can.ui.current.value) }) }, + _value: function(can) { can.onimport.__tabPath(can, true) + can.db.mode == mdb.INSERT && can.onmotion.delay(can, function() { can.current.text(can.ui.current.value) }) + }, }, [""]) Volcanos(chat.ONFIGURE, { - source: function(can, target, zone) { var hash = can.misc.SearchHash(can), args = [can.Option(nfs.PATH), can.Option(nfs.FILE)] + source: function(can, target, zone, hash) { var args = [can.Option(nfs.PATH), can.Option(nfs.FILE)] can.run({}, [ctx.ACTION, nfs.REPOS], function(msg) { var paths = can.db.paths can.core.List(paths.concat(msg.Table(function(value) { return value.path })), function(p) { if (can.base.beginWith(p, nfs.USR_LOCAL_WORK) || can.base.isIn(p, nfs.USR_WEBSOCKET, nfs.USR_GO_QRCODE, nfs.USR_GO_GIT, nfs.USR_ICONS, nfs.USR_GEOAREA, nfs.USR_PROGRAM, nfs.USR_NODE_MODULES)) { return } @@ -35,67 +29,85 @@ Volcanos(chat.ONFIGURE, { zone._icon(kit.Dict( web.REFRESH, function(event) { show(target, zone, path) }, mdb.CREATE, function(event, button) { can.onaction.module(event, can, nfs.MODULE) }, - )), zone._total(msg.Length()), can.onmotion.clear(can, target) + )), zone._total(msg.Length()) var cache, list = can.core.List(msg.Table(), function(item) { - if (path == "src/" && can.base.isIn(item.path, "main.ico", "main.svg", "version.go", "binpack.go", "binpack_usr.go")) { return } - if (path == "usr/release/" && can.base.isIn(item.path, "conf.go", "binpack.go")) { return } + if (path == nfs.SRC && can.base.isIn(item.path, "main.ico", "main.svg", "version.go", "binpack.go", "binpack_usr.go")) { return } + if (path == nfs.USR_RELEASE && can.base.isIn(item.path, "conf.go", "binpack.go")) { return } if (path == args[0] && args[1].indexOf(item.path) == 0) { item.expand = true } - item._init = function(target) { can.ui.zone.source[path+item.path] = target - item._remove = function() { can.page.Remove(can, target.parentNode), delete(cache[item.path]) } - } + item._init = function(target) { can.ui.zone.source[path+item.path] = target } return item - }) + }); can.onmotion.clear(can, target) cache = can.onimport.tree(can, list, function(event, item) { can.base.endWith(item.path, nfs.PS) || can.onimport.tabview(can, path, item.path) }, function(event, target, item) { var msg = can.request(event); msg.Option(nfs.PATH, path), msg.Option(nfs.FILE, item.path) }, target, cache) - can.isCmdMode() && hash.length > 1 && can.onimport.tabview(can, hash[0], hash[1], hash[2]), hash = [] - }, true) } - if (paths.length == 1) { return show(target, zone, paths[0]) } can.page.Remove(can, zone._action) + can.onmotion.delay(can, function() { + if (hash[2] == ctx.INDEX) { + if (can.base.beginWith(hash[1], "can.")) { + can.ui.zone.plugin._legend.click() + } else { + can.ui.zone.module._legend.click() + } + } else if (hash[2] == web.SPACE) { + can.ui.zone.space._legend.click() + } else { + hash.length > 1 && can.onimport.tabview(can, hash[0], hash[1], hash[2]) + } hash = [] + }) + }, true) } if (paths.length == 1) { return show(target, zone, paths[0]) } can.page.Remove(can, zone._action) can.onimport.zone(can, can.core.List(paths, function(path) { - return kit.Dict(mdb.NAME, path, path == args[0]? chat._INIT: chat._DELAY_INIT, function(target, zone) { show(target, zone, path), zone._toggle = function() {} }) + return kit.Dict(mdb.NAME, path, path == args[0]? chat._INIT: chat._DELAY_INIT, function(target, zone) { show(target, zone, path) }) }), target) }) }, - space: function(can, target, zone) { can.onimport._zone(can, zone, web.DREAM, function(sub, msg) { - sub.onimport._open = function(_, msg, arg) { var link = can.misc.ParseURL(can, arg) - if (link.pod) { can.onimport.tabview(can, "", link.pod, web.SPACE), sub.Update(); return } - can.onimport.tabview(can, "", arg, web.SPACE) + space: function(can, target, zone, hash) { can.onimport._zone(can, zone, web.DREAM, function(sub, msg) { + sub.onimport._open = function(_, msg, arg) { can.onimport.tabview(can, "", arg, web.SPACE) } + sub.onexport.record = function(sub, value, key) { + can.onimport.tabview(can, "", value, web.SPACE) } - sub.onexport.record = function(sub, value, key) { can.onimport.tabview(can, "", value, web.SPACE) } + can.page.Select(can, can._output, "div.item>span.name", function(target) { + can.ui.zone.space[target.innerText] = target.parentNode + if (target.innerText == hash[1] && hash[2] == web.SPACE) { + target.parentNode.click() + } + }) }), zone.toggle(false) }, }) -Volcanos(chat.ONACTION, {list: ["创建", "编译", "源码", "文档", "计划", "聊天", "矩阵", "后台", "桌面", "官网"], _trans: {show: "预览", exec: "展示"}, +Volcanos(chat.ONACTION, { _run: function(event, can, button, args, cb) { can.runAction(event, button, args, cb||function(msg) { - if (msg.IsErr()) { return can.user.toastFailure(can, msg.Result()) } can.onmotion.delay(can, function() { can.onimport.tabview(can, msg.Option(nfs.PATH), msg.Option(nfs.FILE)) }, 300) can.ui.zone.source.refresh() }) }, _runs: function(event, can, button, cb) { var meta = can.Conf(), msg = can.request(event); msg.Option(ctx.ACTION, button) - can.user.input(event, can, meta.feature[button], function(data, args) { var msg = can.request(event); msg.Option(data), can.onaction._run(event, can, button, args, cb) }) }, - save: function(event, can, button) { can.request(event, {file: can.Option(nfs.FILE), content: can.onexport.content(can)}) + can.user.input(event, can, meta.feature[button], function(data, args) { msg.Option(data), can.onaction._run(event, can, button, args, cb) }) + }, + save: function(event, can, button) { var p = can.Option(nfs.PATH)+can.Option(nfs.FILE); can.user.toastProcess(can, p, button) + can.request(event, {file: can.Option(nfs.FILE), content: can.onexport.content(can)}) + can.onaction._run(event, can, button, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { + can.onaction.reload(can, msg), can.user.toastSuccess(can, p, button) + }) + }, + reload: function(can, msg) { function imports(str) { var block = "", count = 0; can.core.List(str.split(lex.NL), function(item) { if (can.base.beginWith(item, "import (")) { block = can.core.Split(item)[0]; return } if (can.base.beginWith(item, ")")) { block = ""; return } if (can.base.beginWith(item, "import ")) { count++; return } if (block == "import") { count++ } }); return count } - var p = can.Option(nfs.PATH)+can.Option(nfs.FILE); can.user.toastProcess(can, p, button) - can.onaction._run(event, can, button, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { - if (can.onexport.parse(can) == nfs.GO) { var line = can.onaction.selectLine(can); can.onmotion.clear(can, can.ui.content) - can.ui.content._max = 0, can.core.List(msg.Result().split(lex.NL), function(item) { can.onaction.appendLine(can, item) }) - can.onaction.selectLine(can, line+imports(msg.Result())-imports(msg.Option(nfs.CONTENT))) - } can.user.toastSuccess(can, p, button) - }) + if (can.onexport.parse(can) == nfs.GO) { var line = can.onaction.selectLine(can); can.onmotion.clear(can, can.ui.content), can.ui.content._max = 0 + can.core.List(msg.Result().split(lex.NL), function(item) { can.onaction.appendLine(can, item) }) + can.onaction.selectLine(can, line+imports(msg.Result())-imports(msg.Option(nfs.CONTENT))) + } + }, + remove: function(can, p) { + var target = can.ui.zone.source[p]; if (target._tabs) { target._tabs._close() } can.page.Remove(can, target) }, trash: function(event, can, button) { var msg = can.request(event), p = msg.Option(nfs.PATH)+msg.Option(nfs.FILE) - can.onaction._run(event, can, button, [p], function() { - var target = can.ui.zone.source[p]; if (target._tabs) { target._tabs._close() } can.page.Remove(can, target) - }) + can.onaction._run(event, can, button, [p], function(msg) { can.onaction.remove(can, p) }) }, script: function(event, can, button) { can.onaction._runs(event, can, button) }, - module: function(event, can, button) { can.onaction._runs(can.request(event, {title: "创建模块"}), can, button) }, + module: function(event, can, button) { can.onaction._runs(can.request(event, {title: can.user.trans(can, button, "创建模块")}), can, button) }, compile: function(event, can, button) { var msg = can.request(event); msg.Option(chat._TOAST, "") can.runAction(event, button, [], function(msg) { can.ui.search && can.ui.search.hidden() if (msg.Length() > 0 || msg.Result()) { return can.onimport.exts(can, "inner/search.js", function(sub) { can.ui.search = sub, sub.select() @@ -124,26 +136,30 @@ Volcanos(chat.ONACTION, {list: ["创建", "编译", "源码", "文档", "计划" insertLine: function(can, value, before) { var line = can.onaction.appendLine(can, value); before && can.ui.content.insertBefore(line, can.onaction._getLine(can, before)); return can.onaction.rerankLine(can), can.onexport.line(can, line) }, deleteLine: function(can, line) { line = can.onaction._getLine(can, line); var next = line.nextSibling||line.previousSibling; return can.page.Remove(can, line), can.onaction.rerankLine(can), next }, - _selectLine: function(can) { can.current && can.page.Select(can, can.current.line, "td.text", function(td) { - var target = can.ui.current; - if (!target) { return } - target.value = td.innerText + _selectLine: function(can) { can.current && can.page.Select(can, can.current.line, "td.text", function(td) { var target = can.ui.current; if (!target) { return } can.current.line.appendChild(target), can.page.style(can, target, html.LEFT, td.offsetLeft-1, html.TOP, td.offsetTop, html.WIDTH, can.base.Min(td.offsetWidth, can.ui.content.offsetWidth-can.page.Select(can, can.current.line, "td.line")[0].offsetWidth)) - can.db.mode == mdb.NORMAL && can.onkeymap._normal(can) - if (can.ui.content._root) { can.onmotion.select(can, can.ui.content.parentNode, "", can.ui.content) } + target.value = td.innerText, can.db.mode == mdb.NORMAL && can.onkeymap._normal(can) can.onmotion.delay(can, function() { can.page.SelectChild(can, can.ui.complete, html.DIV, function(target) { target.innerText = can.ui.current.value.slice(0, can.ui.current.selectionStart) }) }) }) }, - onkeydown: function(event, can) { - if (can.onkeymap.selectCtrlN(event, can, can.ui.tabs, html.DIV_TABS)) { return } - can.db._key_list = can.onkeymap._parse(event, can, mdb.PLUGIN, can.db._key_list, can.ui.content) - }, +}) +Volcanos(chat.ONEXPORT, { + hash: function(can) { return can.misc.SearchHash(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE)) }, }) Volcanos(chat.ONKEYMAP, { - scrollHold: function(can, count, begin) { var scroll = can.ui.content.scrollLeft; can.ui.current.focus(), count != undefined && can.onkeymap.cursorMove(can.ui.current, count, begin == undefined? count: begin), can.ui.content.scrollLeft = scroll }, - cursorDown: function(can, target) { var p = can.onkeymap.cursorMove(target); can.onaction.selectLine(can, can.current.next()), can.onkeymap.cursorMove(target, 0, p) }, - cursorUp: function(can, target) { var p = can.onkeymap.cursorMove(target); can.onaction.selectLine(can, can.current.prev()), can.onkeymap.cursorMove(target, 0, p) }, + scrollHold: function(can, count, begin) { + var top = can.ui.content.scrollTop, left = can.ui.content.scrollLeft + can.ui.current.focus(), count != undefined && can.onkeymap.cursorMove(can.ui.current, count, begin == undefined? count: begin) + can.ui.content.scrollTop = top, can.ui.content.scrollLeft = left + }, + cursorDown: function(can, target) { + if (!can.current.next()) { return } + var p = can.onkeymap.cursorMove(target); can.onaction.selectLine(can, can.current.next()), can.onkeymap.cursorMove(target, 0, p) + }, + cursorUp: function(can, target) { + if (!can.current.prev()) { return } + var p = can.onkeymap.cursorMove(target); can.onaction.selectLine(can, can.current.prev()), can.onkeymap.cursorMove(target, 0, p) }, _model: function(can, value) { can.db.mode = value, can.onimport.__tabPath(can, true), can.core.List([mdb.PLUGIN, mdb.NORMAL, mdb.INSERT], function(item) { can.page.ClassList.del(can, can.ui.content, item) }), can.page.ClassList.add(can, can.ui.content, value) can.core.List([mdb.PLUGIN, mdb.NORMAL, mdb.INSERT], function(item) { can.page.ClassList.del(can, can._output, item) }), can.page.ClassList.add(can, can._output, value) @@ -276,10 +292,10 @@ Volcanos(chat.ONKEYMAP, { F5: shy("刷新网页", function(can, target) { can.user.reload(true) }), }, normal_ctrl: { - e: shy("向下滚屏", function(can) { can.current.scroll(1) }), - y: shy("向上滚屏", function(can) { can.current.scroll(-1) }), - f: shy("向下翻页", function(can, count) { var line = can.onaction.selectLine(can)+can.current.window()-3-can.current.scroll(); return can.current.scroll(line), can.onaction.selectLine(can, line), true }), - b: shy("向上翻页", function(can, count) { var line = can.onaction.selectLine(can)-can.current.window()+3; return can.current.scroll(line), can.onaction.selectLine(can, line), true }), + e: shy("向上滚屏", function(can) { can.current.scroll(1); if (can.current.scroll()<2) { can.onaction.selectLine(can, can.current.next()) } }), + y: shy("向下滚屏", function(can) { can.current.scroll(-1); if (can.current.scroll()>can.current.window()-3) { can.onaction.selectLine(can, can.current.prev()) } }), + f: shy("向下翻页", function(can, count) { can.current.scroll(can.current.window()) }), + b: shy("向上翻页", function(can, count) { can.current.scroll(-can.current.window()) }), r: shy("刷新页面", function(can) { can.user.reload(true) }), }, insert_ctrl: { @@ -290,7 +306,7 @@ Volcanos(chat.ONKEYMAP, { d: shy("删除字符", function(can, target) { can.user.isWindows && can.onkeymap.deleteText(target, target.selectionStart, 1) }), }, insert: { - Escape: shy("退出编辑", function(event, can) { can.onkeymap._normal(can) }), + Escape: shy("退出编辑", function(event, can) { can.onkeymap._normal(can), can.ui.current._keylist = [] }), ArrowUp: shy("光标上移", function(can, target) { can.onkeymap.cursorUp(can, target) }), ArrowDown: shy("光标下移", function(can, target) { can.onkeymap.cursorDown(can, target) }), Backspace: shy("删除字符", function(event, can, target) { if (target.selectionStart > 0 || !can.current.prev()) { return } can.onkeymap.prevent(event) diff --git a/plugin/local/code/xterm.js b/plugin/local/code/xterm.js index 73f69b78..0b885154 100644 --- a/plugin/local/code/xterm.js +++ b/plugin/local/code/xterm.js @@ -152,10 +152,6 @@ Volcanos(chat.ONACTION, { can.user.toastSuccess(can, can.user.trans(can, nfs.SAVE)+lex.SP+msg.Result()) }, true) }) }, - onkeydown: function(event, can) { - if (can.onkeymap.selectCtrlN(event, can, can._action, html.DIV_TABS)) { return } - can._keylist = can.onkeymap._parse(event, can, mdb.NORMAL, can._keylist||[], can._output._term) - }, hidden: function(can) { can.page.Select(can, can._fields, "div.output,div.layout", function(target) { target == can.sup._output? can.page.insertBefore(can, target, can._status): can.page.Remove(can, target) }) }, diff --git a/plugin/table.js b/plugin/table.js index 1dd56cf1..6437ffaa 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -270,8 +270,8 @@ Volcanos(chat.ONEXPORT, { }) Volcanos(chat.ONACTION, { onkeydown: function(event, can) { - if (event.ctrlKey && "0" <= event.key && event.key <= "9") { return can.onkeymap.ctrln(event, can) } - can._keylist = can.onkeymap._parse(event, can, mdb.PLUGIN, can._keylist||[], can._output) + if (can.onkeymap.selectCtrlN(event, can, can.ui.tabs||can._action, html.DIV_TABS)) { return } + can.onkeymap._parse(event, can) }, }) Volcanos(chat.ONKEYMAP, {