Sublime嵌套函数折叠失败主因是作用域链断裂,导致inner未被识别为meta.function.python;需检查scope链、统一缩进、添加空行修复,或用fold_selection强制折叠。

Sublime 折叠嵌套函数(如 def outer(): def inner():)为什么只折外层?
因为 Sublime 的 fold_by_level 默认只识别当前作用域层级的函数起点,而嵌套函数(inner)在语法定义中常被归入更深一层的 scope 嵌套深度——比如外层 outer 是 level 2,inner 可能落在 level 3 或 level 4。单次 fold_by_level 2 只会命中外层,内层仍展开。
fold_by_level 要连按两次才能收掉嵌套函数?
是的,但不是“连按”,而是分步执行不同层级:
- 先确保光标在任意一个
def行(比如outer),用Ctrl+Shift+P→ 输入fold_by_level→ 回车 → 输入2:收起所有 level 2 结构(通常是外层函数) - 再把光标移到
inner所在行(必须停在def inner():这一行),重复fold_by_level→ 输入3(或4):尝试收起该行对应的作用域 - 若
inner行按Ctrl+Shift+[本身就没反应,说明它未被识别为独立函数作用域——此时fold_by_level必然无效,需先修复语法识别(见下一条)
嵌套函数折叠失败,90% 是作用域断裂,怎么验证?
关键看 meta.function.python 是否完整出现在 scope 链里:
- 光标停在
def inner():行,按Ctrl+Shift+P→ 输入Developer: Show Scope Name→ 回车 - 状态栏若只显示
source.python,或出现meta.decorator.python但没meta.function.python,说明解析中断 - 常见断裂原因:
@decorator换行写在inner上方且无空行、inner的 docstring 紧贴def行、外层outer缩进混用 Tab/Space - 修复方法:在
@decorator和def inner之间加空行;统一用空格缩进;避免 docstring 与def行紧贴(改用三引号多行写法)
实在折不进去?用 fold_selection 强制收起任意子函数块
当语法识别彻底失效,或者你只想临时收起某几个嵌套函数体(不管它是否被正确标记),fold_selection 是唯一 100% 可控的方式:
- 鼠标拖选整个
inner函数体(从def inner():行开始,到其最后一行结束) - Windows/Linux:按
Ctrl+Shift+Alt+[;macOS:按Cmd+Ctrl+Option+[ - 左侧 gutter 会出现独立三角图标,点击即可展开/收起——它不依赖语法,也不影响其他自动折叠块
- 注意:该折叠仅存在于当前会话,关闭文件即丢失;但它能绕过所有作用域识别问题
outer 的 scope 链断了,里面的 inner 就根本不会被当作函数看待,所有基于 meta.function 的命令都会跳过它。

















