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

Monaco Editor特定代码块折叠与展开功能问题求助

解决Monaco Editor折叠/展开特定函数的问题

问题分析

你当前的代码只展开了目标函数的一级嵌套,原因是editor.unfold命令的默认参数无法递归展开所有嵌套层级,需要更精准地定位并展开目标范围内的所有可折叠区域。

解决方案

以下是实现"折叠除单个函数外所有代码,展开目标函数全部嵌套"的步骤和代码:

  1. 折叠所有可折叠代码
    先执行全局折叠,确保所有代码块处于折叠状态:
const editor = editorRef.current.editor;
editor.trigger('source', 'editor.foldAll');
  1. 定位目标函数的行范围
    你可以手动指定目标函数的起始/结束行,或者通过Monaco的语言服务自动获取(推荐):
  • 手动指定示例:
    const targetStartLine = 106;
    const targetEndLine = 133;
    
  • 通过语言服务自动获取(以JavaScript为例):
    const model = editor.getModel();
    const languageService = monaco.languages.typescript.javascriptDefaults.getLanguageService();
    // 获取文档所有符号
    const symbols = await languageService.getDocumentSymbols(model.uri, model.getText());
    // 筛选目标函数(替换为你的函数名)
    const targetSymbol = symbols.find(s => 
      s.name === 'yourTargetFunction' && s.kind === monaco.languages.SymbolKind.Function
    );
    if (!targetSymbol) return;
    const targetStartLine = targetSymbol.range.startLineNumber;
    const targetEndLine = targetSymbol.range.endLineNumber;
    
  1. 展开目标范围内的所有嵌套折叠
    获取目标函数范围内的所有可折叠区域,逐个展开:
// 获取模型中所有可折叠区域
const allFoldableRanges = model.getFoldableRanges();
// 筛选出目标函数范围内的折叠区域
const targetFolds = allFoldableRanges.filter(range => 
  range.startLineNumber >= targetStartLine && range.endLineNumber <= targetEndLine
);
// 逐个展开所有嵌套折叠
targetFolds.forEach(range => editor.unfold(range));

关键说明

  • 直接使用editor.unfold的参数(如levels)只能控制单一方向的层级展开,无法覆盖所有嵌套场景;
  • 通过getFoldableRanges可以获取所有层级的可折叠区域,确保目标函数内的所有嵌套代码(如内部函数、条件块等)都被展开;
  • 语言服务的方式能避免手动维护行号的麻烦,适合动态代码场景。

内容的提问来源于stack exchange,提问作者Ugo Palatucci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:35:20