Sublime Text 默认不折叠函数,因其折叠机制基于语法作用域而非AST解析,官方Python/JS语法包未为def/function行配置foldingStartMarker;需通过BracketHighlighter插件自定义正则或修改语法文件添加标记才能实现函数级折叠。

Sublime Text 默认不按函数级别折叠代码,必须手动配置语法定义或启用插件才能实现「快捷折叠所有函数」——原生功能只支持基础的括号级({}、if 块等)折叠,无法识别 def、function、method 等语义层级。
为什么 Sublime 默认不折叠函数?
Sublime 的代码折叠基于「作用域(scope)」和语法高亮规则,不是解析 AST。它只看当前语言的 .sublime-syntax 或旧版 .tmLanguage 文件里是否定义了 foldingStartMarker 和 foldingStopMarker。Python、JavaScript 等主流语法包默认没为 def / function 行设置折叠标记。
- Python 语法包(官方):只对
class、if、for等缩进块折叠,def行本身不触发折叠 - JavaScript 语法包(官方):
function关键字行不带foldingStartMarker,只有{才算起点 - 即使开了
"fold_buttons": true,也只影响 UI 按钮,不改变折叠逻辑
用 BracketHighlighter + 自定义规则实现函数级折叠
这是目前最稳定、无需改语法文件的方法:借助 BracketHighlighter 插件扩展折叠能力,配合自定义正则匹配函数声明行。
- 安装
Package Control后,用Ctrl+Shift+P→Package Control: Install Package→ 搜BracketHighlighter - 安装后,打开
Preferences → Package Settings → BracketHighlighter → Bracket Settings – User - 在配置中添加以下规则(以 Python 为例):
{
"brackets": [
{
"name": "python-function",
"open": "^\\s*def\\s+\\w+\\(",
"close": "^\\s*(#.*|)$",
"style": "solid",
"enabled": true,
"ignore": false,
"icon": "function"
}
]
}
⚠️ 注意:close 行必须匹配函数体结束位置(比如空行或注释行),否则折叠会错位;JS 可类似配 ^\s*function\s+\w+\(|^\s*const\s+\w+\s*=\s*function 等。
直接修改语法文件(高级用户适用)
如果你用的是 Python,可复制并修改内置语法定义,在 def 行注入折叠标记。路径通常为:Packages/Python/Python.sublime-syntax(通过 Preferences → Browse Packages 进入)。
- 找到
mainscope 下的def规则(搜索def:) - 在其
push分支中加入folding_start_marker,例如:
- match: '\b(def)\b(?=\s+\w+\()'
scope: keyword.control.flow.python
push:
- meta_scope: meta.function.python
- folding_start_marker: '^\\s*def\\s+\\w+\\('
- 重启 Sublime;之后
def行左侧会出现小箭头,Ctrl+Shift+[即可折叠该函数 - ⚠️ 风险:升级 Python 插件时该文件会被覆盖,建议用
Override方式或 fork 到User/Python.sublime-syntax
快捷键与实际操作建议
无论用哪种方式,折叠行为最终依赖 Sublime 的原生快捷键,不是新命令:
-
Ctrl+Shift+[:折叠光标所在层级(需光标在可折叠行上) -
Ctrl+K, Ctrl+1:折叠所有一级代码块(如所有def、class) -
Ctrl+K, Ctrl+J:展开所有 - 若
Ctrl+K, Ctrl+1无效,说明语法未正确注册折叠范围,优先检查foldingStartMarker是否生效
真正起作用的是折叠标记是否被语法引擎识别,而不是快捷键本身。很多用户反复试 Ctrl+K Ctrl+1 却没反应,问题几乎都出在语法层没配对,不是快捷键冲突。










