Ace 编辑器,如何删除除一个之外的所有 keyBindings?
Ace editor, how to remove all keyBindings but one?
我的 jsp 页面上最近有一个文本区域
为此,我在键盘上有自己的快捷键
然后,我实现了 ace 编辑器,然后我所有的旧键绑定都不起作用
然后我搜索了一下,找到了这段代码:
//I did this before, to add the ace editor
var editor = ace.edit("fileInfo");
var JavaScriptMode = ace.require("ace/mode/javascript").Mode;
editor.session.setMode(new JavaScriptMode());
//Then I found this for the keyBindings
delete editor.keyBinding;
最后一行,禁用了 ace 编辑器中的所有 keyBindings,我自己的 keyBindings 开始工作了......
一切正常,但是后来,我搜索了很多关于 ace 编辑器的信息,发现了一个有趣的选项,那就是我喜欢使用的一个键绑定,那就是 DELETE ROW 键绑定 Ctrl + D
我现在想取回它,但只有它,而不是其他的,而且我的旧 keyBindings 应该也可以工作...
我的旧 keyBindings 的代码如下所示:
document.addEventListener("keydown", function(e) {
// Ctrl + S = SAVE
if (e.keyCode == 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)) {
e.preventDefault();
e.stopPropagation();
if($scope.mode!='BROWSE')
{
$('#saveBtn').trigger("click");
}
}
}, false);
你能帮帮我吗?
delete editor.keyBinding;
不是一个好的解决方案,它会在控制台中产生错误消息
Uncaught TypeError: Cannot read property 'ctrl-d' of undefined
at CommandManager.handleKeyboard (ace.js:10830)
at KeyBinding.$callKeyboardHandlers (ace.js:4081)
at KeyBinding.onCommandKey (ace.js:4113)
at Editor.onCommandKey (ace.js:12424)
at normalizeCommandKeys (ace.js:1648)
at HTMLTextAreaElement. (ace.js:1667)
选项 1:删除所有绑定并重新定义我们需要的那个。
//safely delete all bindings
editor.keyBinding.$defaultHandler.commandKeyBinding = {}
//bind the wanted command
editor.commands.addCommand({
name: "removeline",
bindKey: { win: "Ctrl-D", mac: "Command-D" },
exec: function(editor) { editor.removeLines(); },
scrollIntoView: "cursor",
multiSelectAction: "forEachLine"
});
现在您已经定义了命令,如果需要,您可以从自己的代码中调用它:
editor.execCommand("removeline")
选项 2:实际循环绑定。
使用for (key in obj)
循环键绑定并删除不等于ctrl-d
和command-d
:
的键
for (key in editor.keyBinding.$defaultHandler.commandKeyBinding) {
if (key !== "ctrl-d" && key !== "command-d")
delete editor.keyBinding.$defaultHandler.commandKeyBinding[key]
}
我的 jsp 页面上最近有一个文本区域
为此,我在键盘上有自己的快捷键
然后,我实现了 ace 编辑器,然后我所有的旧键绑定都不起作用
然后我搜索了一下,找到了这段代码:
//I did this before, to add the ace editor
var editor = ace.edit("fileInfo");
var JavaScriptMode = ace.require("ace/mode/javascript").Mode;
editor.session.setMode(new JavaScriptMode());
//Then I found this for the keyBindings
delete editor.keyBinding;
最后一行,禁用了 ace 编辑器中的所有 keyBindings,我自己的 keyBindings 开始工作了...... 一切正常,但是后来,我搜索了很多关于 ace 编辑器的信息,发现了一个有趣的选项,那就是我喜欢使用的一个键绑定,那就是 DELETE ROW 键绑定 Ctrl + D
我现在想取回它,但只有它,而不是其他的,而且我的旧 keyBindings 应该也可以工作...
我的旧 keyBindings 的代码如下所示:
document.addEventListener("keydown", function(e) {
// Ctrl + S = SAVE
if (e.keyCode == 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)) {
e.preventDefault();
e.stopPropagation();
if($scope.mode!='BROWSE')
{
$('#saveBtn').trigger("click");
}
}
}, false);
你能帮帮我吗?
delete editor.keyBinding;
不是一个好的解决方案,它会在控制台中产生错误消息
Uncaught TypeError: Cannot read property 'ctrl-d' of undefined at CommandManager.handleKeyboard (ace.js:10830) at KeyBinding.$callKeyboardHandlers (ace.js:4081) at KeyBinding.onCommandKey (ace.js:4113) at Editor.onCommandKey (ace.js:12424) at normalizeCommandKeys (ace.js:1648) at HTMLTextAreaElement. (ace.js:1667)
选项 1:删除所有绑定并重新定义我们需要的那个。
//safely delete all bindings
editor.keyBinding.$defaultHandler.commandKeyBinding = {}
//bind the wanted command
editor.commands.addCommand({
name: "removeline",
bindKey: { win: "Ctrl-D", mac: "Command-D" },
exec: function(editor) { editor.removeLines(); },
scrollIntoView: "cursor",
multiSelectAction: "forEachLine"
});
现在您已经定义了命令,如果需要,您可以从自己的代码中调用它:
editor.execCommand("removeline")
选项 2:实际循环绑定。
使用for (key in obj)
循环键绑定并删除不等于ctrl-d
和command-d
:
for (key in editor.keyBinding.$defaultHandler.commandKeyBinding) {
if (key !== "ctrl-d" && key !== "command-d")
delete editor.keyBinding.$defaultHandler.commandKeyBinding[key]
}