Alt+1仅收起函数名而非函数体,是因为Notepad++的Python折叠依赖词法匹配而非AST分析:def行标为Level 1,函数体需换行、统一缩进(4空格)、非空内容才被标为Level 2;单行def、缩进不统一、语言模式错误或折叠未启用均导致函数体不可折。

Alt+1 为什么只收起函数名,不收函数体
Notepad++ 的 Alt+1 不是“只显示函数签名”,而是“展开到第 1 层折叠层级”——它依赖语言解析器打的 level 标签,不是你肉眼看到的缩进层数。Python 中 def 行被标为 Level 1,而函数体第一行(如 print("ok"))是否被标为 Level 2,取决于它是否触发了新折叠点。
常见情况:def foo():\n pass 可折叠;但 def foo(): pass(单行)根本不会生成 Level 2,Alt+1 按完后函数体自然还开着。
- 函数体没被识别为可折叠块,本质是 Notepad++ 没给它分配折叠 level,不是快捷键没生效
- Level 0 是文件顶层(不可折),Level 1 是
def/class/if等关键字行,Level 2 需要下一行有缩进 + 内容(不能是空行、注释或单行语句) -
Alt+1后函数体仍展开,说明编辑器压根没把它当 Level 2 处理,得回头检查结构合规性
让函数体真正变成可折叠块的硬性条件
Notepad++ 对 Python 折叠不做 AST 分析,只靠词法匹配:关键字 + 换行 + 缩进内容。缺一不可。
- 必须换行:
def foo():单独成行,下一行必须缩进且非空(pass、return、print()都行,但不能是# 注释或纯空行) - 缩进必须统一:Settings → Preferences → Language → Tab settings → Python 中勾选
Replace by space,并设为 4 空格;混用\t和空格会中断折叠识别 - 语言模式必须是
Python:右下角显示Plain text或Normal text时,def就是普通文本,不打任何 level 标签 - 折叠开关必须打开:Settings → Preferences → Language →
Enable folding for Python勾选(老版本默认关,新版默认开,但别假设)
Ctrl+Shift+F 折叠光标所在块,比 Alt+1 更准
想只收起当前函数体,Ctrl+Shift+F 是更直接的选择——它不看层级,只找光标所在位置最近的合法折叠起点和终点。
- 把光标放在
def行任意位置,按Ctrl+Shift+F,函数签名和整个函数体一起收起 - 光标放在
if行,就只收那个if块;放在for行,就只收那个for循环 - 如果没反应,说明该行没被识别为折叠起点:检查是否在
def行(不是空行或注释行)、语言是否正确、缩进是否合规 - 注意:
Ctrl+Shift+F和Ctrl+8不同——后者是全文件批量操作,前者是上下文感知的精准折叠
自定义语言标记是唯一可控方案
原生 Python 解析对“只留 def 行”支持有限,尤其面对配置段落、DSL 或混合格式时。Alt+1 无法强制把函数体标为 Level 2,但用户语言可以手动插入折叠锚点。
- Alt+T → 用户自定义语言 → 定义你的语言… → 勾选
Allow user defined folding points - 设开始标记为
/*{*/,结束标记为/*}*/(必须独占一行,前后无空格、无缩进) - 在
def行下方、函数体首行上方插入/*{*/,在函数体末尾下一行插入/*}*/ - 切换至此用户语言后,
Ctrl+8或鼠标点击即可折叠这两标记之间的全部内容
这个方法绕过语法解析,但代价明显:标记不嵌套、不保存状态、每次重启就重置。真需要稳定折叠控制,说明 Notepad++ 已经不是合适工具。











