根本原因是未限定作用域,regex匹配纯文本而不区分上下文;必须将scope设为comment(如comment.line.double-slash),并用\b确保词边界,style选fill才可精准高亮注释中的TODO/FIXME。

为什么TODO在字符串或变量名里也被高亮了?
根本原因是没限定作用域,regex 匹配的是纯文本,不区分上下文。比如 log.TODO、"TODO: fix later"、TODO_LIST 全都会中招。
必须把 scope 设为 comment,才能确保只匹配注释内容。Highlight 插件靠这个字段过滤语法作用域,不是靠正则“猜”哪里是注释。
-
scope值必须是合法的 scope 名,常见值有comment、comment.line.double-slash、comment.block;用错(比如写成comments或漏掉)会导致规则完全不生效 -
regex中的在 JSON 里要写成\b,否则会被解析为退格符,正则失效 - 如果项目混用多种语言(JS/Python/Shell),建议分别指定 scope,例如 Python 注释用
comment.line.number-sign,Shell 用comment.line.hash
Highlight 插件配置怎么写才真正生效?
装完插件后,直接改 Preferences → Package Settings → Highlight → Settings - User,填入以下结构即可,不用重启:
{
"highlights": [
{
"name": "todo-fixme",
"scope": "comment",
"regex": "\b(TODO|FIXME)\b",
"style": "fill",
"color": "hsl(48, 100%, 85%)"
}
]
}
关键点:
-
style推荐用fill而非underline,后者在深色主题下几乎不可见 -
color值支持hsl()、#rrggbb、hsla(),但不支持rgb()(新版 Sublime 已弃用) - 别往
Settings - Default里改——那是只读文件,改了也无效
TodoReview 插件为啥配了 keywords 却没颜色?
因为 TodoReview 本身不控制颜色,它只负责扫描并生成 scope(如 keyword.other.todo),最终显不显色,全看当前 color_scheme 文件里有没有定义这个 scope 的样式。
多数轻量主题(如 Monokai Soda、ayu)根本没声明 keyword.other.todo,所以你看到的还是默认灰色注释色。
- 验证方法:打开
Preferences → Color Scheme,换用Monokai或Ayucia,立刻能看到颜色变化 - 不想换主题?那就别指望 TodoReview 驱动高亮,老实用 Highlight 插件覆盖
- 非要硬刚:得在
.sublime-color-scheme的rules数组里手动加一条:{"scope": "keyword.other.todo", "foreground": "#ffcc00"}
临时查找 TODO 用内置 Find 就够了,但要注意边界
按 Ctrl+F,输入 (TODO|FIXME),勾选正则(.* 图标),点 Find All —— 这是最轻量、零依赖的方案。
但注意:不加 边界符,TODO 会连带匹配 TODOX、NOT_TODO、user_todo_flag。
- 安全写法是:
(TODO|FIXME)(同样要在 Find 框里输双反斜杠:\b(TODO|FIXME)\b) - 想只搜行首注释?用
^\s*//\s+(TODO|FIXME)\b,避免匹配到const TODO = true这类代码行 - 大文件慎用
.*或.:Sublime 正则引擎对回溯不优化,容易卡住
最稳的路径就一条:装 Highlight,scope 锁死 comment,regex 加 \b,style 选 fill。其他所有绕路方案,要么依赖主题兼容性,要么得手写 color_scheme 规则——而这两者恰恰是最容易被忽略、也最难调试的部分。











