VSCode标题自动编号必须依赖插件,Markdown All in One通过命令实时注入编号(如1.1.2),不修改源文件,仅作用于#~######标准标题,需手动运行“Update all headers”命令更新,导出时编号丢失属正常设计。

标题自动编号靠插件,不是靠设置开关
VSCode 自带的 Markdown 支持不提供标题自动编号功能,必须依赖插件。目前最稳定、维护活跃、开箱即用的是 Markdown All in One —— 它不依赖预览渲染引擎,也不改写源文件语法,而是通过命令实时注入编号(如 1.1.2),且支持多级联动更新。
常见错误现象:装了插件但右键没看到“添加/更新章节序号”;或点了没反应;或编号后导出 PDF 时消失。
- 确保已禁用冲突插件(如旧版
Markdown Preview Enhanced的编号脚本,它会干扰 DOM 注入逻辑) - 编号只作用于以
#~######开头的标准 ATX 标题,不识别 Setext 风格(===/---) - 编号是「视图层叠加」,不修改原始 .md 文件内容 —— 所以复制文本到其他编辑器时不会带编号
- 若文档含 HTML 标签(如
<div>)或 YAML frontmatter 后紧跟标题,可能打断解析上下文,导致首级标题未编号
配置 markdown.extension.toc.levels 影响编号范围
这个配置项表面看是控制目录生成深度,实际也决定标题编号的层级上限。默认值为 6,但如果你只希望编号到 ###(三级),设成 3 即可,更深层标题将不编号、不进 TOC、也不参与编号递推。
参数差异:
-
"markdown.extension.toc.levels": 3→ 编号#、##、###,####及以下无编号 -
"markdown.extension.toc.includeNotInToc": false(默认)→ 不在 TOC 中的标题也不会被编号 - 若设为
true,则即使标题被{:toc-hidden}排除,仍会被编号(需插件 v3.4+)
注意:该配置必须写在 VS Code 的 settings.json 中,UI 设置界面里搜不到它。
Markdown: Update all headers 命令才是关键操作
自动编号不是后台常驻服务,它是一次性命令触发的静态重写。每次结构调整(增删标题、拖动章节)后,必须手动运行该命令,否则编号不会自适应更新。
实操建议:
- 绑定快捷键:在
keybindings.json中加一条{"key": "ctrl+alt+h", "command": "markdown.extension.updateAllHeaders"} - 不要依赖保存自动触发 ——
Markdown All in One默认不监听保存事件做重编号(避免性能抖动) - 如果某次运行后部分标题漏编,检查是否混用了全角数字或中文标点(如
一、或1.),这些会被跳过 - 命令执行后,VS Code 状态栏右下角会短暂显示「Updated X headers」,没提示=没生效
导出时编号丢失?那是渲染器没读取插件注入
PDF / HTML 导出工具(如 Markdown Preview Enhanced 或 Typora)默认只解析原始 Markdown 文本,看不到 Markdown All in One 在编辑器内动态插入的编号。这是设计使然,不是 bug。
解决路径只有两条:
- 用插件自带导出:调用
Markdown All in One: Export to HTML命令,它会先执行一次编号注入,再渲染导出 - 用 Python 脚本预处理:运行类似
title_number.py这类工具,直接改写 .md 源文件,把编号固化进去(适合交付场景)
容易被忽略的一点:编号样式(如 1.1.2 还是 1.1.2.)由插件内部逻辑硬编码,无法通过 CSS 或配置修改 —— 如果需要自定义格式(例如加括号、换分隔符),只能走脚本方案。


















