MarkdownTOC生成深度嵌套标题时报RecursionError,因Python默认递归深度限制被突破;解决方法是配置"max_depth": 5和"base_level": 1,并确保语法模式为MarkdownEditing。

MarkdownTOC生成深度嵌套标题时报RecursionError
当你的 Markdown 文件里出现连续 6 层以上标题(比如 ###### 这是六级标题),MarkdownTOC 默认解析器会因递归过深触发 Python 的 RecursionError: maximum recursion depth exceeded,表现为命令无响应、目录空白或 Sublime 控制台报错。
这不是插件 bug,而是 Python 解释器对嵌套调用的默认保护机制。MarkdownTOC 使用正则和递归下降解析标题结构,未显式限制层级深度,遇到极端嵌套就容易越界。
- 确认是否真有超深标题:用
Ctrl+F搜索######,检查是否存在人工误写或自动生成的冗余标题 - 临时绕过:在命令面板中执行
MarkdownTOC: Insert/Update前,先把文件里所有######及更深的标题手动降级为##### - 根本解法是改插件配置——打开
Preferences → Package Settings → MarkdownTOC → Settings – User,添加:
{
"max_depth": 5,
"base_level": 1
}
"max_depth": 5 表示只处理最多 5 级标题(即从 # 到 #####),超出的自动忽略;"base_level": 1 避免因 base_level 设置过大(如设成 3)导致原本的 ### 被当作一级,进一步放大嵌套层级计算压力。
中文标题含 emoji 或特殊符号时 TOC 生成失败
例如 ## ? 部署流程 或 ### API (v2.1) 这类标题,在默认 slugify 模式下可能生成非法 URL 片段,导致解析中断、目录为空或控制台报 UnicodeEncodeError。
MarkdownTOC 的 slugify 逻辑依赖 Python 的 unicodedata 和正则清洗,但某些 emoji 或括号组合会破坏正则匹配边界,尤其在 slugify_mode: "github" 下更敏感。
- 最简验证:把出问题的标题临时改成纯 ASCII,比如
## bu-shu-liu-cheng,再试一次MarkdownTOC: Insert/Update—— 如果成功,基本锁定是字符兼容性问题 - 推荐配置组合(写入 User Settings):
{
"slugify": true,
"slugify_mode": "github",
"slugify_extensions": ["md"]
}
"slugify_extensions" 显式限定只对 .md 文件启用 slugify,避免影响其他类型文件;"github" 模式比默认 "default" 更鲁棒,能更好处理 emoji 和常见标点(如括号、斜杠),但依然不支持零宽空格、BOM 头等隐藏字符。
如果仍失败,用 Sublime 的 Ctrl+Shift+P → Convert Indentation → Convert Line Endings to Unix 清理换行符,并确保文件编码是 UTF-8(右下角状态栏应显示 UTF-8,不是 UTF-8 with BOM)。
TOC 插入后列表缩进错乱、层级塌陷
生成的目录看起来像平铺列表,所有条目顶格对齐,没有按实际标题层级缩进(比如 ### 子节 应该比 ## 主节 多缩进两个空格,但实际没体现),常见于启用了 base_level 却没同步调整缩进参数的情况。
MarkdownTOC 默认用 2 个空格缩进每级,但它不自动感知你设置的 base_level。例如你设了 "base_level": 3,希望 ### 当作一级,那 #### 就该缩进 2 空格、##### 缩进 4 空格——但插件不会自动推导这个偏移量。
- 必须手动配
"indent_type": "space"和"indent_size": 2(默认值,但显式写出更稳妥) - 关键参数是
"list_indent":它定义“视觉缩进起点”,默认为 0;若你设"base_level": 3,建议设"list_indent": 2,这样第一级(原###)前面有 2 空格,第二级(原####)就有 4 空格,符合预期 - 别混用 tab 和 space:确保 Sublime 的
Convert Indentation设为Indent Using Spaces,否则混合缩进会让渲染器解析失败
安装后快捷键无效或命令面板搜不到 MarkdownTOC
不是插件没装上,而是 Sublime 没识别到当前文件是 Markdown 类型——插件只在语法模式为 Markdown(来自 MarkdownEditing)时才激活命令。
右下角状态栏显示 Plain text 或 Markdown(系统自带)时,MarkdownTOC 的命令根本不会注册,按快捷键没反应、命令面板也搜不到。
- 先确认已安装
MarkdownEditing(不是Markdown Preview或Markdown),且没被禁用 - 打开一个
.md文件,点击右下角语法名 →Open all with current extension as → MarkdownEditing → Markdown - 检查是否残留系统自带语法配置:打开
Preferences → Settings – Syntax Specific,删掉类似"syntax": "Packages/Markdown/Markdown.sublime-syntax"的行 - 重启 Sublime:插件加载顺序依赖语法包就绪,不重启的话即使重装 MarkdownTOC 也可能不生效
真正卡住的地方往往不是 TOC 本身,而是 MarkdownEditing 没接管文件类型——很多用户装了 TOC 却忘了配底层语法,结果在错误前提下调试参数,越调越乱。











