Sublime无法原生实现“只折叠函数体、保留声明”,因其折叠基于语法作用域(如meta.function.python),天然包含def行及全部缩进内容;唯一稳定方案是fold_selection手动选中函数体内部行(不含def行)后折叠。

Sublime 无法原生“只折叠函数体、保留声明”——它折叠的是整个作用域块(def 行 + 缩进体),不是按语义切分的。 想达到类似效果,必须绕过语法自动识别,用可控手段手动干预。
为什么 Ctrl+Shift+[ 折的是整块,不是只折函数体?
Sublime 的折叠基于语法作用域(如 meta.function.python),这个作用域天然包含 def 行和其后所有缩进内容。它不区分“声明”和“实现”,也不提供“跳过首行”的折叠逻辑。
- 光标停在
def func():行 → 折叠后显示该行,隐藏后续所有缩进行(看起来像“只留声明”) - 但这是副作用,不是功能设计;若
def行后紧接 docstring 或装饰器,且无空行,meta.function可能未完整捕获,导致折叠失败 -
Ctrl+K, Ctrl+1或fold_by_level也只认作用域层级,不支持“排除首行”
真正能稳定只留 def 行的操作:用 fold_selection
这是唯一不依赖语法解析、完全由你控制范围的方式。关键在于:**选中时不包含 def 行,只选函数体内部的行**。
- 把光标放在函数体第一行(比如
print("hello")),按Ctrl+L选中该行 - 继续按
Ctrl+L多次,逐行向下扩展选中整个函数体(停在return或最后一行,避开def和空行) - 按
Ctrl+Shift+Alt+[(Windows/Linux)或Cmd+Ctrl+Option+[(macOS) - 左侧 gutter 出现独立 ▶,点击即可收起所选部分,
def行始终可见
容易被忽略的三个坑
这种手动方式看似简单,但以下三点常导致失败:
- 选中范围里混入空行或注释行 —— Sublime 会拒绝折叠,需提前删掉或跳过
- 函数体含多层嵌套(如
if块内还有for),fold_selection只折你选的连续行,不会自动识别嵌套边界 - 关闭文件后该折叠立即丢失 —— 它不写入磁盘,也不能跨会话复用;如果需要持久化,得改用
// <!-- fold -->标记(需语言支持)或插件
最麻烦的其实是 docstring 紧贴 def 行:Sublime 往往把 docstring 当作函数体一部分,导致你选中时一不留神就包含了它。解决办法不是硬调参数,而是加一行空行 —— 这比折腾语法包或正则更直接有效。

















