fold_by_level是sublime按语法定义的作用域嵌套深度逐层折叠的内置命令,非缩进或关键字识别;ctrl+k,ctrl+1实为fold_all(level=1),不专用于函数,python中函数多在level 2,js中常在level 3,需实测且依赖meta.function正确识别。

Sublime 没有“多级折叠”这个独立功能,所谓多级,其实是 fold_by_level 命令按语法定义的作用域嵌套深度(scope level)逐层折叠,不是靠缩进空格数或手动设置层级。
fold_by_level 是什么,为什么不能直接 Ctrl+K, Ctrl+1 就只折函数
fold_by_level 是 Sublime 内置命令,它不看缩进多少空格,也不认 def 或 function 关键字本身,而是读取当前语言语法文件(如 Python.sublime-syntax)里定义的 meta.function、meta.class 等作用域的嵌套层级。同一语言中,def 和 class 可能同属 level 2,而顶层 if __name__ == "__main__": 也在 level 2 —— 所以 Ctrl+K, Ctrl+1 折的未必是函数,可能只是 import 块或注释块。
-
Ctrl+K, Ctrl+1实际调用的是fold_all(level=1),不是“所有函数”专属命令 - Python 文件中,
def多数落在 level 2,JS/TS 中常在 level 3,必须实测,不能凭经验硬记 - 输错数字(比如试了 2 没反应)不会报错,只会静默失败;换一个数字再试即可
- 装饰器跨行(
@decorator单独一行写在def上方)会导致meta.function断裂,fold_by_level跳过该函数;加空行可修复
怎么确认当前语言支持 fold_by_level,且函数真被识别为可折叠结构
如果 Ctrl+Shift+[ 在 def 行都按不动,fold_by_level 必然无效。必须先验证基础条件:
- 右下角状态栏必须显示
Python、JavaScript等真实语言名,**不能是 Plain Text** - 光标停在
def func():行,按Ctrl+Shift+P→ 输入Developer: Show Scope Name,状态栏应出现含meta.function的作用域(如source.python meta.function.python) - Python 文件严禁混用 Tab 和 Space 缩进;统一用空格:菜单
View → Indentation → Convert Indentation to Spaces - 若使用第三方语法包(如
Python Improved),需确认它明确定义了foldingStartMarker规则,否则即使高亮正常,折叠也失效
fold_by_level 实操步骤与常见坑
这是唯一可控的“按需多级折叠”方式,但必须严格按顺序操作:
- 先确保单个
def行能被Ctrl+Shift+[正常折叠(左侧 gutter 出现 ▶) - 按
Ctrl+Shift+P→ 输入fold_by_level→ 回车 - 在命令面板底部输入框里,依次尝试
2、3、1(Python 通常从 2 开始,JS 常需 3) - 嵌套函数(
def outer(): def inner():)需额外执行一次fold_by_level 3,因为内层函数作用域更深 -
docstring紧贴def行(如def f(): """doc"""; pass)易导致识别失败;建议写成三行格式,或中间加空行
替代方案:当 fold_by_level 失效或语言不支持时
语法不支持、JSON/YAML/日志段、或只想临时藏一段配置,fold_selection 是唯一 100% 可控的方式:
- 鼠标拖选任意连续多行(哪怕全是注释、base64 字符串、或未闭合的 JSON)
- Windows/Linux 按
Ctrl+Shift+Alt+[,macOS 按Cmd+Ctrl+Option+[ - 侧边栏立刻出现独立三角图标,点击即可展开/收起
- 该折叠仅存于当前会话,关闭文件即丢;
Ctrl+K, Ctrl+J不会还原它,必须单独点击展开 - 若侧边栏没三角图标,检查用户设置中是否启用了
"fold_buttons": true
真正决定折叠效果的,从来不是快捷键本身,而是语法识别是否完整、作用域标记是否准确、以及光标是否落在那个被语言定义“允许折叠”的行上。任何试图绕过这三点的“多级折叠技巧”,最终都会在某次升级或换语言后失效。











