You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何强制Monaco Editor渲染指定模型中设置的标记?

问题

在浏览器中用原生JavaScript(无React或其他框架封装)实例化Monaco Editor(0.47.0 AMD版本),操作流程如下:

  1. 创建编辑器并填充占位文本
  2. 注册自定义语言「my_lang」,并创建关联该语言的新模型
  3. 为模型添加诊断标记后,切换编辑器至该模型

编辑器能正常显示模型文本,但设置的诊断标记始终不渲染。即使调整顺序,先切换模型再设置标记,问题依旧。控制台输出显示模型确实包含设置的标记,但编辑器就是不显示。

相关代码:

// 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:18:22