本文最后更新于:2023年3月31日 上午
初始想法
monaco-editor 添加自定义代码提示,提示需要支持功能 当前输入的对象下的所有属性、方法、以及原型 prototype
上所有的方法
实现原理
js代码自动解析所有属性、方法
拿到所有属性方法组成一个数组
当用户输入关键字且.
时候弹出提示当前对象支持的属性和方法
查找monaco-editor原生支持添加自定义代码提示
1
| monaco.languages.registerCompletionItemProvider()
|
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| const triggerCharacters = ['xxx', '.'].concat(Object.keys(window.xxx || {})); this.registerObject.completionItemProvider = monaco.languages.registerCompletionItemProvider('javascript', { provideCompletionItems(model, position) { const line = position.lineNumber; const column = position.column; const content = model.getLineContent(line); const sym = content[column - 2]; const word = model.getWordUntilPosition({ ...position, column: column - 1 }); const suggestions = []; if (sym === '.' && triggerCharacters.includes(word.word)) { const prototypeObj = word.word === 'xxx' ? window.xxx : window.xxx[word.word]; const keyList = Object.getOwnPropertyNames(Object.getPrototypeOf(prototypeObj || {}) || {}) .concat(Object.getOwnPropertyNames(prototypeObj?.prototype || {})); for (const key of keyList) { suggestions.push({ label: key, kind: monaco.languages.CompletionItemKind['Function'], insertText: key, detail: '', }); } } return { suggestions }; }, triggerCharacters });
|
剩下的就是将代码优化,然后使用
注意
使用this.registerObject.completionItemProvider
将编辑器储存起来,在组件销毁时this.registerObject.completionItemProvider.dispose();
否则会导致大量的重复提示