点击QuickFix(CodeAction)后清除Monaco Editor中的Marker
解决Monaco Editor QuickFix应用后旧Marker残留的问题
方法1:在QuickFix执行逻辑里直接清除对应Marker
你创建Marker时肯定会保留它们的引用(比如存在数组、Map或关联对象中)。编写Code Action的执行代码时,完成文本替换后直接调用对应Marker的dispose()方法即可清除。
示例代码:
// 创建Marker时保留引用 const targetMarker = editor.createMarker({ /* Marker配置项 */ }); // 定义QuickFix的Code Action { title: "修复当前警告", command: "fix.current.warning", execute: async (editor) => { // 执行文本替换操作 await editor.executeEdits('quickfix', [{ range: targetMarker.range, text: "替换后的正确文本" }]); // 清除旧Marker targetMarker.dispose(); } }
方法2:监听模型内容变化,重新同步Marker
如果你的Marker是基于代码分析生成的,可以监听编辑器模型的onDidChangeModelContent事件。每次文本变动(包括QuickFix的替换)后,先清除所有旧Marker,再重新分析代码生成新Marker,旧的警告下划线会自动消失。
示例代码:
const model = editor.getModel(); // 存储所有Marker的引用 const allMarkers = []; // 监听模型内容变化 model.onDidChangeModelContent(() => { // 清除所有旧Marker allMarkers.forEach(marker => marker.dispose()); allMarkers.length = 0; // 重新分析代码,生成新Marker并存入数组 const newMarkers = /* 你的代码分析逻辑,返回Marker配置数组 */; newMarkers.forEach(markerData => { const marker = editor.createMarker(markerData); allMarkers.push(marker); }); });
方法3:通过Command参数传递Marker引用
在provideCodeActions返回的Command中,把对应Marker作为参数传入执行函数,这样执行QuickFix时能精准清除目标Marker,不会影响其他标记。
示例代码:
function provideCodeActions(model, range) { // 根据当前范围找到对应的Marker const targetMarker = /* 你的逻辑:匹配range对应的Marker */; return [{ title: "修复此问题", kind: monaco.languages.CodeActionKind.QuickFix, edit: { edits: [{ resource: model.uri, edits: [{ range, text: "正确文本" }] }] }, // 额外执行Marker清除逻辑 execute: () => targetMarker.dispose() }]; }
Monaco Editor本身没有专门监听QuickFix应用完成的事件,但通过上述几种方式,完全可以实现清除旧Marker的需求。
内容的提问来源于stack exchange,提问作者Gabriel Vargas
相关产品推荐
相关产品推荐

