默认不亮是因为Sublime只按scope高亮,不解析语义;需新建覆盖语法赋予TODO专属scope(如keyword.todo),再在color scheme中匹配该scope设置醒目样式。

TODO 为什么默认不亮?因为它根本没被语法识别为特殊标记
你在注释里写 TODO:,Sublime 默认只把它当普通文本——scope 是 comment.line.double-slash.js(或类似),和整行注释共享同一个颜色规则。它不会自动提升优先级,也不会触发任何高亮逻辑。这不是 bug,是设计:Sublime 的高亮系统不解析语义,只认 scope。
常见错误现象:
– 在 color scheme 里直接加 "name": "TODO" 规则,完全无效
– 修改 JavaScript.sublime-syntax 原文件,升级后被覆盖
– 用插件如 TodoReview,但只做搜索不改高亮,视觉上仍混在注释里
- 必须新建一个「覆盖语法」(override syntax),不碰系统语法包
- 目标不是“让 TODO 变红”,而是“让它带上专属 scope”,比如
keyword.todo.js - file_extensions 必须显式声明,比如
["js", "ts", "py", "html"],漏掉就不起作用
怎么写一个最小可用的 TODO 覆盖语法?
新建文件:Packages/User/TODO-Enhanced.sublime-syntax,内容如下:
%
%YAML 1.2
---
name: TODO Enhanced
file_extensions:
- js
- ts
- py
- html
- css
scope: source.todo-enhanced
contexts:
main:
- include: scope:source.js
- include: scope:source.python
- include: scope:text.html.basic
- include: scope:source.css
<h1>提升 TODO/FIXME/NOTE 行内出现时的 scope</h1>
- match: \b(TODO|FIXME|NOTE):?\b
scope: keyword.todo
push:
- meta_scope: comment.todo
- match: $|\n
pop: true
关键点:
–match用\b确保匹配单词边界,避免误中myTODO这类变量名
–scope: keyword.todo是你后续在配色方案里要引用的名字,必须唯一且易记
–push+pop是为了把高亮限制在当前词,不影响整行注释样式- 保存后,用
Ctrl+Shift+P→Set Syntax: TODO Enhanced手动切换一次,确认生效 - 再按
Ctrl+Shift+P→Developer: Show Scope Name,光标停在TODO:上,状态栏应显示类似keyword.todo source.js - 如果只看到
comment.line...,说明正则没命中——检查是否用了中文冒号、空格数不对,或 file_extensions 拼错
- 保存后,用
如何给 keyword.todo 配上真正醒目的颜色?
打开你的 color scheme 文件(通常在 Packages/User/YourTheme.sublime-color-scheme),在 rules 数组里加一条:
{
"name": "TODO highlight",
"scope": "keyword.todo",
"foreground": "#ff3860",
"font_style": "bold"
}
注意:
– scope 值必须和上面语法文件里写的 keyword.todo 完全一致(大小写、有无点号)
– 不要用 background,除非你真想加底色——多数主题已有注释背景,叠加反而难读
– font_style: "bold" 比单纯改颜色更抓眼球,尤其在深色主题下
- 改完保存,无需重启,高亮立刻生效(Sublime 会热重载 color scheme)
- 如果颜色没变,先确认语法文件已启用(右下角状态栏显示 “TODO Enhanced”)
- 别在
Monokai.sublime-color-scheme这类原生主题里硬改——下次更新会被覆盖,永远用User/下的副本
为什么不能只靠插件一键搞定?
像 TodoReview 或 SublimeTodo 这类插件,本质是用 Python 扫描全文、弹出列表、跳转定位——它们不参与语法解析,也不修改 scope。也就是说,你在编辑器里看到的 TODO: 依然是灰色/绿色注释色,只是“能搜到”而已。
真正的清晰工作流,需要视觉信号+操作信号双重反馈:一眼扫过去就发现 TODO,顺手 Ctrl+Click 就跳转,而不是先打开面板、再翻列表、再双击。前者是肌肉记忆,后者是认知负担。
容易被忽略的一点:
– 如果你用的是 Sublime Text 4,默认启用了 sublime-color-scheme 格式(JSON),但很多老教程给的是 tmTheme(XML)写法,混用会导致整套配色失效;
– keyword.todo 这个 scope 名字可以任意取,但一旦定下,所有相关文件(语法 + 配色)必须严格一致,错一个字符都不亮。











