如何通过定时器更新Monaco Editor中CodeLens的标题?
解决Monaco Editor CodeLens标题实时更新问题
要实现CodeLens标题的定时更新,核心是让Monaco重新执行provideCodeLenses方法生成带最新值的CodeLens,具体步骤如下:
1. 存储变量实时值
定义一个可全局访问(或闭包内)的对象,用来存储变量的最新值,确保每次生成CodeLens时能拿到最新数据:
// 存储变量实时值,后续根据业务逻辑更新 const variableRealTimeValues = {};
2. 动态生成CodeLens
修改CodeLens Provider的provideCodeLenses方法,每次调用时从存储对象中取最新变量值,而非固定初始值:
monaco.languages.registerCodeLensProvider(langName, { async provideCodeLenses(model, token) { const codeLenses = []; // 替换成你实际的变量解析逻辑:从代码中提取变量、位置信息 const parsedVariables = [ { name: 'tempVar', startPos: { lineNumber: 2, column: 3 }, endPos: { lineNumber: 2, column: 9 } }, { name: 'pressure', startPos: { lineNumber: 5, column: 5 }, endPos: { lineNumber: 5, column: 13 } } ]; for (const { name, startPos, endPos } of parsedVariables) { // 获取最新变量值,默认显示N/A const currentValue = variableRealTimeValues[name] ?? 'N/A'; codeLenses.push({ range: { startLineNumber: startPos.lineNumber, startColumn: startPos.column, endLineNumber: endPos.lineNumber, endColumn: endPos.column, }, command: { id: 'showVariableValue', title: `${name}: ${currentValue}`, arguments: [name] // 传递变量名给命令处理函数,用于后续修改值 } }); } return { lenses: codeLenses, dispose: () => {} }; } });
3. 定时器触发CodeLens刷新
在定时器中更新变量值后,调用Monaco编辑器的内置命令触发CodeLens重新计算:
// 假设你已创建编辑器实例editor const editor = monaco.editor.create(document.getElementById('editor-container'), { value: '', language: langName }); setInterval(() => { // 1. 模拟更新变量实时值,替换成你实际的变量值获取逻辑(比如从后端/设备拉取) variableRealTimeValues.tempVar = Math.floor(Math.random() * 50); variableRealTimeValues.pressure = (Math.random() * 10).toFixed(2); // 2. 触发CodeLens刷新,让Monaco重新生成CodeLens editor.trigger('timer-refresh', 'editor.action.refreshCodeLenses'); }, 1000);
关键说明
editor.action.refreshCodeLenses是Monaco内置命令,调用后会重新执行provideCodeLenses方法,更新所有CodeLens的标题。- 如果变量位置可能随代码修改变化,需在
provideCodeLenses中每次重新解析代码获取最新位置,避免使用缓存的旧位置。 - 若要优化性能,可只在变量值实际变化时触发刷新,而非固定间隔执行。
内容的提问来源于stack exchange,提问作者00jeser
相关产品推荐
相关产品推荐

