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

opt vimer.js

This commit is contained in:
harveyshao 2022-10-05 22:31:47 +08:00
parent 503848ed97
commit e10a087a3b
3 changed files with 88 additions and 114 deletions

View File

@ -908,7 +908,7 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互", _focus: [], _init: function(can,
}; var count = parseInt(list.slice(0, pre).join(""))||1 }; var count = parseInt(list.slice(0, pre).join(""))||1
var map = can.onkeymap._mode[mode] var map = can.onkeymap._mode[mode]
function repeat(cb, count) { list = []; for (var i = 1; i <= count; i++) { if (cb(event, can, target, count)) { break } } } 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]; 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 cb = map && map[event.key.toLowerCase()]; if (can.base.isFunc(cb) && event.key.length > 1) { repeat(cb, count); return list }
@ -968,7 +968,12 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互", _focus: [], _init: function(can,
target.value = before+text+after target.value = before+text+after
return target.setSelectionRange(start+1, start+1) return target.setSelectionRange(start+1, start+1)
}, },
cursorMove: function(can, target, count, begin) { begin != undefined && target.setSelectionRange(begin, begin) cursorMove: function(target, count, begin) {
target.setSelectionRange(target.selectionStart+count, target.selectionStart+count) if (begin != undefined) {
if (begin < 0) { begin += target.value.length+1 }
target.setSelectionRange(begin, begin)
}
count != undefined && target.setSelectionRange(target.selectionStart+count, target.selectionStart+count)
return target.selectionStart
}, },
}) })

View File

@ -326,26 +326,9 @@ Volcanos(chat.ONKEYMAP, {help: "导入数据",
r: shy("执行命令", function(event, can) { can.onaction[cli.EXEC](event, can) }), r: shy("执行命令", function(event, can) { can.onaction[cli.EXEC](event, can) }),
f: shy("打开文件", function(event, can) { can.onaction["打开"](event, can) }), f: shy("打开文件", function(event, can) { can.onaction["打开"](event, can) }),
x: shy("关闭标签", function(event, can) { can._tab._close() }), x: shy("关闭标签", function(can) { can._tab._close() }),
h: shy("打开左边标签", function(event, can) { var next = can._tab.previousSibling; next && next.click() }), h: shy("打开左边标签", function(can) { var next = can._tab.previousSibling; next && next.click() }),
l: shy("打开右边标签", function(event, can) { var next = can._tab.nextSibling; next && next.click() }), l: shy("打开右边标签", function(can) { var next = can._tab.nextSibling; next && next.click() }),
j: shy("向下滚动", function(event, can) {
if (can.ui.content != can.ui._content) {
can.ui.content.contentWindow.document.body.scrollTop += 16
} else {
can.current.scroll(1)
}
}),
k: shy("向上滚动", function(event, can) {
if (can.ui.content != can.ui._content) {
can.ui.content.contentWindow.document.body.scrollTop -= 16
} else {
can.current.scroll(-1)
}
}),
J: shy("向下滚屏", function(event, can) { can.current.scroll(can.current.window()-3) }),
K: shy("向上滚屏", function(event, can) { can.current.scroll(-can.current.window()+3) }),
}, },
}, _engine: {}, }, _engine: {},
}) })

View File

