Monaco Editor 中的 Keybinding 机制( 四 )

得到了 keyEvent 实例对象后,便通过 this._dispatch(keyEvent, keyEvent.target) 执行 。
protected _dispatch(e: IKeyboardEvent,target: IContextKeyServiceTarget): boolean {return this._doDispatch(this.resolveKeyboardEvent(e),target,/*isSingleModiferChord*/ false);}直接调用了 this._doDispatch 方法,通过 this.resolveKeyboardEvent(e) 方法处理传入的 keyEvent,得到一个包含了许多 keybinding 操作方法的实例 。
接下来主要看下 _doDispatch 方法主要干了啥(以下仅展示了部分代码):
private _doDispatch(keybinding: ResolvedKeybinding,target: IContextKeyServiceTarget,isSingleModiferChord = false): boolean {const resolveResult = this._getResolver().resolve(contextValue,currentChord,firstPart);if (resolveResult && resolveResult.commandId) {if (typeof resolveResult.commandArgs === 'undefined') {this._commandService.executeCommand(resolveResult.commandId).then(undefined, (err) =>this._notificationService.warn(err));} else {this._commandService.executeCommand(resolveResult.commandId,resolveResult.commandArgs).then(undefined, (err) =>this._notificationService.warn(err));}}}主要是找到 keybinding 对应的 command 并执行,_getResolver 方法会拿到已注册的 keybinding,然后通过 resolve 方法找到对应的 keybinding 及 command 信息 。而执行 command 则会从 CommandsRegistry 中找到对应已注册的 command,然后执行 command 的 handler 函数(即keybinding 的回调函数) 。
6.卸载先看看一开始的例子中的代码:
const onClick = () => {actionDispose?.dispose();window.alert('已卸载');};卸载过程如下:

Monaco Editor 中的 Keybinding 机制

文章插图
回到刚开始注册时:setActionDispose(editorIns.addAction(action)),addAction 方法会返回一个 disposable 对象,setActionDispose 将该对象保存了起来 。通过调用该对象的 dispose 方法:actionDispose.dispose(),便可卸载该 action,对应的 command 和 keybinding 便都会被卸载 。
四、结语对 Monaco Editor 的 Keybinding 机制进行简单描述,就是通过监听用户的键盘输入,找到对应注册的 keybinding 和 command,然后执行对应的回调函数 。但仔细探究的话,每个过程都有很多处理逻辑,本文也只是对其做了一个大体的介绍,实际上还有许多相关的细节没有讲到,感兴趣的同学可以探索探索 。
【Monaco Editor 中的 Keybinding 机制】

经验总结扩展阅读