我有一个 KeyHandler,它定义了 alt up/down 的新行为。处理完这些键后,我调用
event.preventDefault
和 event.stopPropagation
,然后返回 true。
出于某种原因,我无法弄清楚 Ace 在我的处理程序之后处理该事件。我尝试设置密钥处理程序的 pos 参数,该参数设置为 0 时根本无法工作,设置为 1 时根本不会改变行为。
如何正确告诉 Ace 键盘事件已处理?我应该使用 addCommand 而不是 KeyHandler 吗?如果可以的话我什么时候应该使用哪个?
更新:包含代码。
aceEdit.keyBinding.addKeyboardHandler(::keyHandler)
private fun keyHandler(data: String, hash: String, keyString: String, keyCode: Int, event: KeyboardEvent?): Boolean {
if (event.altKey && event.keyCode == 36) { //home
this.aceEditor!!.moveCursorTo(0, 0)
} else if (event.altKey && event.keyCode == 35) { // end
this.aceEditor!!.moveCursorTo(aceEditor!!.getValue().split("\n").size - 1, 0)
} else if (event.altKey && event.keyCode == 38) { // alt up
moveNextOrPrev(false)
event.preventDefault()
event.stopPropagation()
keyboardHandler 不应该对编辑器进行任何更改,它应该返回一个具有现有命令名称或命令对象的对象
{
command: string | {exec: function, ...}
}
这允许编辑器记录宏,检测何时合并撤消堆栈项目,正确处理多个选择等。
但是,如果您无法返回命令并且更喜欢直接在键盘处理程序中处理按键,则可以返回一个特殊对象来指示编辑器应该停止调用其他键盘处理程序
return {command: "null"};
请参阅 keybinding.js#L107C1-L108C26 了解其实现方式的详细信息。
但是从您提供的代码片段来看,您甚至不需要实现keyboardHandler,只需添加一些命令,甚至更改现有命令的键绑定就足够了。