Ctrl+K Ctrl+1 折叠顶层 import 和全局变量而不影响 class/def,需确保其作用域为 source.python 直接子级(如 import 行),而 class/def 位于 meta.class/python 等嵌套层级;若 scope 层级异常,需修复语法高亮或禁用冲突插件。

Ctrl+K Ctrl+0 折叠全部代码块,对阅读大型项目源码几乎没用——它按语法结构粗暴收起所有函数/类,反而掩盖了真正想看的模块边界和逻辑分组。
怎么让 Ctrl+K Ctrl+1 只折顶层 import 和全局变量,不碰 class 和 def?
Ctrl+K Ctrl+1 折的是“作用域层级 1”,不是“缩进一级”。Python 文件里,import、all、常量赋值这些顶层语句通常落在 source.python 直接子级,而 class 和 def 是嵌套在 meta.class.python 或 meta.function.python 下的第二层。
但这个层级数字不是写死的,取决于当前语法文件中 meta. 前缀的嵌套深度。
- 先手动把光标放在一个
import行,按Ctrl+Shift+P→ 输入show_scope_name回车,看输出是否含source.python且无其他meta. - 再放光标到
class行,对比 scope 名,若多出一层meta.class,说明 class 是 level 2,Ctrl+KCtrl+1就不会动它 - 如果发现 import 和 class 都在同一层(比如都只显示
source.python),说明语法高亮失效或用了阉割版语法包,得换回官方 Python 包或检查插件冲突
Ctrl+K Ctrl+1 不响应?常见原因:
- 文件被识别为
Plain Text(右下角不是Python) - 当前语法定义里没给顶层语句设
fold: true(比如某些轻量 Python 插件会删掉折叠规则) - 缩进混用空格和 Tab,Sublime 认为“结构不连续”,跳过层级计算
为什么 // region 在 Python 里不折叠,但在 JS 里可以?
Sublime 不原生支持 #region 或 // region,能否生效,取决于当前语法是否启用了 fold_comments 并正确定义了注释 scope。
- JavaScript 默认语法中,
//被识别为comment.line.double-slash.js,且语法文件里配置了foldable: true,所以// region行能触发折叠 - Python 默认语法中,
#是comment.line.number-sign.python,但原生 Python.sublime-syntax 没把 comment 行标记为可折叠;即使你加了"fold_comments": true到用户设置,也无效——因为该选项只对已声明foldable的 comment scope 生效
实操建议:
- JS/TS/CSS 文件:直接写
// region utils+ 空行 + 代码 +// endregion,确保每行独占且无多余字符 - Python 文件:别硬套
#region,改用空行 + 4 空格缩进 + 注释标题,然后启用"fold_by_level": true,靠缩进层级收起整段 - 所有语言通用兜底法:选中目标代码 →
Ctrl+Shift+P→ 输入Fold Selection回车,不依赖语法,即时生效
fold_by_level 和 fold_on_indent 参数到底控制什么?
这两个参数都在 Settings – Syntax Specific 里配,但作用完全不同,且容易互相干扰:
-
"fold_by_level": true启用“按缩进层级折叠”,即把相同缩进深度的连续代码块视为一组来折叠(适合 YAML、INI、纯文本配置) -
"fold_on_indent": false是关键开关:设为false才禁用 Sublime 默认的缩进折叠逻辑,避免它和语法结构折叠打架;设为true反而会让def行也被当缩进块处理,导致重复折叠或错层
典型错误配置:
{
"fold_by_level": true,
"fold_on_indent": true
}结果:函数体被语法规则折一次,又被缩进逻辑再折一次,展开时层级错乱,甚至部分代码消失
正确做法(以阅读 Django settings.py 为例):
- 关闭缩进折叠:
"fold_on_indent": false - 开启层级折叠:
"fold_by_level": true - 再配合注释分组:
# === Middleware ===+ 空行 + 缩进代码,这样Ctrl+KCtrl+2就能一键收起整个 middleware 列表
注意:fold_by_level 对 JSON/YAML 更友好,但对 Python 效果有限——因为 Python 的 def 和其内部缩进是同一层,无法单独折函数头
真正的卡点不在快捷键记不记得住,而在你按下 Ctrl+K Ctrl+1 之前,有没有确认光标所在行的作用域确实是 source.python 而非 source.python meta.embedded.block.html——大型项目里,模板字符串、f-string、docstring 里的嵌套语法极易污染 scope 层级,一折就崩。

















