1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00

opt vimer.js

This commit is contained in:
harveyshao 2022-01-19 17:33:36 +08:00
parent fd95a53b92
commit e2c81e458b
8 changed files with 152 additions and 192 deletions

162
frame.js
View File

@ -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 = ""

View File

@ -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}

View File

@ -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)

View File

@ -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)
},

View File

@ -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;

View File

@ -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)
})

View File

@ -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: ["文件数", "模式", "按键", "解析器", "文件名", "当前行", "跳转数"]})

View File

@ -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",