如何修改Ace编辑器Vim扩展的delete函数并调用原实现
解决方案
要实现条件性执行原delete逻辑,核心是在覆盖delete操作符前先保存原实现,具体步骤如下:
- 加载Vim模块后,先获取并保存原生的delete操作符
- 自定义操作函数中判断条件:
- 满足条件则调用保存的原delete函数
- 不满足则终止操作,不执行任何动作
修改后的代码示例:
import * as ace from 'ace-builds'; this.aceEditor = ace.edit(this.editor.nativeElement); ace.require('ace/keybindings/vim'); this.aceEditor.setKeyboardHandler('ace/keyboard/vim'); ace.config.loadModule('ace/keyboard/vim', () => { const VimApi = ace.require('ace/keyboard/vim').CodeMirror.Vim; // 保存原生delete操作符的实现 const originalDeleteOperator = VimApi.operators.delete; // 自定义覆盖delete操作符 VimApi.defineOperator('delete', this.deleteCurrentLineIfSolved.bind(this, originalDeleteOperator)); }); // 自定义函数接收原操作符作为第一个参数 deleteCurrentLineIfSolved(originalDelete, event, signal) { // 替换为你的特定条件判断逻辑 const conditionMet = this.checkIfLineIsSolved(); if (conditionMet) { // 满足条件时执行原生delete逻辑 return originalDelete(event, signal); } else { // 不满足条件则终止操作流程 signal.stop(); return; } } // 示例条件判断函数,按需实现具体逻辑 checkIfLineIsSolved() { const currentLine = this.aceEditor.getSelectionRange().start.row; const lineContent = this.aceEditor.getLine(currentLine); return lineContent.includes('[SOLVED]'); // 示例条件:当前行包含[SOLVED]标记 }
关键说明
- Ace的Vim模式API中,
VimApi.operators对象直接存储了所有已定义的操作符,可直接通过VimApi.operators.delete获取原实现 - 调用原函数时必须传递完整的
event和signal参数,确保原生逻辑正常运行 - 不满足条件时调用
signal.stop()可终止后续操作流程,避免意外执行
内容的提问来源于stack exchange,提问作者M D
相关产品推荐
相关产品推荐

