vscode中markdown标题颜色需通过editor.tokencolorcustomizations.textmaterules配置,作用域须手动用“inspect editor tokens and scopes”获取,如heading.2.markdown和punctuation.definition.heading.markdown,且h1–h6须分别精确配置,不可通配。

直接改 editor.tokenColorCustomizations 里的 textMateRules,别碰 workbench.colorCustomizations ——后者管界面,前者才管标题文字本身的颜色和样式。
怎么查到Markdown标题对应的作用域?
VSCode 不会直接告诉你 # 标题 属于什么语法范畴,必须手动“取色”确认。否则配了也白配,颜色根本不会生效。
- 打开任意一个 .md 文件,把光标停在某个标题上(比如
## 二级标题) - 按
Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(Mac),输入并选择Developer: Inspect Editor Tokens and Scopes - 看弹窗里
textMate scopes字段:正常情况下你会看到类似heading.2.markdown和punctuation.definition.heading.markdown这样的值 - 注意:不同 VSCode 版本或装了 Markdown 插件(如 Markdown All in One)后,作用域可能略有差异,
heading.2.markdown是主流,但有些环境只认markup.heading.setext.markdown(用于 === 分隔线式标题)
配置 textMateRules 时最常踩的三个坑
写完 JSON 看不到效果?大概率栽在这几处。不是配错了颜色,而是规则没命中。
-
scope值必须完全匹配,不能少逗号、不能拼错大小写,比如写成heading.2.markdwon就彻底失效 - 别漏掉标点符号作用域:
punctuation.definition.heading.markdown控制#符号本身颜色,如果只配了标题文字,#还是灰的,视觉割裂 - 多个规则之间没有隐式继承,H1/H2/H3 必须分别写,不能用通配符(如
heading.*.markdown不生效) - 如果用了第三方主题(比如 One Dark Pro),部分主题会覆盖 token 颜色,此时需在
textMateRules中显式指定该主题名作为外层 key(见下一条)
为什么 H1 颜色生效了,H3 却还是默认色?
常见原因是作用域不全,尤其三级及以下标题容易被忽略。VSCode 对 ### 到 ###### 的识别依赖语言模式是否完整启用,且某些旧版插件会降级处理。
- 确保每个级别都单独配置,例如:
{ "name": "Markdown H3", "scope": ["heading.3.markdown", "punctuation.definition.heading.markdown"], "settings": { "foreground": "#a7c957", "fontStyle": "bold italic" } } - 如果仍无效,打开命令面板执行
Markdown: Toggle Preview,再切回编辑器——有时预览模式会触发语言服务器重载,补全缺失的作用域识别 - 检查是否启用了
markdown.extension.grammars.enabled(在设置里搜),禁用它可能导致低级别标题无法被正确标记
深色主题下标题颜色对比度不够怎么办?
不是随便挑个亮色就行。深背景(如 #1e1e1e)上用浅灰(#888)标题,实测对比度只有 3.2:1,远低于 WCAG AAA 级推荐的 7:1,长时间阅读极易疲劳。
- 优先选带饱和度但不刺眼的色值,例如
#4cc9f0(青蓝)、#a7c957(灰绿)、#f72585(柔粉),避开纯白#ffffff和高饱和红#ff0000 - 用命令行验证对比度:
wcag-contrast #4cc9f0 #1e1e1e --format=ratio,确保 ≥6.5(接近 AAA) - 加
fontStyle: "bold"比单纯提亮更有效——粗体本身就能增强视觉权重,比硬调高亮度更护眼
真正难的不是写几行 JSON,而是让每级标题在各种主题、各种插件组合下都稳定命中作用域;一旦配好,后续所有 Markdown 文件自动生效,但第一次排查作用域的过程没法跳过。











