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

如何通过定时器更新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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:04:54