Sublime原生不支持“一键折叠所有函数”,因Ctrl+K,Ctrl+0折叠所有顶层折叠点而非仅函数;需用fold_by_level配合meta.function作用域层级(Python通常为2)精准折叠。

Sublime 无法“一键折叠所有函数”——它没有原生的 fold_all_functions 命令,所谓“全部折叠函数”必须靠作用域层级控制,且不同语言、不同语法包的层级数字不固定。
为什么 Ctrl+K, Ctrl+0 不是你要的“只折函数”
这个命令折叠的是“所有已注册的顶层折叠点”,包括模块级 if、for、注释块、类定义,甚至 JSON 根对象。它不区分结构类型,只看语法定义中是否标记了 fold: true 且处于 level 1。Python 文件里一个顶层 if 和一个 def 会被同等对待,结果就是你收起了函数,也收起了不该收的逻辑分支。
-
Ctrl+K, Ctrl+0是全局扫描,不是语义过滤 - 菜单里的
Fold All和它等价,同样不可控 - 想只留函数展开、其他全收?Sublime 原生不支持,得靠插件或手动选区
怎么用 fold_by_level 精准折叠函数(以 Python 为例)
真正可行的方式是调用 fold_by_level 命令,并输入函数作用域对应的嵌套深度。这个数字不是语言标准值,而是当前语法文件里 meta.function 所在的 fold 层级。
- 先把光标放在一个
def行,按Ctrl+Shift+[确认能正常折叠该函数 - 按
Ctrl+Shift+P输入show_scope_name回车,状态栏显示类似source.python meta.function.python→ 说明函数作用域识别成功 - 再按
Ctrl+Shift+P输入fold_by_level回车,依次尝试输入1、2、3—— 大多数 Python 语法包中函数对应2,但自定义插件可能改成3或4 - 输错数字不会报错,只是没反应;输对后,所有被识别为
meta.function的块会同时收起
常见失效场景和临时绕过法
即使语法正确,以下写法也会让 Sublime 跳过函数折叠:
-
def f(): """doc"""; pass—— docstring 紧贴冒号且无换行,解析器常中断,改写成换行 + 缩进即可 - 装饰器跨多行(如
@decorator(…)换行写),或@overload后无函数体,会导致作用域链断裂 - 文件后缀非标准(如
.pyi、.j2),Sublime 没自动绑定 Python 语法,需手动点击右下角切换 - 用了 Vue/TS 插件但其
.sublime-syntax未声明foldingStartMarker,此时show_scope_name查不到meta.function - 临时补救:按
Ctrl+F搜^def(勾选正则和“匹配行首”),全选所有匹配行,再按Ctrl+Shift+[—— 它会对每个选中行触发一次折叠
折叠按钮不显示?别急着装插件
左侧边栏没三角图标,90% 是语法识别失败,不是功能关闭。检查三件事:
- 右下角状态栏是否显示
Python(或JavaScript),而不是Plain Text—— 点击它手动切 - 用户设置里是否误设了
"fold_buttons": false—— 改成true即可恢复图标 - 当前语法包是否缺失
fold规则:用命令面板打开View Package File,查Packages/Python/Python.sublime-syntax,搜meta.function,确认附近有fold: true或fold: 2
真正麻烦的是那些嵌套在装饰器、泛型或模板字符串里的函数体——它们的作用域路径太深,fold_by_level 很难覆盖到,这时候手动选区或加 <!-- fold --> 标记反而更可靠。

















