Sublime默认TODO高亮不区分级别,因所有关键词共用同一正则、scope和样式;Highlight插件需手动配置多条互斥规则(如FIXME红色fill、TODO黄色fill、XXX橙色underline),并确保scope为comment、正则含、顺序由具体到宽泛。

为什么默认的TODO高亮不区分级别
Sublime 默认不识别 TODO、FIXME、XXX 甚至 HACK 的语义差异,所有匹配都走同一个正则、同一个 scope、同一种样式。Highlight 插件本身也不内置“优先级”概念——它只按配置顺序逐条匹配,且一旦某条规则命中,后续同位置的规则不会叠加生效(除非用不同 scope 或重叠区域)。
用多条 Highlight 规则实现分级高亮
核心是为不同关键词分配独立 name 和视觉样式,并确保正则互斥、scope 准确。例如让 FIXME 用红色背景、TODO 用黄色、XXX 用橙色下划线:
-
scope必须统一设为comment,否则会误匹配字符串或标识符中出现的单词 - 正则要加单词边界
,且 JSON 中需写成"\b"(双反斜杠) - 避免用
style: "outline",它在多数主题下渲染不可靠;"fill"或"underline"更稳 - 顺序很重要:把更具体的词(如
FIXME)放前面,防止被TODO的宽泛正则提前捕获
用户设置示例(Preferences → Package Settings → Highlight → Settings - User):
{
"highlights": [
{
"name": "fixme_highlight",
"scope": "comment",
"regex": "\b(FIXME)\b",
"style": "fill",
"color": "hsl(0, 100%, 85%)"
},
{
"name": "todo_highlight",
"scope": "comment",
"regex": "\b(TODO)\b",
"style": "fill",
"color": "hsl(48, 100%, 85%)"
},
{
"name": "xxx_highlight",
"scope": "comment",
"regex": "\b(XXX)\b",
"style": "underline",
"color": "hsl(24, 100%, 75%)"
}
]
}
为什么改了颜色却看不出区别
常见原因不是配置错,而是颜色被主题覆盖或渲染层级冲突:
- 某些 color scheme 显式设置了
comment的foreground,会盖过fill背景色——此时应改用underline或提高color的 alpha 值(如hsla(0,100%,85%,0.7)) - 如果文件用了自定义语法(如 Babel、Vue),其注释 scope 可能是
comment.line.double-slash.js而非通用comment,这时需把scope改成更精确的值,或用"scope": "comment, comment.line"多值匹配 - Sublime Text 4 对
fill渲染更稳定;ST3 在部分 GPU 驱动下可能出现闪烁或透明,可降级为solid_underline
进阶:用 scope 提升实现语义化分级
仅靠颜色不够?想让 FIXME 在 TodoReview 面板里排最前、或被 LSP 当作 error 级别上报,就得脱离 Highlight 插件,改用语法层提升:
- 新建
Packages/User/Enhanced-Comments.sublime-syntax - 在
contexts中添加 match 规则,把FIXME的 scope 设为keyword.other.fixme,TODO设为keyword.other.todo - 再在 color scheme 的
rules里分别定义这两个新 scope 的颜色 - 这样不仅高亮可控,还能被其它插件(如 TodoReview、LSP 客户端)识别为不同严重等级
真正难的从来不是配出颜色,而是让不同工具链对同一标记达成语义共识——Highlight 解决“看见”,语法提升解决“理解”。











