fold_by_level是唯一靠谱的“只折函数”方式:需先验证meta.function作用域是否生效,再实测输入层级数字(python通常为2,js常为3),语法失效时可用正则选中+ctrl+shift+[兜底。

fold_by_level 是唯一靠谱的“只折函数”方式
Sublime 原生没有 fold_all_functions 命令,Ctrl+K, Ctrl+0 会把顶层 if、for、类、注释块甚至 JSON 根对象全收掉,根本不是“只折函数”。真正可控的路径只有 fold_by_level——它按语法作用域层级折叠,而函数体在多数标准语法中处于固定嵌套深度。
操作前先验证:光标停在 def 行,按 Ctrl+Shift+P → 输入 show_scope_name 回车,状态栏显示类似 source.python meta.function.python 才算就绪。否则后续所有操作都静默失败。
- 按
Ctrl+Shift+P→ 输入fold_by_level→ 回车 - 依次尝试输入
1、2、3、4(Python 通常为2,JavaScript 常为3,但必须实测) - 输错不会报错,只是没反应;不同插件或自定义语法包可能改写该层级,不能凭经验硬套
- 若函数前紧贴 docstring(如
def f(): """doc"""; pass),fold_by_level可能跳过,加空行可修复
正则选中 + Ctrl+Shift+[ 是语法失效时的兜底方案
当右下角显示 Plain Text、show_scope_name 只返回 source.python、或用了非标插件(如旧版 Vue Component)导致作用域链断裂时,fold_by_level 和 Ctrl+K, Ctrl+0 全部失效。此时只能退回到文本层匹配。
-
Ctrl+F打开查找 → 输入正则:^def\s|^function\s|^[a-zA-Z]+\s*=\s*function\s*\(.*\)\{ - 勾选
Regex和Match case - 点
Find All,所有函数定义行被高亮选中(含带装饰器的行) - 按
Ctrl+Shift+[—— Sublime 会对每个选中行单独触发一次折叠
此法不依赖语法识别,纯文本驱动,但风险是:若某行含 def 字样却非函数(如注释里写了 # def handler()),也会被误折。
Ctrl+K, Ctrl+1 不是“只折函数”,而是“折所有一级结构”
这个快捷键调用的是 fold_all 命令,参数为 level=1,但它折叠的是语法定义中所有标记为 level 1 的结构。在 Python 中,它确实常覆盖 def 和 class;但在 JavaScript 中,可能漏掉箭头函数或简写方法;在 HTML 中,则只折标签对。它不是语义过滤,只是层级扫描。
- 必须分两步按:
Ctrl+K松开,再按Ctrl+1(不是同时按) - 若文件后缀不标准(如
.pyi、.j2),Sublime 没自动绑定语法,Ctrl+K, Ctrl+1就不会生效 - 某些插件(如 BracketHighlighter)会劫持折叠行为,导致该快捷键无响应
手动折叠区和语法折叠区默认互不干扰
用 Ctrl+Shift+Alt+[ 创建的手动折叠区域,属于用户标记(user_region),和语法驱动的折叠(meta.function 等)是两套独立机制。默认情况下,Ctrl+K, Ctrl+J 或命令面板里的 Unfold All 都不会处理手动折叠区。
- 如需一并展开,必须在用户设置中显式启用:
"fold_selected_regions": true - 修改后需重启 Sublime 或重载设置才生效
- 手动折叠不会保存到文件,仅当前会话有效;语法折叠则随文件持久化
真正难的从来不是“怎么折”,而是判断当前折叠行为到底由哪一层机制驱动——作用域识别?缩进解析?还是用户手动标记?一旦混用,结果就不可预测。











