diff --git a/lib/user.js b/lib/user.js index 18d1e02d..3a6dba96 100644 --- a/lib/user.js +++ b/lib/user.js @@ -389,6 +389,7 @@ Volcanos("user", {help: "用户操作", info: {}, agent: { }, localStorage: function(can, key, value) { if (value != undefined) { localStorage.setItem(key, JSON.stringify(value)) } + return localStorage.getItem(key) return can.base.Obj(localStorage.getItem(key), {}) }, }) diff --git a/panel/action.js b/panel/action.js index 431ab4ea..be96946a 100644 --- a/panel/action.js +++ b/panel/action.js @@ -10,9 +10,8 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) { }, _plugin: function(can, river, storm, sub, meta) { sub._target._meta = meta, sub._target._plugin = sub meta.id && (sub._option.dataset = sub._option.dataset||{}, sub._option.dataset.id = meta.id) - can.page.style(can, sub._output, html.MAX_WIDTH, can.ConfWidth()) + sub.Mode(can.Mode()), can.page.style(can, sub._output, html.MAX_WIDTH, can.ConfWidth()) - sub.Mode(can.Mode()) sub.run = function(event, cmds, cb) { return can.run(sub.request(event, {width: sub.ConfWidth(), height: sub.ConfHeight()}), can.misc.concat(can, [river, storm, meta.id||meta.index], cmds), cb) }, can._plugins = can.misc.concat(can, can._plugins, [sub]) diff --git a/plugin/input/img.js b/plugin/input/img.js index 7ed380d5..84a51e90 100644 --- a/plugin/input/img.js +++ b/plugin/input/img.js @@ -1,4 +1,4 @@ -Volcanos(chat.ONFIGURE, {help: "控件详情", img: { +Volcanos(chat.ONFIGURE, {img: { _init: function(can, target) { can.onmotion.hidden(can, target) for (var i = 0; i < 1; i++) { can.page.Append(can, target.parentNode, [{type: html.DIV, style: {width: 90, height: 90, "background-color": "yellow"}, onclick: function(event) { diff --git a/plugin/input/key.js b/plugin/input/key.js index cfcc02c9..bcf94290 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -1,4 +1,4 @@ -Volcanos(chat.ONFIGURE, {help: "控件详情", key: { +Volcanos(chat.ONFIGURE, {key: { _load: function(event, can, cbs, target, name, value) { can.runAction(event, mdb.INPUTS, [name, value||target.value], function(msg) { if (name == ctx.INDEX) { @@ -44,7 +44,6 @@ Volcanos(chat.ONFIGURE, {help: "控件详情", key: { onclick: function(event, can, meta, cb, target) { target._can && target._can.close() can.onfigure.key._make(event, can, meta, cb, target) - // can.onmotion.focus(can, target) }, onfocus: function(event, can, meta, cb, target, last) { can.onfigure.key._make(event, can, meta, cb, target) diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 00da882a..2f8947b3 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -15,7 +15,11 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", function show(skip) { if (can.isCmdMode()) { can.onimport._title(can, path+file) } can._msg && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.tabview[key] - can.Option(can.onimport.history(can, {path: path, file: file, line: line||can._msg.Option(nfs.LINE)||1})) + + can.Option(can.onimport.history(can, {path: path, file: file, line: line|| + can.user.localStorage(can, "web.code.vimer.selectLine:"+path+file)|| + can._msg.Option(nfs.LINE)|| + 1})) can.onsyntax._init(can, can._msg, function(content) { var msg = can._msg can.onexport.hash(can), msg._tab && can.onmotion.select(can, msg._tab.parentNode, html.DIV_TABS, msg._tab) can.ui._path && (can.ui._path.innerHTML = isDream()? can.page.Format(html.A, can.misc.MergePodCmd(can, {pod: can.Option(nfs.FILE)})): @@ -459,7 +463,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar can.extentions[url.split("?")[0]] = sub, can.base.isFunc(cb)? cb(sub): sub.select() }) }) }, - sess: function(can, sess, cb) { sess = sess||can.user.localStorage(can, "web.code.inner.sess") + sess: function(can, sess, cb) { sess = sess||can.base.Obj(can.user.localStorage(can, "web.code.inner.sess"), {}) can.core.Next(sess.plug, function(item, next) { can.onimport.toolkit(can, {index: item}, function(sub) { can.toolkit[item] = sub, next() }) }, function() { can.core.Next(sess.exts, function(item, next) { can.onimport.exts(can, item, next) }, function() { var path = can.Option(nfs.PATH), file = can.Option(nfs.FILE), line = can.Option(nfs.LINE) diff --git a/plugin/local/code/inner/syntax.js b/plugin/local/code/inner/syntax.js index b1b10f4c..e21a1ecb 100644 --- a/plugin/local/code/inner/syntax.js +++ b/plugin/local/code/inner/syntax.js @@ -204,15 +204,15 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", "defer": code.KEYWORD, "return": code.KEYWORD, - "false": "constant", - "true": "constant", - "nil": "constant", - "iota": "constant", - "-1": "constant", - "0": "constant", - "1": "constant", - "2": "constant", - "3": "constant", + "false": code.CONSTANT, + "true": code.CONSTANT, + "nil": code.CONSTANT, + "iota": code.CONSTANT, + "-1": code.CONSTANT, + "0": code.CONSTANT, + "1": code.CONSTANT, + "2": code.CONSTANT, + "3": code.CONSTANT, "int": code.DATATYPE, "int8": code.DATATYPE, "int16": code.DATATYPE, "int32": code.DATATYPE, "int64": code.DATATYPE, "uint": code.DATATYPE, "uint8": code.DATATYPE, "uint16": code.DATATYPE, "uint32": code.DATATYPE, "uint64": code.DATATYPE, @@ -315,9 +315,16 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", }, }, css: { + split: { + operator: ".>{:;}", + }, + regexp: { + "[0-9]+px": code.CONSTANT, + }, keyword: { "body": code.KEYWORD, "div": code.KEYWORD, + "img": code.KEYWORD, "span": code.KEYWORD, "form": code.KEYWORD, "fieldset": code.KEYWORD, @@ -373,33 +380,32 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", "margin-bottom": code.FUNCTION, "box-shadow": code.FUNCTION, - "0": "constant", - "10px": "constant", - "20px": "constant", - "cyan": "constant", - "gray": "constant", - "yellow": "constant", - "black": "constant", - "white": "constant", - "blue": "constant", - "red": "constant", - "green": "constant", - "magenta": "constant", + "0": code.CONSTANT, + "cyan": code.CONSTANT, + "gray": code.CONSTANT, + "yellow": code.CONSTANT, + "black": code.CONSTANT, + "white": code.CONSTANT, + "blue": code.CONSTANT, + "red": code.CONSTANT, + "green": code.CONSTANT, + "magenta": code.CONSTANT, - "monospace": "constant", - "bold": "constant", - "solid": "constant", - "none": "constant", - "block": "constant", - "contexts": "constant", - "both": "constant", - "auto": "constant", + "monospace": code.CONSTANT, + "hidden": code.CONSTANT, + "bold": code.CONSTANT, + "solid": code.CONSTANT, + "none": code.CONSTANT, + "block": code.CONSTANT, + "contexts": code.CONSTANT, + "both": code.CONSTANT, + "auto": code.CONSTANT, - "center": "constant", - "relative": "constant", - "absolute": "constant", - "sticky": "constant", - "fixed": "constant", + "center": code.CONSTANT, + "relative": code.CONSTANT, + "absolute": code.CONSTANT, + "sticky": code.CONSTANT, + "fixed": code.CONSTANT, }, }, iml: { @@ -426,8 +432,8 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", "style": code.FUNCTION, "width": code.FUNCTION, - "auto": "constant", - "username": "constant", + "auto": code.CONSTANT, + "username": code.CONSTANT, }, }, }) diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 4afcd950..cdf70ddf 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -27,7 +27,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }, [""]) Volcanos(chat.ONFIGURE, {help: "索引导航", create: function(can, target, zone, path) { - can.isCmdMode()? can.onappend._action(can, can.base.Obj(can._msg.Option(ice.MSG_ACTION)).concat(window.webview? ["vim", "录屏", "日志", "编辑器", "浏览器"]: []), target): can.onmotion.hidden(can, target.parentNode) + can.isCmdMode()? can.onappend._action(can, can.base.Obj(can._msg.Option(ice.MSG_ACTION)).concat(window.webview? ["查找", "vim", "录屏", "日志", "编辑器", "浏览器"]: ["查找"]), target): can.onmotion.hidden(can, target.parentNode) }, recent: function(can, target, zone, path) { var total = 0 function show(msg, cb) { @@ -114,6 +114,7 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互", p: shy("添加插件", function(event, can) { can.onaction["插件"](event, can) }), e: shy("添加扩展", function(event, can) { can.onaction["扩展"](event, can) }), g: shy("打开搜索", function(event, can) { can.onimport.exts(can, "inner/search.js") }), + y: shy("添加插件", function(event, can) { can.onaction["查找"](event, can) }), i: shy("插入模式", function(event, can) { can.onkeymap._insert(event, can) }), n: shy("命令模式", function(event, can) { can.onkeymap._normal(event, can) }), @@ -346,7 +347,34 @@ Volcanos(chat.ONACTION, {help: "控件交互", "浏览器": function(event, can) { window.openurl(location.href) }, - + "查找": function(event, can) { + var ui = can.page.Append(can, can._output, [{view: "vimer find", list: [html.ACTION, html.OUTPUT], style: {position: "absolute", left: can.ui.project.offsetWidth, top: 320}}]) + can.onmotion.move(can, ui.first) + + function find(begin, text) { + for (begin; begin <= can.max; begin++) { + if (can.onexport.text(can, can.onaction._getLine(can, begin)).indexOf(text) > -1) { + return can.onaction.selectLine(can, begin), can.current.scroll(can.current.scroll()-5) + } + } + } + function complete(target) { + can.onappend.figure(can, {action: "key", mode: "simple", run: function(event, cmds, cb) { + var msg = can.request(event); can.core.List(can.core.Split(can.current.text(), "\t \n:,{}"), function(value) { msg.Push("value", value) }), cb(msg) + }}, target) + } + + var from, to + var meta = can.onappend._action(can, [ + {type: "text", name: "from", _init: function(target) { from = target, complete(target), can.onmotion.delay(can, function() { target.focus() }) }}, + {type: "text", name: "to", _init: function(target) { to = target, complete(target) }}, + "find", "next", "replace", "close"], ui.action, { + find: function() { find(1, from.value) }, + next: function() { find(can.onaction.selectLine(can)+1, from.value) }, + replace: function() { can.current.text(can.current.text().replace(from.value, to.value)), meta.next() }, + close: function() { can.page.Remove(can, ui.first) }, + }) + }, _complete: function(event, can, target) { target = target||can.ui.complete if (event == undefined) { return } var pre = can.ui.current.value.slice(0, can.ui.current.selectionStart) @@ -412,6 +440,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", if (event && event.type == "click") { can.onkeymap._insert(event, can, 0, (event.offsetX)/12-1) } target.focus(), can.ui.content.scrollLeft -= 10000 }) + can.user.localStorage(can, "web.code.vimer.selectLine:"+can.Option(nfs.PATH)+can.Option(nfs.FILE), can.onaction._getLineno(can, can.current.line)) }, _getLine: function(can, line) { diff --git a/plugin/local/wiki/feel.js b/plugin/local/wiki/feel.js index 54749544..98e5831e 100644 --- a/plugin/local/wiki/feel.js +++ b/plugin/local/wiki/feel.js @@ -131,7 +131,7 @@ Volcanos(chat.ONDETAIL, {help: "组件菜单", list: ["关闭", "下载", "删 sub.run = function(event, cmds, cb) { return can.run(event, cmds, cb, true) } sub.getActionSize(function(msg, left, top, width, height) { - sub.page.style(sub, sub._target, {left: left, top: top}) + sub.page.style(sub, sub._target, {left: left||0, top: top||0}) sub.page.style(sub, sub._output, html.WIDTH, width, html.HEIGHT, height-2*html.ACTION_HEIGHT) sub.onappend._action(can, can.ondetail.list, sub._action, can.ondetail) sub.onappend._status(sub, ["begin", "file"]) @@ -158,7 +158,7 @@ Volcanos(chat.ONDETAIL, {help: "组件菜单", list: ["关闭", "下载", "删 }) Volcanos(chat.ONEXPORT, {help: "导出数据", list: [cli.BEGIN, mdb.LIMIT, mdb.TOTAL, nfs.FILE, "position"], height: function(can) { var height = can.Action(html.HEIGHT) - return parseInt(height == ice.AUTO? can.base.Min(can.ConfHeight()/4, 200): height) + return parseInt(height == ice.AUTO? can.base.Min(can.ConfHeight()/4, 200): height)||200 }, position: function(can, index, total) { total = total || can.max return parseInt((index+1)*100/total)+"%"+" = "+(parseInt(index)+1)+ice.PS+parseInt(total) diff --git a/plugin/state.js b/plugin/state.js index 136090d3..36f3553d 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -133,8 +133,8 @@ Volcanos(chat.ONACTION, {help: "交互操作", list: [ }, "切换全屏": function(event, can, button, sub) { can.onaction._switch(can, sub, "full", function() { can.ConfWidth(window.innerWidth) - can.page.style(can, can._target, html.LEFT, "", html.BOTTOM, "") - can.ConfHeight(window.innerHeight-html.ACTION_HEIGHT-can.onexport.statusHeight(can)-(can.user.isMobile? 2*html.ACTION_HEIGHT: 0)) + can.page.style(can, can._target, html.LEFT, "", html.BOTTOM, "") + can.ConfHeight(window.innerHeight-html.ACTION_HEIGHT-can.onexport.statusHeight(can)-(can.user.isMobile? 2*html.ACTION_HEIGHT: 0)) }, function() {}) }, "共享工具": function(event, can) { var meta = can.Conf()