如何强制Monaco Editor渲染指定模型中设置的标记?
问题
在浏览器中用原生JavaScript(无React或其他框架封装)实例化Monaco Editor(0.47.0 AMD版本),操作流程如下:
- 创建编辑器并填充占位文本
- 注册自定义语言「my_lang」,并创建关联该语言的新模型
- 为模型添加诊断标记后,切换编辑器至该模型
编辑器能正常显示模型文本,但设置的诊断标记始终不渲染。即使调整顺序,先切换模型再设置标记,问题依旧。控制台输出显示模型确实包含设置的标记,但编辑器就是不显示。
相关代码:
// Monaco initialization. const ed = monaco.editor.create(document.getElementById('container'), { value: 'Loading text...', }); monaco.languages.register({ id: 'my_lang', }); // Then creating a dedicated model associated with registered language. let model = monaco.editor.createModel( 'some text', 'my_lang', 'inmemory://test_script' ); // Adding some markers to the model. monaco.editor.setModelMarkers(model, 'my_lang', [ { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 2, severity: monaco.MarkerSeverity.Error, message: 'test error message', }, ]); // Switching the editor to this new second model. ed.setModel(model); // Monaco reports that the model contains described markers, // but it does not render them in the editor. console.log( monaco.editor.getModelMarkers({ owner: 'my_lang', resource: 'inmemory://test_script', }) );
解决方案
问题根源在于你用语言ID「my_lang」作为标记的owner参数了。Monaco会把以语言ID作为owner的标记,认定为语言服务提供的诊断结果,但你仅注册了语言ID,没有实现对应的语言服务诊断逻辑,因此编辑器不会渲染这些标记。
解决方法很简单,将owner替换为一个自定义的独立标识符(比如'my_lang_diagnostics'),不要使用语言ID:
修改后的完整代码:
// Monaco初始化 const ed = monaco.editor.create(document.getElementById('container'), { value: 'Loading text...', }); monaco.languages.register({ id: 'my_lang', }); // 创建关联自定义语言的模型 let model = monaco.editor.createModel( 'some text', 'my_lang', 'inmemory://test_script' ); // 将owner改为自定义标识 monaco.editor.setModelMarkers(model, 'my_lang_diagnostics', [ { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 2, severity: monaco.MarkerSeverity.Error, message: 'test error message', }, ]); // 切换编辑器至目标模型 ed.setModel(model); // 控制台验证时同步修改owner参数 console.log( monaco.editor.getModelMarkers({ owner: 'my_lang_diagnostics', resource: 'inmemory://test_script', }) );
修改完成后,编辑器就能正常渲染诊断标记了。原理是:自定义owner的标记属于独立的诊断来源,Monaco会直接渲染这类标记,无需依赖语言服务的额外支持。
内容的提问来源于stack exchange,提问作者Ilya Lakhin
相关产品推荐
相关产品推荐