@ -5,7 +5,6 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
can.onengine.listen(can, "tabview.line.select", function(msg) { can.onaction._selectLine(can) }) can.onengine.listen(can, "tabview.line.select", function(msg) { can.onaction._selectLine(can) })
can.onengine.plugin(can, can.onplugin), can.base.isFunc(cb) && cb(msg) can.onengine.plugin(can, can.onplugin), can.base.isFunc(cb) && cb(msg)
}, target) }, function(can, name, sub) { name == chat.ONIMPORT && (can.onimport.inner_init = sub._init) }, target) }, function(can, name, sub) { name == chat.ONIMPORT && (can.onimport.inner_init = sub._init)
if (name == chat.ONACTION) { can._trans = can.base.Copy(can._trans||{}, sub._trans) }
if (name == chat.ONKEYMAP) { can.core.Item(sub._mode, function(mode, value) { if (name == chat.ONKEYMAP) { can.core.Item(sub._mode, function(mode, value) {
var list = can.onkeymap._mode[mode] = can.onkeymap._mode[mode]||{} var list = can.onkeymap._mode[mode] = can.onkeymap._mode[mode]||{}
can.core.Item(value, function(key, cb) { list[key] = list[key]||cb }) can.core.Item(value, function(key, cb) { list[key] = list[key]||cb })
@ -85,7 +84,10 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互",
}, },
_plugin: function(event, can) { can.onkeymap._model(can, "plugin"), can.ui.current.blur() }, _plugin: function(event, can) { can.onkeymap._model(can, "plugin"), can.ui.current.blur() },
_normal: function(event, can) { can.onkeymap._model(can, "normal"), can.ui.current.focus() }, _normal: function(event, can) { can.onkeymap._model(can, "normal"), can.ui.current.focus() },
_insert: function(event, can) { can.onkeymap._model(can, "insert"), can.ui.current.focus(), event && can.onkeymap.prevent(event) }, _insert: function(event, can, count, begin) {
can.onkeymap._model(can, "insert"), can.ui.current.focus()
can.onkeymap.cursorMove(can.ui.current, count, begin), event && can.onkeymap.prevent(event)
},
_mode: { _mode: {
plugin: { plugin: {
@ -103,127 +105,107 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互",
m: shy("添加模块", function(event, can) { can.onaction.autogen(event, can, code.AUTOGEN) }), m: shy("添加模块", function(event, can) { can.onaction.autogen(event, can, code.AUTOGEN) }),
d: shy("创建空间", function(event, can) { can.onaction.dream(event, can, web.DREAM) }), d: shy("创建空间", function(event, can) { can.onaction.dream(event, can, web.DREAM) }),
}, },
normal_ctrl: {
f: shy("向下翻页", function(event, can, target, 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(event, can, target, count) {
var line = can.onaction.selectLine(can)-can.current.window()+3
return can.current.scroll(line), can.onaction.selectLine(can, line), true
}),
},
normal: { normal: {
Escape: shy("切换模式", function(event, can) { can.onkeymap._plugin(event, can) }), Escape: shy("切换模式", function(event, can) { can.onkeymap._plugin(event, can) }),
ArrowLeft: shy("光标左移", function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) }), ArrowLeft: shy("光标左移", function(can, target) { can.onkeymap.cursorMove(target, -1) }),
ArrowRight: shy("光标右移", function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) }), ArrowRight: shy("光标右移", function(can, target) { can.onkeymap.cursorMove(target, 1) }),
ArrowDown: shy("光标下移", function(event, can) { can.onaction.selectLine(can, can.current.next()) }), ArrowDown: shy("光标下移", function(can, target) { can.onaction.cursorDown(can, target) }),
ArrowUp: shy("光标上移", function(event, can) { can.onaction.selectLine(can, can.current.prev()) }), ArrowUp: shy("光标上移", function(can, target) { can.onaction.cursorUp(can, target) }),
s: shy("保存文件", function(event, can) { can.onaction.save(event, can, nfs.SAVE) }), H: shy("跳到行首", function(can, target) { can.onkeymap.cursorMove(target, 0, 0) }),
c: shy("编译项目", function(event, can) { can.onaction.compile(event, can, code.COMPILE) }), L: shy("跳到行尾", function(can, target) { can.onkeymap.cursorMove(target, 0, -1) }),
h: shy("光标左移", function(can, target) { can.onkeymap.cursorMove(target, -1) }),
".": shy("重复操作", function(event, can, target) { var cb = can.redo.pop(); cb && cb() }), l: shy("光标右移", function(can, target) { can.onkeymap.cursorMove(target, 1) }),
u: shy("撤销操作", function(event, can, target) { var cb = can.undo.pop(); cb && cb() }), j: shy("光标下移", function(can, target) { can.onaction.cursorDown(can, target) }),
J: shy("合并两行", function(event, can, target) { k: shy("光标上移", function(can, target) { can.onaction.cursorUp(can, target) }),
var next = can.current.next(); if (!next) { return }
var line = can.current.line, text = can.current.text()
var rest = can.page.Select(can, next, "td.text")[0].innerText
can.ui.current.value = can.current.text(text.trimRight()+ice.SP+rest.trimLeft()), can.onaction.deleteLine(can, next)
can.undo.push(function() { can.onaction.modifyLine(can, line, text), can.onaction.insertLine(can, rest, line.nextSibling) })
}),
H: shy("跳到行首", function(event, can, target) { can.onkeymap.cursorMove(can, target, 0, 0) }),
h: shy("光标左移", function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) }),
l: shy("光标右移", function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) }),
L: shy("跳到行尾", function(event, can, target) { can.onkeymap.cursorMove(can, target, 0, -1) }),
j: shy("光标下移", function(event, can) {
can.onaction.selectLine(can, can.current.next())
}),
k: shy("光标上移", function(event, can) {
can.onaction.selectLine(can, can.current.prev())
}),
gg: shy("跳到某行", function(event, can, target, count) { return can.onaction.selectLine(can, count), true }),
G: shy("跳到某行", function(event, can, target, count) { return can.onaction.selectLine(can, count = count>1? count: can.max), true }),
zt: shy("将当前行拉到屏幕最上", function(event, can, target, count) { return can.current.scroll(can.current.scroll()-(count>1? count: 3)), true }),
zz: shy("将当前行拉到屏幕中间", function(event, can, target, count) { return can.current.scroll(can.current.scroll()-(count = count>1? count: can.current.window()/2)), true }),
zb: shy("将当前行拉到屏幕最下", function(event, can, target, count) { return can.current.scroll(can.current.scroll()-can.current.window()+(count>1? count: 5)), true }),
I: shy("插入行首", function(event, can) { can.onkeymap._insert(event, can, 0, 0) }),
A: shy("插入行尾", function(event, can) { can.onkeymap._insert(event, can, 0, -1) }),
i: shy("插入模式", function(event, can) { can.onkeymap._insert(event, can) }), i: shy("插入模式", function(event, can) { can.onkeymap._insert(event, can) }),
I: shy("插入行首", function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 0, 0) }), a: shy("插入模式", function(event, can) { can.onkeymap._insert(event, can, 1) }),
a: shy("插入模式", function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 1) }),
A: shy("插入行尾", function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 0, -1) }),
o: shy("插入下一行", function(event, can) { var text = can.current.text() o: shy("插入下一行", function(event, can) { var text = can.current.text()
text = text.substr(0, text.indexOf(text.trimLeft()))+(text.endsWith("{")?"\t":"") text = text.substr(0, text.indexOf(text.trimLeft()))+(text.endsWith("{")?"\t":"")
can.onkeymap._insert(event, can), can.onaction.selectLine(can, can.onaction.insertLine(can, text, can.current.next())) can.onaction.selectLine(can, can.onaction.insertLine(can, text, can.current.next()))
can.onkeymap.cursorMove(can, can.ui.current, 1000) can.onkeymap._insert(event, can, 0, -1)
}), }),
O: shy("插入上一行", function(event, can) { var text = can.current.text() O: shy("插入上一行", function(event, can) { var text = can.current.text()
text = text.substr(0, text.indexOf(text.trimLeft()))+(text.endsWith("}")?"\t":"") text = text.substr(0, text.indexOf(text.trimLeft()))+(text.endsWith("}")?"\t":"")
can.onkeymap._insert(event, can), can.onaction.selectLine(can, can.onaction.insertLine(can, text, can.current.line)) can.onaction.selectLine(can, can.onaction.insertLine(can, text, can.current.line))
can.onkeymap.cursorMove(can, can.ui.current, 1000) can.onkeymap._insert(event, can, 0, -1)
}), }),
yy: shy("复制当前行", function(event, can, target, count) { can._last_text = can.current.text() }), yy: shy("复制当前行", function(event, can, target, count) { can._last_text = can.current.text() }),
dd: shy("剪切当前行", function(event, can, target, count) { var text = can.current.text(), line = can.onaction._getLineno(can, can.current.line) dd: shy("剪切当前行", function(can) {
can._last_text = can.current.text(), can.onaction.selectLine(can, can.onaction.deleteLine(can, can.current.line)) var line = can.onaction.selectLine(can), text = can.current.text()
can.onaction.selectLine(can, can.onaction.deleteLine(can, line)), can._last_text = text
can.undo.push(function() { can.onaction.insertLine(can, text, line), can.onaction.selectLine(can, line) }) can.undo.push(function() { can.onaction.insertLine(can, text, line), can.onaction.selectLine(can, line) })
var callee = arguments.callee var callee = arguments.callee; can.redo.push(function() { callee(can) })
can.redo.push(function() { callee(event, can, target, count) })
}), }),
p: shy("粘贴", function(event, can) { p: shy("粘贴", function(can) {
var line = can.onaction.insertLine(can, can._last_text, can.current.next()) var line = can.onaction.insertLine(can, can._last_text, can.current.next())
can.undo.push(function() { can.onaction.deleteLine(can, line), can.onaction.selectLine(can, line-1) }) can.undo.push(function() { can.onaction.deleteLine(can, line), can.onaction.selectLine(can, line-1) })
var call = arguments.callee; can.redo.push(function() { call(event, can) })
}), }),
P: shy("粘贴", function(event, can) { P: shy("粘贴", function(can) {
var line = can.onaction.insertLine(can, can._last_text, can.current.line) var line = can.onaction.insertLine(can, can._last_text, can.current.line)
can.undo.push(function() { can.onaction.deleteLine(can, line), can.onaction.selectLine(can, line+1) }) can.undo.push(function() { can.onaction.deleteLine(can, line), can.onaction.selectLine(can, line+1) })
var call = arguments.callee; can.redo.push(function() { call(event, can) })
}), }),
J: shy("合并两行", function(can) {
var next = can.current.next(); if (!next) { return }
var rest = can.page.Select(can, next, "td.text")[0].innerText
var line = can.onaction.selectLine(can), text = can.current.text()
can.ui.current.value = can.current.text(text.trimRight()+ice.SP+rest.trimLeft()), can.onaction.deleteLine(can, next)
can.undo.push(function() { can.onaction.modifyLine(can, line, text), can.onaction.insertLine(can, rest, line+1) })
}),
".": shy("重复操作", function(can) { var cb = can.redo.pop(); cb && cb() }),
u: shy("撤销操作", function(can) { var cb = can.undo.pop(); cb && cb() }),
gg: shy("跳到某行", function(can, count) { return can.onaction.selectLine(can, count), true }),
G: shy("跳到某行", function(can, count) { return can.onaction.selectLine(can, count = count>1? count: can.max), true }),
zt: shy("将当前行拉到屏幕最上", function(can, count) { return can.current.scroll(can.current.scroll()-(count>1? count: 3)), true }),
zz: shy("将当前行拉到屏幕中间", function(can, count) { return can.current.scroll(can.current.scroll()-(count = count>1? count: can.current.window()/2)), true }),
zb: shy("将当前行拉到屏幕最下", function(can, count) { return can.current.scroll(can.current.scroll()-can.current.window()+(count>1? count: 5)), true }),
},
normal_ctrl: {
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) }),
y: shy("向上滚屏", function(can) { can.current.scroll(-1) }),
}, },
insert: { insert: {
Escape: shy("退出编辑", function(event, can) { if (event.key != "Escape") { return } Escape: shy("退出编辑", function(event, can) { event.key == "Escape" && can.onkeymap._normal(event, can) }),
can.onkeymap._normal(event, can)
}),
Tab: shy("缩进", function(event, can) { if (event.key != "Tab") { return } Tab: shy("缩进", function(event, can) { if (event.key != "Tab") { return }
can.onkeymap.insertText(can.ui.current, ice.TB), can.onkeymap.prevent(event) can.onkeymap.insertText(can.ui.current, ice.TB), can.onkeymap.prevent(event)
}), }),
Backspace: shy("删除", function(event, can, target) { if (event.key != "Backspace") { return } Backspace: shy("删除", function(event, can, target) { if (event.key != "Backspace") { return }
if (target.selectionStart > 0) { return } if (target.selectionStart > 0 || !can.current.prev()) { return } can.onkeymap.prevent(event)
if (!can.current.prev()) { return } var rest = can.current.text(); can.onaction.selectLine(can, can.current.prev()), can.onaction.deleteLine(can, can.current.next())
can.onkeymap.prevent(event) var text = can.current.text(); can.ui.current.value = text+rest, can.onkeymap.cursorMove(target, 0, text.length)
var rest = can.current.text()
can.onaction.selectLine(can, can.current.prev())
can.onaction.deleteLine(can, can.current.next())
var pos = can.current.text().length
can.ui.current.value = can.current.text()+rest
can.onkeymap.cursorMove(can, can.ui.current, 0, pos)
}), }),
Enter: shy("换行", function(event, can, target) { if (event.key != "Enter") { return } Enter: shy("换行", function(event, can, target) { if (event.key != "Enter") { return }
var rest = can.onkeymap.deleteText(target, target.selectionEnd), text = can.ui.current.value var rest = can.onkeymap.deleteText(target, target.selectionEnd), text = can.ui.current.value
var left = text.substr(0, text.indexOf(text.trimLeft()))||(text.trimRight() == ""? text: "") var left = text.substr(0, text.indexOf(text.trimLeft()))||(text.trimRight() == ""? text: "")
if (text.endsWith("{")) { can.onaction.insertLine(can, left+"}", can.current.next()), left += ice.TB } if (can.base.endWith(text, "{")) { !can.base.beginWith(rest, "}") && (left += ice.TB), !rest && can.onaction.insertLine(can, left+"}", can.current.next()) }
if (text.endsWith("[")) { can.onaction.insertLine(can, left+"]", can.current.next()), left += ice.TB } if (can.base.endWith(text, "[")) { !can.base.beginWith(rest, "]") && (left += ice.TB), !rest && can.onaction.insertLine(can, left+"]", can.current.next()) }
if (text.endsWith("(")) { can.onaction.insertLine(can, left+")", can.current.next()), left += ice.TB } if (can.base.endWith(text, "(")) { !can.base.beginWith(rest, ")") && (left += ice.TB), !rest && can.onaction.insertLine(can, left+")", can.current.next()) }
if (text.endsWith("`") && can.base.count(text, "`")%2==1) { can.onaction.insertLine(can, left+"`", can.current.next()) } if (can.base.endWith(text, "`") && can.base.count(text, "`")%2==1) { !rest && can.onaction.insertLine(can, left+"`", can.current.next()) }
var line = can.onaction.insertLine(can, left+rest.trimLeft(), can.current.next()) var line = can.onaction.insertLine(can, left+rest.trimLeft(), can.current.next())
can.current.text(text.trimRight()||text), can.onaction.selectLine(can, line) can.current.text(text.trimRight()||text), can.onaction.selectLine(can, line)
can.onkeymap.cursorMove(can, can.ui.current, left.length, 0) can.onkeymap.cursorMove(target, 0, left.length)
}),
ArrowUp: shy("光标上移", function(event, can) { if (event.key != "ArrowUp") { return }
can.onaction.selectLine(can, can.current.prev())
}),
ArrowDown: shy("光标下移", function(event, can) { if (event.key != "ArrowDown") { return }
can.onaction.selectLine(can, can.current.next())
}), }),
ArrowDown: shy("光标下移", function(event, can) { event.key == "ArrowDown" && can.onaction.cursorDown(can, target) }),
ArrowUp: shy("光标上移", function(event, can) { event.key == "ArrowUp" && can.onaction.cursorUp(can, target) }),
}, },
}, _engine: {}, }, _engine: {},
}) })
Volcanos(chat.ONACTION, {help: "控件交互", Volcanos(chat.ONACTION, {help: "控件交互",
_trans: {source: "源码", module: "模块", dreams: "空间", website: "网页"},
_daemon: function(event, can, arg) { _daemon: function(event, can, arg) {
switch (arg[0]) { switch (arg[0]) {
case "dream": case "dream":
@ -378,7 +360,7 @@ Volcanos(chat.ONACTION, {help: "控件交互",
} }
target.focus(), can.ui.content.scrollLeft -= 10000 target.focus(), can.ui.content.scrollLeft -= 10000
if (event.type == "click") { if (event.type == "click") {
can.onkeymap.cursorMove(can, target, 0, (event.offsetX)/12-1) can.onkeymap.cursorMove(target, 0, (event.offsetX)/12-1)
} }
} }
}) })
@ -404,13 +386,17 @@ Volcanos(chat.ONACTION, {help: "控件交互",
return can.page.Remove(can, line), can.onaction.rerankLine(can), next return can.page.Remove(can, line), can.onaction.rerankLine(can), next
}, },
modifyLine: function(can, line, value) { modifyLine: function(can, line, value) {
can.page.Select(can, can.ui.content, html.TR, function(item, index) { can.page.Select(can, can.onaction.getLine(line), "td.text", function(target) {
if (item != line && index+1 != line) { return } target.innerHTML = can.onsyntax._parse(can, value)
can.page.Select(can, item, "td.text", function(item) {
item.innerHTML = can.onsyntax._parse(can, value)
})
}) })
}, },
cursorUp: function(can, target) { var p = can.onkeymap.cursorMove(target)
can.onaction.selectLine(can, can.current.prev()), can.onkeymap.cursorMove(target, 0, p)
},
cursorDown: function(can, target) { var p = can.onkeymap.cursorMove(target)
can.onaction.selectLine(can, can.current.next()), can.onkeymap.cursorMove(target, 0, p)
},
}) })
Volcanos(chat.ONEXPORT, {help: "导出数据", list: ["文件数", "模式", "按键", "解析器", "文件名", "当前行", "跳转数"]}) Volcanos(chat.ONEXPORT, {help: "导出数据", list: ["文件数", "模式", "按键", "解析器", "文件名", "当前行", "跳转数"]})
Volcanos(chat.ONPLUGIN, {help: "注册插件", Volcanos(chat.ONPLUGIN, {help: "注册插件",