notepad++自定义语言需手动启用折叠点支持:勾选“allow user defined folding points”,标记须独占行首、区分大小写、无空格/注释符,且不支持嵌套;全局折叠开关、正确语言模式及行号边距也必须开启。

自定义语言必须手动启用折叠点支持
Notepad++ 的用户自定义语言(UDL)默认不带任何折叠逻辑,哪怕你写了 if、def 也完全不会触发折叠。关键一步是:新建 UDL 后,必须在「Define your language」对话框里勾选 Allow user defined folding points——这个选项不勾,后面所有设置都无效。
勾选后,折叠行为就只认你指定的开始/结束标记,不再依赖语法关键字或缩进。它不分析语义,只做纯文本匹配。
- 标记必须独占一行,前后不能有空格、制表符或任何其他字符
- 开始标记和结束标记内容区分大小写,且不能包含注释符号(如
//或#) - 不支持嵌套:若出现
/*{*/→/*{*/→/*}*/→/*}*/,第二对会错位,只折到第一个/*}*/ - 标记本身不参与语法高亮,建议用易识别但不干扰阅读的格式,比如
/// FOLD: section_name+/// END_FOLD
折叠标记怎么写才被识别
Notepad++ 对标记的匹配极其严格:它要求开始标记和结束标记都必须出现在行首(即第一个非空白字符就是标记),且整行不能有其他内容。例如:
/*{*/
[database]
host = localhost
/*}*/
上面这段能折叠;但下面这些都不行:
-
/*{*/(前面有空格) -
/*{*/ [database](同行有其他内容) -
/*{*/\u200B(末尾带零宽空格) -
/* { */(空格插入在标记内部)
验证方式:打开 View → Show Symbol → Show All Characters(Ctrl+Shift+P),确保标记行只有可见字符和换行符。
折叠功能启用后仍不显示 +/- 图标
即使 UDL 设置正确、标记合规,图标也可能不出现——常见原因有三个:
-
Settings → Preferences → Editor → Code folding → Enable code folding没勾选(这是全局总开关,必须开) - 当前文件没切换到你刚定义的 UDL:右下角语言名必须显示为你命名的自定义语言名,不是
Normal text或Plain text - 侧边栏未启用行号区域:
View → Margin → Show line number margin必须开启,否则折叠图标无处渲染
改完设置后,已打开的文件需执行 File → Reload from disk 才能刷新折叠状态,重启 Notepad++ 不是必须的。
折叠快捷键在自定义语言下是否有效
是的,但仅限于基于标记的折叠。所有标准快捷键照常工作:
-
Ctrl+8:折叠所有已识别的标记块(即所有/*{*/~/*}*/区间) -
Ctrl+Shift+F:只折叠光标所在行所属的最内层标记块(光标必须落在开始标记行或其内容区内) -
Ctrl+Shift+D:展开光标所在位置的最内层块
注意:Ctrl+Alt+[ 和 Ctrl+Alt+] 这类“同级折叠”快捷键对 UDL 无效,它们依赖语言内置的层级解析,而 UDL 只提供扁平标记。
标记一旦写入,折叠状态每次重启都会丢失——这不是配置问题,是 Scintilla 引擎的设计限制。如果你需要持久化折叠或嵌套结构识别,说明当前场景已超出 Notepad++ 的能力边界。











